一、504 Gateway Timeout
官方解釋:作爲網關或者代理工作的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應。
通俗地講:在LNMP中,nginx沒及時從php-fpm那裏收到信息返回。我nginx等你php-fpm太久了你不回覆我,我就告訴瀏覽器504。
這個模擬起來也很簡單,設定fastcgi_read_timeout
參數。
例: 設定5s超時後,重加載nginx配置,php腳本 sleep(6) 測試。
server {
...
fastcgi_read_timeout 5;
}
二、502 Bad Gateway
官方解釋:作爲網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
通俗地講:在LNMP中,nginx沒在php-fpm那裏得到有效響應。常見可能有兩種情況,一是php-fpm沒啓動,二是phpcgi執行腳本超時,php-fpm將進程殺掉。(另外php-fpm每個進程在接受一定請求數後會重啓防止內存泄漏會引起間歇性502)
第一種,直接關閉php-fpm即可出現502。
第二種設定超時時間,涉及兩個參數,分別是php.ini
中的max_execution_time
和php-fpm.d/www.conf
中的request_terminate_timeout
。max_execution_time
是腳本執行時間,超過腳本執行時間後,會報錯。request_terminate_timeout
是請求超時時間,默認被註釋掉,使用max_execution_time
的時間。
(1) 首先我們測試腳本執行超時報錯。
在腳本里使用set_time_limit()
函數臨時修改max_execution_time
參數。值得注意的是,set_time_limit()
函數和配置指令max_execution_time
隻影響腳本本身執行的時間,執行之外的時間都不會計算在內,例如sleep函數,http請求等待響應的時間等。所以我們不能寫sleep()這樣來驗證。
<?php
set_time_limit(2);
var_dump('start');
$start = time();
for($i = 0;;$i++) {
if(time() - $start > 2) {
break;
}
}
var_dump('end');
此時兩參數相等,會出現報錯
(2) 然後我們修改request_terminate_timeout
參數,將註釋去掉,默認的0代表無限制,改爲1。重啓php-fpm,出現502。