最近公司項目採購系統已經開發的差很少了,同事測試完了以後讓我幫忙部署,jar包搞上docker後,在同事配置nginx的時候出現了問題。html
除了nginx配置的時候除了域名不同,其餘的則所有一致,這個時候訪問的時候,卻跳到另外一個項目的頁面去。nginx
即好比要訪問c.company.com,卻跳到a.company.com的頁面去,雖然域名仍是c.company.com。docker
百思不得其姐,先用./nginx -t 檢查了一下配置是否出問題,結果沒有錯。測試
而後./nginx -s reload 後,查了下nginx的錯誤日誌發現:日誌
2019/11/29 13:47:35 [notice] 19479#0: signal process started 2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use) 2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use) 2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use) 2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use) 2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use) 2019/11/29 13:47:35 [emerg] 3048#0: still could not bind()
發現9000這個端口綁定失敗。
這個端口號是一個服務的端口,怎麼跟nginx扯上關係了呢?code
其實由於一開始沒先看日誌,由於配置都是跟測試環境保持一致的,不知道什麼緣由致使了跳轉根目錄失敗:htm
好比a.company.com的根目錄是/a,
c.company.com的根目錄是/c,在我要訪問c.company.com的時候,經過nginx日誌看到訪問的路徑是:/a/index.html這樣的目錄。ssl
爲何會出現這種問題呢?開發
其實就跟上面這個端口有關係。在個人nginx的conf.d目錄中,有3個配置文件 :部署
a.conf b.conf c.conf
其中c.conf就是新項目的配置,上面出現的端口綁定失敗是在b.conf中,其中的ssl配置出了問題,不知爲什麼不是配的443,而是9000。在將其修改爲443以後就能夠正常訪問了。
總結一下修改後就恢復正常的緣由:
1.由於配置的語法沒有問題,因此使用./nginx -t 是檢測不出來問題的。
2.由於配置端口錯誤是在b.conf中,因此b.conf只是不能使用https,並不影響http使用,因此一直沒有發現問題
3.之因此訪問c.company.com會跳轉到a.company.com的頁面去,我猜是由於b.conf出了問題,nginx不能正確的加載下一個配置文件,由於a.company.com和c.company.com的域名解析都是在這同一臺主機上,DNS解析的時候解析到當前主機,卻不能正確的找到c.conf這個配置,因此只能默認加載到第一個配置文件a.conf上,致使出現訪問c卻跳到a的登錄頁面去。
nginx在加載配置的時候應該是按順序加載進來,一旦某個配置文件有問題,將會致使下面要加載的配置文件不能正確加載。
若有問題,歡迎討論( •̀ ω •́ )y