nginx 502多半的原因是資源不足或nginx配置的一些問題導致的,下面我來給提供了乙個利用nginx輪詢php服務池狀態然後進行相關處理,希望例子能幫助你解決問題。
先從fastcgi配置入手:
1.檢視fastcgi程序是否已經啟動nginx 502錯誤的含義是sock、埠沒被監聽造成的。我們先檢查fastcgi是否在執行
2.檢查系統fastcgi程序運**況除了第一種情況,fastcgi程序數不夠用、php執行時間長、或者是php-cgi程序死掉也可能造成nginx的502錯誤執行以下命令判斷是否接近fastcgi程序,如果fastcgi程序數接近配置檔案中設定的數值,表明worker程序數設定太少
1.fastcgi程序是否已經啟動
2.fastcgi worker程序數是否不夠
執行 netstat -anpo | grep 「php-cgi」 | wc -l 判斷是否接近fastcgi程序,接近配置檔案中設定的數值,表明worker程序數設定太少
3.fastcgi執行時間過長
根據實際情況調高以下引數值
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
4.fastcgi buffer不夠
nginx和apache一樣,有前端緩衝限制,可以調整緩衝引數
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
5.proxy buffer不夠
如果你用了proxying,調整
proxy_buffer_size 16k;
proxy_buffers 4 16k;
6.https**配置錯誤
檢查下php-fpm的程序數使用情況:
**如下
複製**
netstat -napo |grep "php-cgi" | wc -l
如果這個查詢出來的數量超過了php-fpm.conf裡設定的數量,說明是程序數量不夠用,可以適當增加。
也可能是php程式執行時間過長造成超時,如果是這個問題,可以通過修改nginx.conf和php-fpm.conf裡面相關的超時設定來解決
nginx.conf裡面主要是如下
**如下
複製**
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
php-fpm.conf裡如要是如下
request_terminate_timeout 設定為0s或者比目前時間更長,0s表示無限制,一直執行下去。
還可能是fastcgi快取不夠,主要是在nginx.conf配置裡修改如下引數:
**如下
複製**
fastcgi_buffer_size 128
fastcgi_buffers 8 128k;
fastcgi_busy_buffers_size 256k
另外還有注意系統各方面的限制ulimit -a檢視一下。
一般上面幾個地方做合適的優化,會有較明顯的效果。
最後的解決方法:nginx輪詢php服務池避免502
既然上面的常規辦法不能解決,那就得想其他辦法了。502引起肯定是因為php-fpm引發的,也就是nginx將正確的客戶端請求發給了後端的php-fpm程序,但是因為php-fpm程序的問題導致不能正確解析php**。最終返回給了客戶端502錯誤。nginx既然upstream可以支援多組後端伺服器輪詢實現簡單的負責均衡,並且可以做簡單的健康檢查,因為有了健康檢查機制,這樣就可以在錯誤到達客戶端前換另外乙個php-fpm程序重新解析了。那就用這個辦法開多組php-fpm服務來實現乙個php-fpm池,讓nginx在這個php-fpm資源裡通過stream輪詢。
使用不同埠或php-fpm.sock啟動多個php-fpm主程序的方法:
先修改php-fpm.conf來開啟多組php-fpm程序
以/usr/local/php/etc/php-fpm.conf為樣板,複製另外3個檔案出來,假設為php-fpm_fcbucom1.conf,php-fpm_fcbucom2.conf,php-fpm_fcbucom3.conf;原有的php-fpm.conf不動,作為備份吧。
三個配置檔案中,需要修改的兩個地方是pid檔名和sock檔名,假設為/tmp/php-cgi_fcbucom1.sock , /tmp/php-cgi_fcbucom2.sock , /tmp/php-cgi_fcbucom3.sock (也可以設定不同的pool名字,預設是default)
執行命令使用不同的配置檔案啟動3個建立sock監聽的php-fpm主程序。
**如下
複製**
/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm_fcbucom1.conf
/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm_fcbucom2.conf
/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm_fcbucom3.conf
啟動之後,就在相應目錄(一般是/tmp/)出現php-cgi_fcbucom1.sock , php-cgi_fcbucom2.sock , php-cgi_fcbucom3.sock這3個sock檔案。
接下來修改nginx.conf配置
主要在http {} 的配置塊內,加入我們要使用的輪詢配置:
**如下
複製**
#注:fastcgi_next_upstream 不需要加http_502,也加不上去的,不支援。
這樣我們就建立了乙個可以根據健康狀況輪詢並可以重試的資源池。
接著修改我們**server配置,原來處理php**的fastcgi配置
**如下
複製**
location ~ .*.(php|php5)?$
或原來這樣
location ~ .*.(php|php5)?$
將其中的fastcgi_pass由原來的php-cgi.sock.sock單獨的php-fpm程序或127.0.0.1:9000修改為剛剛建立的fcbucom_php_servers輪詢池,如:
**如下
複製**
location ~ .*.(php|php5)?$
原有配置檔案的每段類似這種location ~ .*.(php|php5)?$ {**都需要對fastcgi_pass這行修改。
通過這樣的配置,可以肯定的是php-fpm因為採用3個資源池來輪詢工作,並且有fastcgi_next_upstream程序簡單的健康檢查,可以最大程度的避免502錯誤發生了。
最後重啟php-cgi和nginx。
面試中經常出現的演算法
面試中經常出現的演算法 面試中經常出現的演算法 2010 09 21 09 01 分類 面試題二分查詢的 int bfind int a,int len,int val else if a m val else return m return 1 沒有找到 寫出在母串中查詢子串出現次數的 int c...
SSAS中處理時經常出現的幾種錯誤
1.重複屬性鍵的錯誤 處理時找到重複的屬性鍵 當在 屬性關係 裡指定屬性關係後,就出出現此錯誤,因為不知道month值 1 並不知道是屬於哪一年的,所以需要,指定month的keycolumns,增加year 2.找不到屬性鍵 處理時找不到以下屬性鍵 表 dbo fact targetdata 列 ...
php fpm經常出現502解決方法
更多請支援 最近nginx經常502,解決502最好的辦法就是重啟php fpm。手動去重啟還是比較麻煩的事情,最好的就是扔到shell裡去。vim restart php fpm.sh bin sh service php fpm if ps ax grep v grep grep service...