從「簡書」平臺的伺服器故障,談Nginx An error occurred異常~

2021-02-21 簡尚


09.26簡書平臺的短暫異常

An error occurred.

Sorry, the page you are looking for is currently unavailable.

Please try again later.

If you are the system administrator of this resource then you should check theerror log for details.

Faithfully yours, nginx.

老徐觀點:對於一個平臺級產品,伺服器的生產故障,而且是直接拋出nginx的錯誤頁面,無任何轉向處理,是非常嚴重的事故~至於,具體原因,老徐不得而知~如下是老徐的一些猜測,正在繼續老徐近期的伺服器部署系列文章~


今天,剛老徐正打算上簡書平臺,寫文章;突然,出現如上錯誤(本著tester從業者的嚴謹度,老徐再三確認不是我電腦的問題,是真的發生故障了),應該持續了幾分鐘~

不知道有多少用戶有感知,好在平臺響應速度還算不錯,幾分鐘後已恢復正常~

一般nginx的此類報錯,原因如下(當然,老徐對nginx了解不深,如下都是一些可能原因)

出現問題,首先是去分析nginx的日誌,得到一些線索~

可能的常見原因:

/ 1 /

很明顯這是一個nginx的錯誤,查看nginx.conf的文件過程中分析可能是以下的問題,在nginx.xml中有如下配置:


如上圖片源自網絡

標紅的部分是很大的嫌疑,恰好應用中在提交數據的一瞬間和伺服器有多次交互,這些交互都要過nginx。再加上用戶IP來做key,假如多個用戶訪問在網上的最後一跳是同一個路由器,很顯然會被伺服器當成是一臺電腦,從而出現判斷錯誤。那麼又一個新問題來了,出現503錯誤後為啥返回的是那個錯誤頁面呢?

帶著這個問題在nginx.conf中又發現了一段配置,如下圖:


如上圖片源自網絡

這個配置的意思是當出現500、502、503、504的錯誤時返回50x.html頁面,這個頁面在nginx安裝目錄的html文件夾下,內容如下:


如上圖片源自網絡

這個頁面經過瀏覽器解析就是開頭第一幅圖的樣子。

分析到這裡,就大概估計出原因了,把之前的rate值該大一點即可。那麼到底改多大?這個要根據不同的業務而定,甚至去掉這個配置,所以這個是個經驗值,通過多次試驗可以得到一個相對於應用合理的值,這裡就不說了。

實際nginx出現這個錯誤原因應該有很多,這裡提供一種可能原因,以供網友參考。

/ 2 /

日誌記錄中HTTP狀態碼出現499錯誤有多種情況,我遇到的一種情況是nginx反代到一個永遠打不開的後端,就這樣了,日誌狀態記錄是499、發送字節數是0。

老是有用戶反映網站系統時好時壞,因為線上的產品很長時間沒有修改,所以前端程序的問題基本上可以排除,於是就想著是Get方式調用的接口不穩定,問了相關人員,說沒有問題,為了拿到確切證據,於是我問相關人員要了nginx伺服器的日誌文件(awstats日誌),分析後發現日誌中很多錯誤碼為499的錯誤,約佔整個日誌文件的1%,而它只佔全部報錯的70%左右(全部報錯見下圖),那麼所有報錯加起來就要超過1%了,這個量還是特別大的。

499錯誤是什麼?讓我們看看NGINX的源碼中的定義:

ngx_string(ngx_http_error_495_page), /* 495, https certificate error */

ngx_string(ngx_http_error_496_page), /* 496, https no certificate */

ngx_string(ngx_http_error_497_page), /* 497, http to https */

ngx_string(ngx_http_error_404_page), /* 498, canceled */

ngx_null_string,                    /* 499, client has closed connection */

可以看到,499對應的是 「client has closed connection」。這很有可能是因為伺服器端處理的時間過長,客戶端「不耐煩」了。

Nginx 499錯誤的原因及解決方法

打開Nginx的access.log發現在最後一次的提交是出現了HTTP1.1 499 0 -這樣的錯誤,在百度搜索nginx 499錯誤,結果都是說客戶端主動斷開了連接。

但經過我的測試這顯然不是客戶端的問題,因為使用埠+IP直接訪問後端伺服器不存在此問題,後來測試nginx發現如果兩次提交post過快就會出現499的情況,看來是nginx認為是不安全的連接,主動拒絕了客戶端的連接.

但搜索相關問題一直找不到解決方法,最後終於在google上搜索到一英文論壇上有關於此錯誤的解決方法:

proxy_ignore_client_abort on;

Don’t know if this is safe.

就是說要配置參數 proxy_ignore_client_abort on;

表示代理服務端不要主要主動關閉客戶端連接。

以此配置重啟nginx,問題果然得到解決。只是安全方面稍有欠缺,但比總是出現找不到伺服器好多了。

還有一種原因是 我後來測試發現 確實是客戶端關閉了連接,或者說連接超時 ,無論你設置多少超時時間多沒用 原來是php進程不夠用了 改善一下php進程數 問題解決

/ 3 /

今天網站突然出現如下錯誤:

The page you are looking for is temporarily unavailable.Please try again later.

很奇怪,我對伺服器端的技術不是很熟悉,於是查詢了下google,在https://wiki.archlinux.org/index.php/Nginx

上面的解決方法:

Error: The page you are looking for is temporarily unavailable. Please try again later.

This is because the FastCGI server has not been started.

如何解決呢?

剛開始我懷疑是不是nginx掛了,我首先通過ps aux | grep nginx,結果出現:

root      3769  0.0  0.0   5760   692 ?        Ss   Apr21   0:00 nginx: master process /usr/local/nginx/sbin/nginx

www       3770  0.0  0.1  18680 14252 ?        S    Apr21   0:03 nginx: worker process

www       3771  0.0  0.1  18680 14252 ?        S    Apr21   0:03 nginx: worker process

www       3772  0.0  0.1  18712 14276 ?        S    Apr21   0:03 nginx: worker process

www       3774  0.0  0.1  18680 14248 ?        S    Apr21   0:03 nginx: worker process

www       3776  0.0  0.1  18712 14240 ?        S    Apr21   0:03 nginx: worker process

www       3777  0.0  0.1  18680 14252 ?        S    Apr21   0:03 nginx: worker process

www       3778  0.0  0.1  18680 14232 ?        S    Apr21   0:02 nginx: worker process

root     24068  0.0  0.0   5196   756 pts/1    S+   14:33   0:00 grep nginx

可見nginx是正常的,本來打算重啟nginx的:

/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf的,

突然覺得有沒有其他方法,有同事提示先在一個目錄下運行下test.html和test.php,結果html可以運行,php無法運行。

證實是php沒有啟動,我剛才也檢測過php的進程,的確是沒有php進程,這臺伺服器我不熟悉,同事幫忙查看了下

cd /etc/init.d,就是web管理員經常看的地方,是隨著系統自動啟動的服務,程序等。

找到:

/usr/local/php/sbin/php-fpm start,首先什麼是php-fpm呢?

就是FastCGI Process Manager,是一種可選的PHP FastGCI執行模式,有一點很有特點的應用,尤其是一個繁忙的網站中:

(1)可適應的進行再生(NEW!)

(2)基本的統計功能(Apache's mod_status)

(3)高級進程管理功能,能夠優雅的停止/開始

(4)能夠使用不同的工作用戶和不同的php.ini

(5)輸入,輸出日誌記錄...

開啟後,一切恢復正常!自己的伺服器端技術還是有很多地方使用的不夠。需要多學習使用!

總結,遇到類型問題,常見的問題判斷思路:

1、試檢查一下nginx.conf的設置,是不是有limit的設置,比如limit_zone、limit_conn,這些參數也是有影響的。

2、檢查一下防火牆,是不是有相關的設置限制。

3、檢查一下nginx.conf的設置,看看有沒有valid_referers none blocked的防鏈設置。

4、看下訪問靜態文件是否正常,錯誤排除~

OK,如上只是一些猜測~

具體原因,具體分析~

隨著越來越多的系統採用nginx,大家有必要了解些nginx的基礎知識~

延伸閱讀,推薦幾篇老徐的文章:

軟體測試職業發展 之 資料&建議合集

關於簡歷 & 面試:記住這些,少給自己埋坑~

Linux入門實戰系列資料分享~

Linux是什麼?概念普及

從業十年,給所有Tester的一些建議~

想了解更多?

關注老徐公眾號
Tester從業者 & 入行新人都在關注

測試職業答疑解惑、原創實戰經驗、乾貨分享

老徐個人微信957863300

歡迎騷擾~

老徐公眾號,接受投稿

答測試者問

<End>

此文有幫助否?

對老徐最好的支持是:把文章分享給需要的同學~

最後送上一文:

測試職業線上直播分享 | 報名啟動~

相關焦點

  • 英雄聯盟手遊an error occurred please try toagain later解決方法
    完全是免費訂閱,請放心關注                                                                                                        英雄聯盟手遊an error occurred please try toagain later什麼意思?
  • A disk read error occurred
    A disk read error occurred這句話的字面意思是:發生磁碟讀取錯誤。從提示就可以看出來是磁碟出現問題了。
  • 一次很奇葩的 Nginx 500 Internal Server Error
    最後排查出來的故障原因雖然很奇葩但也算是一次經驗積累了,所以也可以當做一次經驗分享給大家。沒有想到就是這個驗證配置無誤的疏忽造成了伺服器長達半個小時的「500 Internal Server Error」錯誤狀態。
  • 這些 Nginx 常見異常,幫你快速定位故障
    提示:文章前面部分是關於 nginx 下 https 連接 curl 請求被 reset 的處理經歷,不想看可以直接跳到最後看nginx
  • ☞電腦知識:電腦開機提示A disk read error occurred錯誤
    電腦開機提示A disk read error occurred錯誤,引起該問題的原因很多,以下幾個實例,大家參考下:案例一:一網友機子開機有時提示:A disk read error occurred
  • A disk read error occurred如何解決
    摘要:今天有學員電腦開機突然進不了系統,屏幕上出現這樣的一行字:A disk read error occurred。下面就這個問題談談阿平老師是怎麼解決的,希望能給大家拋磚引玉。
  • Linux 平臺通過 nginx 和 vsftpd 構建圖片伺服器
    Nginx WEB 伺服器Nginx 是一個高性能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本 0.1.0 發布於 2004 年 10 月 4 日。
  •  重裝系統提示「A disk read error occurred」解決方法
    重裝系統提示「A disk read error occurred」解決方法
  • Python異常處理,告別xxxxError
    這個提前預防的動作稱為異常處理(exception handling)。總之異常處理就是為了防患於未然。Error occurred. Either 'a' is a numerical value or expression or type of 'a' is incompatible.Error occurred.
  • (實用篇)詳解 Nginx代理功能與負載均衡
    5、如果使用upstream指令配置啦一組伺服器作為被代理伺服器,伺服器中的訪問算法遵循配置的負載均衡規則,同時可以使用該指令配置在發生哪些異常情況時,將請求順次交由下一組伺服器處理。proxy_next_upstream timeout;  #反向代理upstream中設置的伺服器組,出現故障時,被代理伺服器返回的狀態值。
  • Linux乾貨 | nginx常見典型故障
    }7.使用nginx負載均衡時,如何將後端請求超時的伺服器流量平滑的切換到另一臺上。,提高平臺訪問成功率。至於四層和七層可以處理的並發量有多大,這個和硬體密切相關,不同配置的伺服器,差異較大,沒有準確的量化指標!當我們只有單臺web伺服器時,需要配置錯誤返回頁面,可以使用error_page來指定。
  • Nginx 伺服器安裝及配置文件詳解
    為了後續準備我們另外下載2個插件模塊:nginx_upstream_check_module-0.3.0.tar.gz —— 檢查後端伺服器的狀態,nginx-goodies-nginx-sticky-module-ng-bd312d586752.tar.gz(建議在/usr/local/src下解壓後將目錄重命名為nginx-sticky-module-ng-1.2.5) —— 後端做負載均衡解決
  • nginx配置本地文件伺服器(windows)
    命令start nginx# 修改.conf配置後,重新加載nginxnginx -s reload# 關閉nginx命令nginx -s stopOK,啟動 nginx 後,打開瀏覽器,輸入:localhost:80,可以看到:
  • nginx代理高級應用
    我國因為各地網絡狀況不一樣,伺服器一般採用bgp機房網絡是比較理想的。但假如一個舊業務所在機房的連通性不佳時怎麼辦呢,考慮遷移機房是一個辦法,但是其實也可以用 nginx 的反向代理實現 bgp 中轉的效果。
  • 前端Nginx指南
    負載均衡客戶端的流量首先會到達負載均衡伺服器,由負載均衡伺服器通過一定的調度算法將流量分發到不同的應用伺服器上面,同時負載均衡伺服器也會對應用伺服器做周期性的健康檢查,當發現故障節點時便動態的將節點從應用伺服器集群中剔除,以此來保證應用的高可用。
  • 構建高效安全的Nginx Web伺服器
    Apache HTTP Server(簡稱Apache)是世界使用排名第一的Web伺服器軟體,音譯為阿帕奇,是Apache軟體基金會的一個開放源碼Web伺服器,可以運行幾乎所有的計算機平臺,其次開放的API接口,任何組織和個人都可以在它上面擴展和增加各種需要功能,達到為自己量身定製的功能。
  • Nginx Linux和Windows安裝教程
    這裡在簡單說下正向代理和反向代理的區別,一句話概括:「正向代理主要是為客戶端發出請求。反向代理主要是為服務端接收請求。」Nginx Linux安裝❝nginx依賴於pcre、Openssl和zlib,PCRE作用是讓Nginx支持Rewrite 功能。
  • 蘋果伺服器「翻車」了?iCloud 出現大面積故障
    但是,在蘋果對 iCloud 如此「保護」的情況下,iCloud 還是會多多少少發生一些大事情。而就在今天,iCloud 又發生問題了。今天凌晨,有不少蘋果用戶紛紛在網絡上反饋,自己的 iPhone 設備無法登陸 iCloud 服務,像 Find My iPhone 這些功能,都無法使用。
  • Nginx代理功能與負載均衡詳解
    error_page 404 https://www.baidu.com; 然而這個配置,細心的朋友可以發現他並沒有起作用。關閉,也就是說web不能訪問,那麼nginx伺服器分發請求還是會給這臺不能訪問的web伺服器,如果這裡的響應連接時間過長,就會導致客戶端的頁面一直在等待響應,對用戶來說體驗就打打折扣,這裡我們怎麼避免這樣的情況發生呢。
  • CentOS利用Nginx搭建下載功能伺服器
    利用nginx在伺服器搭建下載功能,安裝Nginx,pcremkdir /usr/local/nginx