Nginx 雖然處理并發量比 apache 确實要強點,但它這種 php-cgi 模式不是太穩定,我們生産環境其中一台服務器,偶爾會出現以下情況的:php-cgi 進程突然消失了,造成PHP腳本無法訪問;更奇怪的是明明是php-cgi 打開有兩個端口在監聽的,莫名其秒的突然有一個php-cgi 的端口被關閉了,造成所有請求全積在一個端口上, 結果造成PHP腳本訪問異常。
基于這個情況,我之前寫了個監控Shell腳本的解決方案,不管以上出現那種情況,都自動恢複Nginx的服務.該腳本在生産環境上運行正常。
幾種常用web服務器對比
#!/bin/bash # filename: webservermonitor.sh # Function:監控 nginx 的 php-cgi 是否正常 # Author:huangweibo # Run: nohup ./webservermonitor.sh & # # php-cgi 監聽的IP和端口 V_PHP_CGI_PORT="xx.xx.xx.xx:9000 xx.xx.xx.xx:9001" # nginx重啟的腳本 V_NGINX="/usr/local/nginx/sbin/restart.sh" # 日志文件 V_LOG="/tmp/webservermonitor.log" # 函數定義:重啟nginx function restart_nginx(){ echo "----- `date` -----" >> $V_LOG echo "------------------" >> $V_LOG echo "`ps aux |grep 'nginx'`" >> $V_LOG echo "------------------" >> $V_LOG echo "`ps aux |grep 'php-cgi'`" >> $V_LOG echo "------------------" >> $V_LOG echo "`netstat -nlpt | grep 'php-cgi'`" >> $V_LOG echo "------------------" >> $V_LOG $V_NGINX >> $V_LOG } # 循環執行,不采用 crontab ,主要是因為 crontab 最小單位是分鐘,時間太長了 while : do # 1:先檢測 nginx 主進程是否存在 V_NGINX_NUM=`ps axu |grep 'nginx' |grep -v 'grep' |wc -l` if [ $V_NGINX_NUM -lt 1 ];then restart_nginx continue fi # 2:再檢查php-cgi是否有進程存在 V_PHP_CGI_NUM=`ps axu |grep 'php-cgi' |grep -v 'grep' |wc -l` if [ $V_PHP_CGI_NUM -lt 1 ];then restart_nginx continue fi # 3:再判斷端口是否正常 for PORT in $V_PHP_CGI_PORT do V_NUM=`eval "netstat -nlpt | grep '${PORT}' | wc -l"` if [ $V_NUM -lt 1 ];then restart_nginx continue fi done # 休眠 sleep 10 done
PS:其實大家寫shell腳本的時候并不用一定要去記住那些語法,主要是根據你的需求處理好判斷邏輯,我一直認為寫腳本實際上就是把邏輯寫出來,至于語法那些,忘了百度下就好了,當然基本的語法還是要會的。
後面會分享更多關于devops和DBA内容,感興趣的朋友可以關注下!!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!