最近自己在阿里雲購買有段時間的服務器,一訪問就出現nginx 504 Gateway Time-out。
想起以前是可以訪問的,細想最近改動的配置應該不會涉及到這塊啊。
就網上各種百度谷歌,最后終於找到解決辦法,這里記錄一下。
Nginx 504 Gateway Time-out的含義是所請求的網關沒有請求到,簡單來說就是沒有請求到可以執行的PHP-CGI。
nginx.conf配置如下:
1 location ~ \.php$ { 2 root html; 3 fastcgi_pass 127.0.0.1:9000; 4 fastcgi_index index.php; 5 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 6 include fastcgi_params; 7 }
查看80端口使用情況,一切正常:
再看9000端口,顯示沒有被占用,說明nginx配置沒起作用:
從網上查詢得知,Nginx和PHP-FPM的進程間通信有兩種方式,一種是TCP,一種是UNIX Domain Socket,而我當前用的是第一種。
其中TCP是IP加端口,可以跨服務器.而UNIX Domain Socket不經過網絡,只能用於Nginx跟PHP-FPM都在同一服務器的場景.用哪種取決於你的PHP-FPM配置:
方式1:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
方式2:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
其中php-fpm.sock是一個文件,由php-fpm生成
UNIX Domain Socket可用於兩個沒有親緣關系的進程,是目前廣泛使用的IPC機制,比如X Window服務器和GUI程序之間就是通過UNIX Domain Socket通訊的.這種通信方式是發生在系統內核里而不會在網絡里傳播.UNIX Domain Socket和長連接都能避免頻繁創建TCP短連接而導致TIME_WAIT連接過多的問題.對於進程間通訊的兩個程序,UNIX Domain Socket的流程不會走到TCP那層,直接以文件形式,以stream socket通訊.如果是TCP Socket,則需要走到IP層,對於非同一台服務器上,TCP Socket走的就更多了。
UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地回環):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位於不同服務器):
Nginx <=> socket <=> TCP/IP <=> 物理層 <=> 路由器 <=> 物理層 <=> TCP/IP <=> socket <=> PHP-FPM
再看php-fpm.conf中配置,果然也是在監聽9000端口:
listen = 127.0.0.1:9000
現在要做的是更改nginx.conf的配置,並新增fastcig_buffers更新request到來時nginx設置的緩沖區大小:
location ~ \.php$ { root html; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_index index.php; fastcgi_buffers 4 128K; fastcgi_buffer_size 128K; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
同時將php-fpm.conf中配置修改:
;listen = 127.0.0.1:9000 listen = /tmp/php-fpm.sock
分別重啟nginx和php-fpm后,輸入地址回車,久違的echo輸出終於出現:
配置更改調試主要參考一下鏈接:
https://blog.csdn.net/ucmir183/article/details/80240112
http://blog.51cto.com/13447608/2166462
https://www.cnblogs.com/php-linux/p/5962561.html