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>
此文有幫助否?
對老徐最好的支持是:把文章分享給需要的同學~
最後送上一文:
測試職業線上直播分享 | 報名啟動~