nginx訪問不到
今天,一朋友的一台linux服務器上部署了nginx,但是外部(公網)就是不能訪問,於是協助其排查。整體思路如下:
1、確認nginx配置是否ok。
2、確認網絡是否可達。
3、是否受防火牆安全控制等。
4、排除以上原因之后,遠程實際再測試。
那么開始排查:
1、確認nginx配置是否ok。
1.1、檢查nginx的配置。
發現有報錯
2013/11/13 15:35:09 [emerg] 7739#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
netstat -lanp|grep 80
原來有httpd進程(apache),關閉之
1.2本機是否可以訪問(公網ip)
本機curl http://12x.xx.x.xx/ 發現是ok的,日志正常打印(access.log有滾動)
2、確認網絡是否可達
telnet 12x.xx.x.xx 80
Trying 12x.xx.x.xx...
Connected to 12x.xx.x.xx.
Escape character is '^]'.
這樣就說明網絡上可達,並且TCP三次握手可以完成,因為能telnet通,排除了網絡不通的情況
。
3、是否受防火牆安全控制等。
將iptables和selinux關閉
以下4條命令清除iptables的配置
iptables -F
iptables -F -t nat
iptables -X
iptables -X -t nat
setenforce 0 #關閉selinux
4、遠程訪問再次確認和推論
4.1遠程使用瀏覽器訪問,不能訪問。。。
4.2服務器日志沒有滾動
4.3基於4.1和4.2,結論是請求沒有到nginx,但是根據,2、網絡是可達的。
似乎矛盾出來了:網絡可達,但是80端口的請求就確實沒有到nginx。。實際上,網絡的可達,或者說telnet能痛,只說明TCP三次握手是ok的,但是流量器不能訪問,說明http數據傳輸受影響。所以,初步判斷,是給服務器之前的“某個網絡設備”過濾了。
4.4telnet 之后,直接輸入GET /,發現頁面能傳輸回來,但是輸入了GET / HTTP/1.1就會被卡死,無任何數據反饋。於是就比較懷疑是服務器之前的“某個網絡設備”過濾了(專門過濾http數據)。
5、我們修改了nginx的監聽的端口為8080,發現訪問正常了:無論是瀏覽器還是telnet之后輸入GET / HTTP/1.1都ok
和網絡工程師聊了。一般運營商不會過濾80端口的(就算沒有icp,一般也不會封)
【結論】:應該還是在應用層上出問題了,服務器之前的“某個網絡設備”過濾了
經驗教訓:
1、排查網站不能訪問故障基本思路:內到外一層一層測試,並且要測試網絡是否可達,為了便於解決問題,最好將服務器的selinux防火牆關閉。
2、在我大中華地區,icp備案還是得加上。