模擬502和504

一、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_timephp-fpm.d/www.conf中的request_terminate_timeoutmax_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。


總結:504是nginx的超時時間小於php-fpm的超時時間和php.ini的腳本執行時間;502是php-fpm的超時時間小於nginx的超時時間和php.ini的腳本執行時間。
思考:頁面調用一個很耗時的接口以更新數據,出現504,那數據有沒有被更新呢?請修改不同參數自己去測試一下吧,會印象深刻一些的。
提示:上邊參數設置的太小,測試後別忘記改回來哦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章