問(wèn)題描述
一個(gè)Spring + Angular前后端分離的項(xiàng)目,使用Nginx進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)。
Nginx監(jiān)聽(tīng)端口8100,前臺(tái)端口4200,后臺(tái)端口8080。

像往常一樣,提前配置好MySQL、配置好Redis,引入項(xiàng)目的Nginx配置文件,然后啟動(dòng)前臺(tái)、后臺(tái),成功。
接下來(lái)出現(xiàn)了問(wèn)題:前臺(tái)發(fā)起的請(qǐng)求,只有極少數(shù)能被后臺(tái)接收到,大部分都是404,隨著在瀏覽器中的點(diǎn)擊,控制臺(tái)不斷的出現(xiàn)404。


如果只是404,那問(wèn)題就很簡(jiǎn)單,很大可能是Nginx端口轉(zhuǎn)發(fā)設(shè)置錯(cuò)了。但它的神奇之處就在于,還有那么幾次請(qǐng)求,是能到達(dá)后臺(tái)的。

(上圖中,顯示保存成功的時(shí)候,后臺(tái)確實(shí)輸出了相關(guān)的控制臺(tái)信息)
其他的小伙伴都沒(méi)有出現(xiàn)這個(gè)問(wèn)題,于是開(kāi)始排查。
排查過(guò)程
為了搞清楚是 后端 的問(wèn)題還是 Nginx 轉(zhuǎn)發(fā)的問(wèn)題,需要先從瀏覽器的NetWork中看一下這個(gè)404是后臺(tái)返回的還是Nginx返回的。

經(jīng)過(guò)查看,發(fā)現(xiàn)是Nginx返回的。如果是后臺(tái)返回的404,會(huì)把錯(cuò)誤信息寫(xiě)在HTTP請(qǐng)求頭中。
先查看監(jiān)聽(tīng)端口是否有沖突,使用nginx -T可以查看完整的Nginx配置文件,包括引入的外部文件。
// 測(cè)試配置文件是否正確,并輸出完整的配置文件
nginx -T

在輸出的結(jié)果中,只看到一個(gè)8100,說(shuō)明雖然引入了多個(gè)項(xiàng)目,但并沒(méi)有出現(xiàn)監(jiān)聽(tīng)端口沖突。
然后筆者打算從Nginx日志中尋找一些蛛絲馬跡。
開(kāi)啟Nginx的日志模式之后,查看日志文件,發(fā)現(xiàn)了上千條訪問(wèn)記錄

大多數(shù)都是404,少數(shù)是200,但日志并沒(méi)有提供什么有用的信息。
最終,還是在配置文件中發(fā)現(xiàn)了問(wèn)題:
使用HomeBrew安裝的Nginx,它的全局配置文件中,默認(rèn)的監(jiān)聽(tīng)端口就是8080,而項(xiàng)目后端占用的端口也是8080。

雖然對(duì)于端口監(jiān)聽(tīng)和端口占用的原理不是很了解,至少可以知道,由于Nginx監(jiān)聽(tīng)了8080端口,有一部分請(qǐng)求被發(fā)到了Nginx自己那里,另一部分才是發(fā)送到后臺(tái)。
所以,修改全局配置文件,改掉默認(rèn)端口,問(wèn)題解決。

// 修改配置文件
sudo vim /usr/local/etc/nginx/nginx.conf
// 測(cè)試配置文件
nginx -t
// 重啟Nginx
nginx -s reload
終于,所有的請(qǐng)求都能達(dá)到后臺(tái)了。

總結(jié)
在一開(kāi)始學(xué)習(xí)XAMPP的時(shí)候,就經(jīng)常聽(tīng)到:“如果80端口沖突,就把端口改掉,比如改成8080”。
可是當(dāng)8080成為了我們的習(xí)慣之后,有些項(xiàng)目也會(huì)使用這個(gè)端口...因此就要解決沖突問(wèn)題了。
以后更改默認(rèn)端口的時(shí)候,建議改成一個(gè)不可能用到的端口,比如10000以上的端口號(hào),避免和項(xiàng)目的端口產(chǎn)生沖突。
到此這篇關(guān)于解決Nginx端口沖突的排查方法示例的文章就介紹到這了,更多相關(guān)Nginx端口沖突的排查方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!