相信大家都曾遇到過碰到網站Apache伺服器因爲攻擊等原因停止響應,雖然目前網上有很多可以對網站狀態進行監控的工具,但卻沒有一款可以檢測到錯誤後執行相關命令(例如重啓Apache等),所以今天「暢想資源」就來教大家如何在Linux下爲Apache(httpd)加入自動監測網站可否訪問並執行命令(例如重啓)的腳本!
腳本功能&特點
1、本腳本能夠每隔一段時間檢測Apache伺服器的可用性(由於腳本直接使用 curl
模擬客戶端的訪問,因此這裏的「可用性」是指切切實實的可正常訪問)
2、在出現無法訪問的情況後,能夠自動強制停止( kill
)並重新啓動( restart
)Apache服務
3、如果在Apache重啓後網站仍然無法正常訪問,自動執行進一步的操作(如重啓整個伺服器、發送通知郵件等等)
後文將給出此腳本的具體使用方法及註解,大家可以根據自己的情況對腳本進行手動修改!
教學
1、由於我們的腳本需要使用 curl
指令,請先於伺服器內安裝Curl:
1 2 3 |
#請根據自己Linux的發行版選擇不同的安裝指令 yum install curl apt-get install curl |
2、然後我們在伺服器的任意位置置入「apachemonitor.sh」文件:(本例中其位置爲「/root/apachemonitor.sh」)
注意:請將第四行的 URL
修改爲你自己的網址、以及按照相關註釋調整執行的指令!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/bin/bash # 本腳本由 VPS管理百科 編寫、並由 暢想資源 修改 # 訪問:HTTP://WWW.BOOTF.COM/ 或 HTTP://WWW.AREFLY.COM/ 獲取技術支持 URL="http://www.mydomain.com/" curlit(){ curl --connect-timeout 15 --max-time 20 --head --silent "$URL" | grep '200' # 上面的15是連接超時時間,若訪問localhost的HTTP服務超過15秒仍然沒有正確響應200頭代碼,則判斷爲無法訪問。 } doit(){ if ! curlit; then # 如果localhost的Apache服務沒有正常返回200頭,即出現異常。執行下述命令: sleep 20 top -n 1 -b >> /var/log/apachemonitor.log # 上面將top命令內容寫入日至文件備查 /usr/bin/killall -9 apache2 && /usr/bin/killall -9 php5-cgi && /usr/bin/killall -9 httpd && /usr/bin/killall -9 http && /usr/bin/killall -9 apache && /usr/bin/killall -9 php-cgi > /dev/null # 兼容起見,殺死了各種Apache的進程。可以根據自己Apache服務的特點修改及刪除 sleep 2 /etc/init.d/apache2 start > /dev/null /etc/init.d/httpd start > /dev/null # 兼容起見,執行了兩種Apache重啟命令,可根據需要自己修改及註釋 echo $(date) "Apache Restart" >> /var/log/apachemonitor.log # 寫入日志 sleep 30 # 重啟完成後等待三十秒,然後再次嘗試一次 if ! curlit; then # 如果仍然無法訪問,則: echo $(date) "Failed! Now Reboot Computer!" >> /var/log/apachemonitor.log # 寫入Apache依然重啟失效的日志 reboot # 重啟機器(實際上重啟整個伺服器是一種非常不得已的做法。本人並不建議。大家根據需要自己修改,比如簡訊、郵件報警等。) fi sleep 180 fi } sleep 300 # 執行腳本後5分鐘後才開始正式工作(防止重啟伺服器後由於Apache還沒開始啟動造成誤判) while true; do # 主循環體 doit > /dev/null sleep 10 done |
3、接着我們來設定一下這一「.sh」文件的權限:
1 |
chmod 755 /root/apachemonitor.sh |
4、最後,讓我們把運行這一腳本的命令添加到開機啓動項中,輸入 vim /etc/rc.local
,然後於文件的最底部添加:
1 2 3 4 5 6 7 8 |
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. # 其它指令... sh /root/apachemonitor.sh |
5、現在 reboot
重啓一下伺服器,我們的Linux就可以一直自動檢測Apache(httpd)的運行狀態並執行相關命令啦!