很多新手剛開始做網(wǎng)站可能感覺不到502,504的問題,當(dāng)?shù)饶憔W(wǎng)站到達(dá)了一定水平的時(shí)候,流量起來的時(shí)候,你會(huì)發(fā)現(xiàn)經(jīng)常會(huì)遇到502、504類似的問題。
一、什么是502狀態(tài)碼?
502 Bad Gateway:作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無效的響應(yīng)。
二、502 Bad Gateway 原因一般有哪些?
將請(qǐng)求提交給網(wǎng)關(guān)如php-fpm執(zhí)行,但是由于某些原因沒有執(zhí)行完畢導(dǎo)致php-fpm進(jìn)程終止執(zhí)行。這個(gè)問題與網(wǎng)關(guān)服務(wù)如php-fpm的配置有關(guān)。
php-fpm.conf配置文件中有兩個(gè)參數(shù)就需要你考慮到,分別是max_children和request_terminate_timeout。
-
max_children最大子進(jìn)程數(shù),在高并發(fā)請(qǐng)求下,達(dá)到php-fpm最大響應(yīng)數(shù),后續(xù)的請(qǐng)求就會(huì)出現(xiàn)502錯(cuò)誤的??梢酝ㄟ^netstat命令來查看當(dāng)前連接數(shù)。
-
request_terminate_timeout設(shè)置單個(gè)請(qǐng)求的超時(shí)終止時(shí)間。還應(yīng)該注意到php.ini中的max_execution_time參數(shù)。當(dāng)請(qǐng)求終止時(shí),也會(huì)出現(xiàn)502錯(cuò)誤的。
當(dāng)積累了大量的php請(qǐng)求,你重啟php-fpm釋放資源,但一兩分鐘不到,502又再次呈現(xiàn),這是什么原因?qū)е碌哪兀?這時(shí)還應(yīng)該考慮到數(shù)據(jù)庫,查看下數(shù)據(jù)庫進(jìn)程是否有大量的locked進(jìn)程,數(shù)據(jù)庫死鎖導(dǎo)致超時(shí),前端終止了繼續(xù)請(qǐng)求,但是SQL語句還在等待釋放鎖,這時(shí)就要重啟數(shù)據(jù)庫服務(wù)了或kill掉死鎖SQL進(jìn)程了。
三、什么是504狀態(tài)碼?
504 Gateway Time-out:作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),未能及時(shí)從上游服務(wù)器(URI標(biāo)識(shí)出的服務(wù)器,例如HTTP、FTP、LDAP)或者輔助服務(wù)器(例如DNS)收到響應(yīng)。
四、504 Gateway Time-out 原因一般有哪些?
504錯(cuò)誤一般是與nginx.conf 配置有關(guān)。主要與以下幾個(gè)參數(shù)有關(guān):
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
特別是前三個(gè)超時(shí)時(shí)間。如果fastcgi緩沖區(qū)太小會(huì)導(dǎo)致fastcgi進(jìn)程被掛起從而演變?yōu)?04錯(cuò)誤。
五、關(guān)于PHP+Nginx經(jīng)常出現(xiàn)502、504的解決方法
由于不同的原因,解決方法也是不一樣的,一定要根據(jù)實(shí)際的情況去分析。例如,以下是我以前遇到的502的相關(guān)問題。
1、Nginx 502 Bad Gateway 原因與解決方法
2、Nginx報(bào)錯(cuò):upstream timed out (110: Connection timed out) 原因與解決方法
今天重點(diǎn)說下我遇到504問題的解決方法。
由于我用的是PHP+Nginx+百度云加速CDN,然后,百度云加速CDN一直給我報(bào)504錯(cuò)誤,我排查了很多也沒有找到原因。
1、最初我以為修改nginx.conf,增加如下“error Connection timed out and 504 error”的代碼可以解決這個(gè)問題。
[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; }
經(jīng)過測(cè)試,并沒有任何效果。
2、我又自信的以為是我用了FirewallD防火墻的原因,結(jié)果我關(guān)閉它,測(cè)試也沒有效果,照樣報(bào)504錯(cuò)誤。
3、最后當(dāng)再出現(xiàn)504錯(cuò)誤的時(shí)候,我直接暴力操作,殺死php-fpm,再重啟,就可以恢復(fù)正常,從而我判斷是php的問題。經(jīng)過我的排查,發(fā)現(xiàn)是“pm.max_requests”這個(gè)參數(shù)的問題,我最初設(shè)置的是204000,現(xiàn)在設(shè)置的是20400即可恢復(fù)正常,沒有再出現(xiàn)504錯(cuò)誤了,平均負(fù)載 Load Average也在正常的范圍類。
4、但是過一段時(shí)間后,又會(huì)出現(xiàn)“504連接超時(shí)”這個(gè)問題。
5、最終,經(jīng)過我?guī)滋斓臏y(cè)試,我最終php-fpm.conf參數(shù)調(diào)整如下即恢復(fù)正常:
注意:這里我順便說一下,我以前配置的參數(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
總結(jié):
通俗點(diǎn)講,設(shè)置“pm.max_requests”參數(shù)小一點(diǎn),就是讓php-fpm能夠自動(dòng)的頻繁重啟,關(guān)于具體設(shè)置多大?要根據(jù)你的服務(wù)器配置以及流量狀況來分析,自己可以去做測(cè)試。文章來源:http://www.zghlxwxcb.cn/news/detail-610871.html
經(jīng)過我的的測(cè)試,我發(fā)現(xiàn)pm.max_requests設(shè)置太大會(huì)出現(xiàn)504 Gateway Time-out,pm.max_requests設(shè)置太小,平均負(fù)載 Load Average又會(huì)超出正常值的范圍,甚至更高。文章來源地址http://www.zghlxwxcb.cn/news/detail-610871.html
到了這里,關(guān)于PHP+Nginx經(jīng)常出現(xiàn)502、504原因與解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!