分享一份nginx重啟指令碼

hzczichao發表於2010-07-29
nginx是超級穩定的伺服器,一般不會因為超載問題而需要重啟,重啟的目的一般都是修改配置檔案後需要載入一下。

最開始的時候,我是用最直接的重啟方式
[@more@]killall -9 nginx;/data/nginx/sbin/nginx

如果機器比較慢,kill程式時一瞬間殺不完,再執行一次即可。這種重啟方式不是特別安全,如果配置有誤,則會重啟失敗,需要重新修改配置檔案然後再啟動,期間會消耗一點時間。不過對於目前普遍還是不怎麼嚴格的http界而言,這點時間還不至於產生太大損失,只要不是在關鍵時刻搞出來就好。如果希望沿用這種重啟辦法,我提議還是先好好測試吧。

後來我在nginx.net上看到了一種更奇妙的重啟

kill -HUP $pid($pid就是nginx master程式的程式號)

我一般這樣用

kill -HUP `cat /data/nginx/logs/nginx.pid`

這種方式的好處是實現“平滑重啟”,在ps -aux中可以看到,nginx首先啟動新程式,舊的程式仍然提供服務,在一段時間後,舊的程式服務結束就自動關閉,剩下新程式繼續服務。但是這種方式也是有缺點的,如果配置檔案有誤,或者資源衝突,則重啟失效,但nginx並沒有任何的提示!這就會時常發現改動的配置檔案沒有生效,又比較難找到問題。

所以,最後雜和了一下問題,弄了一個nginx.sh,這個版本的nginx.sh還是沒有解決kill -HUP的資源衝突的問題,但解決了配置檔案的問題。資源衝突的比如80埠被佔用、日誌檔案目錄沒有建立這種的,我再想想辦法。

#!/bin/sh

BASE_DIR='/data/'

${BASE_DIR}nginx/sbin/nginx -t -c ${BASE_DIR}nginx/conf/nginx.conf >& ${BASE_DIR}nginx/logs/nginx.start

info=`cat ${BASE_DIR}nginx/logs/nginx.start`

if [ `echo $info | grep -c "syntax is ok" ` -eq 1 ]; then

if [ `ps aux|grep "nginx"|grep -c "master"` == 1 ]; then
kill -HUP `cat ${BASE_DIR}nginx/logs/nginx.pid`
echo "ok"
else
killall -9 nginx
sleep 1
${BASE_DIR}nginx/sbin/nginx
fi

else

echo "######## error: ########"
cat ${BASE_DIR}nginx/logs/nginx.start

fi

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23595918/viewspace-1035634/,如需轉載,請註明出處,否則將追究法律責任。

相關文章