一些高併發下web伺服器http異常狀態碼分析

2021-09-24 12:28:43 字數 3273 閱讀 3718

環境說明

壓測工具:apache/ab

web伺服器:nginx/1.8.0 + php 5.6.25

php指令碼:get.php

注:nignx 設定超時

fastcgi_connect_timeout 60

fastcgi_send_timeout 60

fastcgi_read_timeout 60

php-fpm 設定超時

request_terminate_timeout 10
壓測開始1.get.php原始碼

<?php 

for ($i=0; $i < 50; $i++)

2.使用ab模擬10個client對get.php併發請求100次

ab -c 10 -n 100
結果分析情況一:每個php執行50s以上遠大於超時時間(10s),fpm會自動傳送kill訊號(sigterm)給工作程序clild程序關閉。此時nginx與php-fpm的連線斷開,nginx找不到對方,報502 bad gateway錯誤。

如圖:fpm超時的處理 (php-fpm.conf)

如圖:kill掉程序,重新啟動fpm工作程序(php-fpm日誌)

如圖:nginx報502 bad gateway (nginx access.log)

情況二:client端(ab壓測那端)等待不耐煩,關閉自身致使連線從客戶端先斷開,nginx檢查到客戶端已斷開連線,則報499 code 。(注:其他情況如使用者主動關閉瀏覽器等)

如圖:nginx報499

如圖:nignx對499的定義

情況三:重新設定nginx超時為5s,再次壓測,此時未等php超時,nginx已經超時了,nginx報504 gateway time-out 

如圖:nginx報504 gateway time-out

總結:

第一種是php-fpm沒設定超時,即request_terminate_timeout 設定為0,我們常見的狀態碼是504或499,原因是要麼nginx超時,要麼使用者等不耐煩關閉連線。

第二種情況是php-fpm設定超時如10s,常見的狀態碼是502或者504,也有可能499。另外由於併發高,php-fpm工作程序都在忙,沒有可用的工作程序,此時常見502 bad gateway。還有一種是php-fpm掛了或沒啟動,同理也是502

解決辦法:

1、500 internal server error 內部服務錯誤:顧名思義500錯誤一般是伺服器遇到意外情況,而無法完成請求。

2、500出錯的可能性:

a、程式語言語法錯誤,web指令碼錯誤

b、併發高時,因為系統資源限制,而不能開啟過多的檔案

3、一般解決思路:

a、檢視nginx、php的錯誤日誌檔案,從而看出端倪

b、如果是too many open files,修改nginx的worker_rlimit_nofile引數,使用ulimit檢視系統開啟檔案限制,修改/etc/security/limits.conf,還是出現too many open files,那就要考慮做負載均衡,把流量分散到不同伺服器上去了

c、如果是指令碼的問題,則需要修復指令碼錯誤,優化**

二:502、504錯誤

1、502 bad gateway錯誤、504 bad gateway timeout 閘道器超時

2、502、504出現的可能性

nginx伺服器,php-cgi程序數不夠用;

php執行時間過長;

php-cgi程序死掉;

3、一般解決思路

a、使用nginx**,而後端伺服器發生故障;或者php-cgi程序數不夠用;php執行時間長,或者是php-cgi程序死掉;已經fastcgi使用情況等都會導致502、504錯誤。

b、502 是指請求的php-fpm已經執行,但是由於某種原因而沒有執行完畢,最終導致php-fpm程序終止。一般來說,與php-fpm.conf的設定有關,也與php的執行程式效能有關,**的訪問量大,而php-cgi的程序數偏少。針對這種情況的502錯誤,只需增加            php-cgi的程序數。具體就是修改/usr/local/php/etc/php-fpm.conf檔案,將其中的max_children值適當增加。這個資料要依據你的伺服器的配置進行設定。一般乙個php-cgi程序佔20m記憶體,你可以自己計算下,適量增多。

/usr/local/php/sbin/php-fpm reload 然後重啟一下.

c、504 表示超時,也就是客戶端所發出的請求沒有到達閘道器,請求沒有到可以執行的php-fpm。與nginx.conf的配置也有關係。

伺服器501錯誤:伺服器不具備完成請求的功能。例如,伺服器無法識別請求方法時可能會返回此**。

伺服器503錯誤:伺服器目前無法使用(由於超載或停機維護)。通常,這只是暫時狀態。(服務不可用)

伺服器505錯誤:伺服器不支援請求中所用的 http 協議版本。(http 版本不受支援)

高併發下怎麼優化能避免伺服器壓力過大

高併發下怎麼優化能避免伺服器壓力過大 1,整個架構 可採用分布式架構,利用微服務架構拆分服務部署在不同的服務節點,避免單節點宕機引起的服務不可用!高併發下怎麼優化能避免伺服器壓力過大?2,資料庫 採用主從複製,讀寫分離,甚至是分庫分表,表資料根據查詢方式的不同採用不同的索引比如b tree,hash...

web伺服器 併發web伺服器實現 epoll

在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。epoll 是當今 linux 系統採用的方式,一般伺服器都是用 epoll 來實現的。epoll 是一種方案,這種方案不使用多程序多執行緒多協程,而是使用單程序單...

Epoll實現伺服器高併發

最近在做乙個關於高併發伺服器相關的專案需要用到非同步 非阻塞io通訊,實現高tcp併發。以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。include include include include include include in...