很多新手剛開始做網(wǎng)站可能感覺不到502,504的問題,當?shù)饶憔W(wǎng)站到達了一定水平的時候,流量起來的時候,你會發(fā)現(xiàn)經常會遇到502、504類似的問題。
一、什么是502狀態(tài)碼?
502 Bad Gateway:作為網(wǎng)關或者代理工作的服務器嘗試執(zhí)行請求時,從上游服務器接收到無效的響應。
二、502 Bad Gateway 原因一般有哪些?
將請求提交給網(wǎng)關如php-fpm執(zhí)行,但是由于某些原因沒有執(zhí)行完畢導致php-fpm進程終止執(zhí)行。這個問題與網(wǎng)關服務如php-fpm的配置有關。
php-fpm.conf配置文件中有兩個參數(shù)就需要你考慮到,分別是max_children和request_terminate_timeout。
max_children最大子進程數(shù),在高并發(fā)請求下,達到php-fpm最大響應數(shù),后續(xù)的請求就會出現(xiàn)502錯誤的??梢酝ㄟ^netstat命令來查看當前連接數(shù)。
request_terminate_timeout設置單個請求的超時終止時間。還應該注意到php.ini中的max_execution_time參數(shù)。當請求終止時,也會出現(xiàn)502錯誤的。
當積累了大量的php請求,你重啟php-fpm釋放資源,但一兩分鐘不到,502又再次呈現(xiàn),這是什么原因導致的呢? 這時還應該考慮到數(shù)據(jù)庫,查看下數(shù)據(jù)庫進程是否有大量的locked進程,數(shù)據(jù)庫死鎖導致超時,前端終止了繼續(xù)請求,但是SQL語句還在等待釋放鎖,這時就要重啟數(shù)據(jù)庫服務了或kill掉死鎖SQL進程了。
三、什么是504狀態(tài)碼?
504 Gateway Time-out:作為網(wǎng)關或者代理工作的服務器嘗試執(zhí)行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應。
四、504 Gateway Time-out 原因一般有哪些?
504錯誤一般是與nginx.conf 配置有關。主要與以下幾個參數(shù)有關:
fastcgi_connect_timeout
fastcgi_send_timeout
fastcgi_read_timeout
fastcgi_buffer_size
fastcgi_buffers
fastcgi_busy_buffers_size
fastcgi_temp_file_write_size
fastcgi_intercept_errors
特別是前三個超時時間。如果fastcgi緩沖區(qū)太小會導致fastcgi進程被掛起從而演變?yōu)?04錯誤。
五、關于PHP+Nginx經常出現(xiàn)502、504的解決方法
由于不同的原因,解決方法也是不一樣的,一定要根據(jù)實際的情況去分析。例如,以下是我以前遇到的502的相關問題。
1、Nginx 502 Bad Gateway 原因與解決方法
2、Nginx報錯:upstream timed out (110: Connection timed out) 原因與解決方法
今天重點說下我遇到504問題的解決方法。
由于我用的是PHP+Nginx+百度云加速CDN,然后,百度云加速CDN一直給我報504錯誤,我排查了很多也沒有找到原因。
1、最初我以為修改nginx.conf,增加如下“error Connection timed out and 504 error”的代碼可以解決這個問題。
[root@localhost /]# vim nginx.confserver { listen 80;
server_name zabbix.gree.com;
access_log /roobo/logs/nginx/zabbix.gree.com_access.log main;
error_log /roobo/logs/nginx/zabbix.gree.com_error.log error ;
root /roobo/webserver/zabbix; index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi.conf;
fastcgi_pass 10.7.19.195:9000;
}
#error Connection timed out and 504 error
large_client_header_buffers 4 16k;
client_max_body_size 30m;
client_body_buffer_size 128k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 64k;
fastcgi_temp_file_write_size 64k;
}
經過測試,并沒有任何效果。
2、我又自信的以為是我用了FirewallD防火墻的原因,結果我關閉它,測試也沒有效果,照樣報504錯誤。
3、最后當再出現(xiàn)504錯誤的時候,我直接暴力操作,殺死php-fpm,再重啟,就可以恢復正常,從而我判斷是php的問題。經過我的排查,發(fā)現(xiàn)是“pm.max_requests”這個參數(shù)的問題,我最初設置的是204000,現(xiàn)在設置的是20400即可恢復正常,沒有再出現(xiàn)504錯誤了,平均負載 Load Average也在正常的范圍類。
4、但是過一段時間后,又會出現(xiàn)“504連接超時”這個問題。
5、最終,經過我?guī)滋斓臏y試,我最終php-fpm.conf參數(shù)調整如下即恢復正常:
注意:這里我順便說一下,我以前配置的參數(shù)是 pm.max_spare_servers = 60; pm.max_requests = 204800;
pm = dynamic
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 30
pm.max_requests = 20480
總結:
通俗點講,設置“pm.max_requests”參數(shù)小一點,就是讓php-fpm能夠自動的頻繁重啟,關于具體設置多大?要根據(jù)你的服務器配置以及流量狀況來分析,自己可以去做測試。
經過我的的測試,我發(fā)現(xiàn)pm.max_requests設置太大會出現(xiàn)504 Gateway Time-out,pm.max_requests設置太小,平均負載 Load Average又會超出正常值的范圍,甚至更高。
原文鏈接:
本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。