Lnmp中nginx經常出現502錯誤解決方法

2021-07-13 20:35:52 字數 3579 閱讀 3101

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...