LNMP 502報錯 總結及處理方法

工做中常常會碰到502 Bad Gateway和504 Gateway Time-out錯誤,下面以Nginx+PHP-FPM來分析下這兩種常見錯誤的緣由和解決方案。php

一、502 Bad Gateway錯誤

LNMP 502報錯 總結及處理方法

當出問題後不要慌張,首先查看日誌,跟進報錯error來定位問題點,查看最近變動文件,查看端口及網絡是否正常,排出病毒×××等,而後根據nginx--php--mysql等交互原理,進行逐一排查,處理問題,原理圖以下:
LNMP 502報錯 總結及處理方法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值不夠用。

二、504 Gateway Time-out錯誤

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;
     }
相關文章
相關標籤/搜索