Apache2 & Mysql執行緒監控防護

来源:百度文库 编辑:神马文学网 时间:2024/04/28 11:34:19
Apache2 & Mysql執行緒監控防護
檔案位於:飛狐Linux文件
-flyfox @ 2:43 pm
Apache2 & Mysql執行緒監控防護
作者:衡山飛狐
出處:HappyLinux,Just for fun!

本 著作 係採用Creative Commons 授權條款授權.
過去一段日子,本站的流量及訪客連線不僅突升,甚至有的時候影響到整個系統的運作,系統安全雖然還算OK,但遇到極尖峰時段,Apache2不僅當掉,嚴重時還會使mysql的資料庫毀損而必須重建。其中最常見的就是本站的計數器常常被reset歸零,雖然不是很嚴重的問題,但卻是一個困擾。
為了解決這個問題,本站重新設定Apache2的設定,期能符合目前本站的主機頻寬及負載狀況。
Apache2提供了Multi-Processing Modules(MPMs),這一個功能結合了執行緒與程序,因此能夠調校各種不同的組合,達到最佳效能。
三種MPMs選項的說明:
Prefork:在Apache1.3的模組中,單一個父程序可以產生子程序來處理需求,各別的子程序可針對該需求保持閒置狀態,過多的子程序則會在超過規定的時間後,被予以刪除。這是過去常用的方式,它容許使用不安全的執行緒函式庫。
Worker:多執行緒/多程序混合。每個程序都有固定數量的執行緒,Apache會調整程序的數量,讓它能符合工作負載。更具效率與擴充性–一個執行緒有誤,只會死一個,除非整個程序都死了,才會讓所有執行緒失去作用。因為這些執行緒分享記憶體空間,所以程式要用安全式的執行緒方式來寫。
PerChild:固定數量的程序產生不同數量的執行緒。此為最具擴充性的選項,而這也是最難設定的一個了,你可以想想,要是一個程序,控制了過多的執行緒,不是就死了嗎?你可以把好幾千個執行緒各放給兩個程序來作,但這並不明智。
PerChild還有另一個有趣的功能:它可以為不同的程序及虛擬主機作不同的使用者ID的組態,這個功能可能在你指定代理管理者作一些需受限制的工作時用得上。
三個模組分別採用不同的記憶體管理方式,其中 perchild 使用執行緒來提供服務,prefork 使用子程序來提供服務,而 worker 則兼用兩種方法,它們的差異在於:執行緒可共用記憶體,並使用記憶體與其它執行緒溝通;子程序則獨立使用記憶體,且利用檔案與其它子程序溝通。前者效能較高,後者比較安全穩定。
本站Apache2的設定檔:
/etc/apache2/conf/apache2.conf
(可能依各作業系統或Linux套件或Apache2版本而路徑有所不同,本站之作業系統環境為2.4.25-gentoo-r2,Apache2之版本為2.0.49-r1)
將PerChild及worker設定部分註解,採用prefork(預設也是以prefork)。(perchild主要設計目的是以不同的用戶和組的身份來運行不同的子程序,還處於實驗性階段,某些情況下並不會按照預期設想的那樣工作,所以Apache官方也並不推薦使用。)
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 100
MaxRequestsPerChild 0
Apache2執行緒檢查防護程式:
目前經過調校過後的Apache2尚還沒有機會驗證對大量連線請求的成效如何,但是為了避免因大量連線請求影響本站的運作,特別寫了一個Apache2執行緒監控防護的Shell Script:
/usr/bin/chk_apache.sh
#!/bin/bash
# Purpose: Monitor and Protect Apache2 Process
# Author: flyfox(flyfox@gen2.homeip.net)
# Lisence: GPL
# Date: 2005/12/15
# Version: 1.0
max_process=60
set_kill=10
apache_id=`cat /var/run/apache2.pid`
apache_process=`ps ax | grep apache2 | wc | awk {‘print $1‘}`
echo "Apache process number is $apache_process"
ps ax | grep apache2 | awk {‘print $1‘} | grep -v $apache_id | tail -n $set_kill > /tmp/kill_process_id
if (("$apache_process" > "$max_process"))
then
echo "Oh…..maybe too many apache process…"
echo "Apache process id is $apache_id"
echo "Kill process id is……"
for process_id in `cat /tmp/kill_process_id`
do
echo "Process id $process_id will be kill"
kill -9 $process_id
done
else
echo "Server is safty….Record counter history"
fi
echo "`date +%Y%m%d%H%M`     $apache_process" >> /usr/share/sensor/apache_process.data
tail -n 500 /usr/share/sensor/apache_process.data > /usr/share/sensor/apache_process.temp
gnuplot /usr/share/sensor/gnuplot_apache_process.script > /var/www/localhost/htdocs/gnuplot_apache_process.png
 
Apache2 and Mysql執行緒數目

將/usr/bin/chk_apache.sh以crontab每分鐘執行一次。
12/16增加監控mysql執行緒功能,並成功發揮功能
日期時間 Apache Mysql
200512161659 12 6
200512161700 12 5
200512161701 12 5
200512161702 12 5
200512161703 12 5
200512161704 12 5
200512161705 12 5
200512161709 25 1 (mysql執行異常)
200512161709 25 1 (mysql執行異常)
200512161710 16 6 (監控防護Shell Script成功回復系統)
200512161711 17 5
200512161712 14 5
200512161713 17 5
200512170200 12 5
200512170200 12 5
200512170202 65 5 (Apache Process超過設定,強迫刪除某些Apache Process)
200512170203 13 5
200512170204 12 5
200512170205 12 5
200512170206 12 5
200512170206 12 5
200512170208 12 5
200512170209 12 5
200512170210 12 5
200512170211 12 5
200512170212 12 6
200512170213 12 5
200512170214 47 6
/usr/bin/chk_apache.sh 版本:1.1
#!/bin/bash
# Purpose: Monitor and Protect Apache2 & Mysql Process
# Author: flyfox(flyfox@gen2.homeip.net)
# Lisence: GPL
# Date: 2005/12/16
# Version: 1.1
max_process=60
set_kill=30
apache_id=`cat /var/run/apache2.pid`
apache_process=`ps ax | grep apache2 | wc | awk {‘print $1‘}`
mysql_process=`ps ax | grep mysql | wc | awk {‘print $1‘}`
echo "Apache process number is $apache_process"
ps ax | grep apache2 | awk {‘print $1‘} | grep -v $apache_id | tail -n $set_kill > /tmp/kill_process_id
if (("$apache_process" > "$max_process"))
then
echo "Oh…..maybe too many apache process…"
echo "Kill process id is……"
for process_id in `cat /tmp/kill_process_id`
do
echo "Process id $process_id will be kill"
kill -9 $process_id
done
else
echo "Server is safty….Record counter history"
fi
if (("$mysql_process" < "2"))
then
echo "Mysql process number is $mysql_process"
/etc/init.d/mysql restart
else
echo "Mysql process number is $mysql_process. Server is safty…."
fi
echo "`date +%Y%m%d%H%M` $apache_process $mysql_process" >> /usr/share/sensor/apache_process.data
tail -n 500 /usr/share/sensor/apache_process.data > /usr/share/sensor/apache_process.temp
gnuplot /usr/share/sensor/gnuplot_apache_process.script > /var/www/localhost/htdocs/gnuplot_apache_process.png
參考資料:
Linux 系管師進階班講義
本站相關:
成效追蹤
迴響 (0)
迴響
RSS feed for comments on this post.
The URI to TrackBack this entry is: http://www.happylinux.tw/modules/wordpress/wp-trackback.php/75