1. 程式人生 > >tengine常見錯誤碼總結以及原因分析

tengine常見錯誤碼總結以及原因分析

403 Forbidden

You don’t have permission to access the URL on this server. Sorry for the inconvenience.
Please report this message and include the following information to us.

解決:看下許可權檔案許可權

500

該網頁無法正常運作
www.test.com 目前無法處理此請求。
HTTP ERROR 500

原因:

  1. web指令碼錯誤,如php語法錯誤,lua語法錯誤等。
  2. 訪問量大的時候,由於系統資源限制,而不能開啟過多的檔案控制代碼
  3. 指令碼執行時間在(max_execution_time, request_terminate_timeout]之間,超過(request_terminate_timeout)的情況下面有介紹

復現場景:

php.ini配置:

max_execution_time = 5    ; Maximum execution time of each script, in seconds

php-fpm配置:

request_terminate_timeout = 30

php_code:

$start = time();
while(true) {
   if (time()-$start > 5) {
 		die("game over");
 	}
}

解決辦法:

  1. 保證程式碼的正確性
  2. 正確設定max_execution_time 一般來說 max_execution_time的時長大於request_terminate_timeout
  3. 如果需要執行耗時較長的指令碼又不想修改php.ini可以添set_time_limit(0);

504 Gateway Time-out

The gateway did not receive a timely response from the upstream server or application. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!

復現場景:

PHP 程式碼:

<?php
	sleep(11);
	echo 'hello world';	
?>

tengine設定:

// fastcgi連線超時時間,預設60秒
fastcgi_connect_timeout 10;

// tengine 程序向 fastcgi 程序傳送請求過程的超時時間
fastcgi_send_timeout 10;

//fastcgi 程序向 tengine 程序傳送輸出過程的超時時間
fastcgi_read_timeout 10;

原因之一:導致閘道器超時的原因程式執行時間較長超過了tengine設定的超時時間導致閘道器超時

解決辦法:

  1. 優化程式碼(這個是關鍵)
  2. 調整tengine超時時間
    (如果是代理調整proxy_connect_timeout,proxy_send_timeout,proxy_read_timeout)

502 Bad Gateway

The proxy server received an invalid response from an upstream server. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!

復現場景:

php.ini配置:

max_execution_time = 30     ; Maximum execution time of each script, in seconds

php-fpm配置:

request_terminate_timeout = 10

php程式碼:

<?php
	sleep(11);
	echo 'hello world';	
?>

執行後tengine的日誌

2018/09/21 15:01:50 [error] 32753#0: *8 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 10.33.65.83, server: www.test.com, request: "GET /a.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:8721", host: "www.test.com"

php-fpm 日誌:

[21-Sep-2018 16:57:43] WARNING: [pool test] child 824, script '/home/test/www/htdocs/a.php' (request: "GET /a.php") executing too slow (3.963645 sec), logging
[21-Sep-2018 16:57:43] NOTICE: child 824 stopped for tracing
[21-Sep-2018 16:57:43] NOTICE: about to trace 824
[21-Sep-2018 16:57:43] NOTICE: finished trace of 824
[21-Sep-2018 16:57:44] WARNING: [pool test] child 824, script '/home/test/www/htdocs/a.php' (request: "GET /a.php") execution timed out (4.964827 sec), terminating
[21-Sep-2018 16:57:44] WARNING: [pool test] child 824 exited on signal 15 (SIGTERM) after 683.779281 seconds from start
[21-Sep-2018 16:57:44] NOTICE: [pool test] child 838 started

從php-fpm日誌我們可以看到請求給了824程序,但是由於指令碼執行的時間超過了request_terminate_timeout的時間,導致824收到了退出訊號(實際上是master程序發出的),824退出後新啟動了838程序。

看來如果php-fpm的worker程序執行超時(超過request_terminate_timeout),不僅終止指令碼執行,而且worker程序也會退出。隨後會啟動一個新的程序,本次502的原因可能就是tengine的報錯連線被重置是因為php的worker程序退出了

原因:

  1. 指令碼執行的時間超過了request_terminate_timeout的時間導致產生502
  2. 後臺worker數目負載大或者過少,導致新來的請求沒有worker處理導致502

(簡而言之:php-fpm程序數不夠用、php執行時間長、或者是php-fpm程序死掉,都會出現502錯誤。)

解決辦法:

  1. 合理修改request_terminate_timeout
  2. 合理設定pm.max_children, pm.start_servers, pm.min_spare_servers,pm.max_spare_servers, pm.max_requests

499

主要是客戶端請求時間超過了(客戶端設定超時時間,例如當CURL呼叫服務端api的時候)
一般遇到這種情況考慮

  1. 服務端有慢查詢導致客戶端請求超時
  2. 合理調整客戶端超時時間

(番外)PHP讀取資料庫的最大執行時間:

php.ini配置

mysqlnd.net_read_timeout = 5 

PHP讀取資料庫的最大執行時間
如果超時 一般會報 Mysql server has gone away