工做中常常會碰到502 Bad Gateway和504 Gateway Time-out錯誤,下面以Nginx+PHP-FPM來分析下這兩種常見錯誤的緣由和解決方案。php
當出問題後不要慌張,首先查看日誌,跟進報錯error來定位問題點,查看最近變動文件,查看端口及網絡是否正常,排出病毒×××等,而後根據nginx--php--mysql等交互原理,進行逐一排查,處理問題,原理圖以下:
mysql
1,iptables 防火牆策略,是否有阻止端×××互 2,nginx 對日誌目錄是否有讀寫權限,訪問超時 3,php運行較慢,並超出php-fpm.conf的request_terminate_timeout設置的秒數」max_children」 4,nginx服務器的併發鏈接數超過了其承載量,netstat -an 查看流量狀況 5,瀏覽器是否開啓代理 6, 磁盤空間緣由: 磁盤空間不足,如mysql日誌佔用大量空間清理一下磁盤上的文件,有部分剩餘空間,重啓便可恢復。 7,程序運行緣由: 查看php-cgi或php-fpm進程是否在運行 8,調優不當緣由: 將nginx.conf裏的 fastcgi_connect_timeout fastcgi_send_timeout fastcgi_read_timeout都調大一點。 9,phpcgi進程不足緣由 在安裝好使用過程當中出現502問題,通常是由於默認php-cgi進程是5個,可能由於phpcgi進程不夠用而形成502,須要修改/usr/local/php/etc/php-fpm.conf 將其中的max_children值適當增長,若是php已升級到5.3.*以上且使用的是dynamic模式,須要調整pm.max_spare_servers參數的值。 也有多是max_requests值不夠用。
PHP-FPM設置的腳本最大執行時間已經夠長了,但執行耗時PHP腳本時,發現Nginx報錯從502變爲504了。這是爲何呢?
由於咱們修改的只是PHP的配置,Nginx中也有關於與上游服務器通訊超時時間的配置factcgi_connect/read/send_timeout。nginx
以Nginx超時時間爲90秒,PHP-FPM超時時間爲300秒爲例,報504 Gateway Timeout錯誤時的Nginx錯誤訪問日誌以下:sql
2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "test.com", referrer: "http://test.com/index.php"
調高這三項的值(主要是read和send兩項,默認不配置的話Nginx會將超時時間設爲60秒)以後,504錯誤也解決了。
並且這三項配置能夠配置在http、server級別,也能夠配置在location級別。擔憂影響其餘應用的話,就配置在本身應用的location中吧。
要注意的是factcgi_connect/read/send_timeout是對FastCGI生效的,而proxy_connect/read/send_timeout是對proxy_pass生效的。瀏覽器
配置舉例: location ~ \.php$ { root /home/cdai/test.com; include fastcgi_params; fastcgi_connect_timeout 180; fastcgi_read_timeout 600; #讀取超時時間 fastcgi_send_timeout 600; #通訊超時時間 fastcgi_pass unix:/dev/shm/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/cdai/test.com$fastcgi_script_name; }