黑帽联盟

标题: 防止Apache并发连接太多,超负荷运行导致系统崩溃 [打印本页]

作者: 定位    时间: 2017-2-1 18:57
标题: 防止Apache并发连接太多,超负荷运行导致系统崩溃
当网站被恶意攻击时,又没有硬防的情况下,可以使用下面方法,此方法是定期检查Apache的进程数,发现连接过多然后自动重启Apache,虽然有些笨,但还是比较有效的.

新建一Shell脚本文件,命名为checkapache,内容如下:
  1. #!/bin/sh -e
  2. #
  3. # Check overload apache2
  4. #

  5. #最大Apache进程数,超过则重启Apache
  6. maxpids=600
  7. #检查进程时间间隔
  8. interval=10
  9. #日志文件
  10. logfile=”/var/log/checkapache.log”
  11. 以上文件内容大致意思是每隔10秒种检查一次Apache进程数,如果超过600个Apache进程,则重启Apache服务,当然,这个maxpids和Interval参数依服务器承受能力而定。
  12. echo ” Starting CheckApache MaxConn: $maxpids ” >> $logfile
  13. date >> $logfile
  14. while [ 1 ]
  15. do
  16. pnums=$(ps ax | grep “[/]usr/sbin/apache2″ | wc -l)
  17. if [ “$pnums” = “0″ ]; then
  18. sleep 5
  19. echo “**********************************************” >> $logfile
  20. date >> $logfile
  21. echo “———Starting apache2….—————” >> $logfile
  22. /etc/init.d/apache2 start >> $logfile
  23. fi
  24. #pids=$(ps ax | grep “[/]usr/sbin/apache2″ | awk ‘{print $1}’)
  25. if [ $pnums -gt $maxpids ]; then
  26. #echo $pnums
  27. #for i in $pids; do
  28. #    kill $i
  29. #done
  30. #sleep 10
  31. echo “**********************************************” >> $logfile
  32. date >> $logfile
  33. echo “Too much pids: $pnums ..Re Starting apache2….” >> $logfile
  34. /etc/init.d/apache2 stop >> $logfile
  35. sleep 5
  36. /etc/init.d/apache2 start >> $logfile
  37. sleep 2
  38. fi
  39. sleep $interval
  40. done
复制代码
为了保障checkapache能正常运行工作,新建一个Cron来定时驱动另一个Shell文件checkrun,定期检查checkapache是否正常工作,checkrun的内容如下:
  1. #!/bin/sh -e
  2. # /var/log/checkrun
  3. #
  4. # Written by rocdk890
  5. DAEMON=/var/log/checkapache
  6. PIDFILE=/var/log/checkapache.pid
  7. NAME=ChechApache
  8. test -x $DAEMON || exit 0
  9. . /lib/lsb/init-functions
  10. if [ -f $PIDFILE ]
  11. then
  12. PID=`cat $PIDFILE`
  13. if [ “x$PID” != “x” ] && kill -0 $PID 2>/dev/null ; then
  14. STATUS=”PID: $PID :running”
  15. RUNNING=1
  16. else
  17. STATUS=”PID $PID :not running”
  18. RUNNING=0
  19. fi
  20. else
  21. STATUS=”NO PIDFILE:not running”
  22. RUNNING=0
  23. fi
  24. echo ” * $STATUS”
  25. case “$1″ in
  26. start)
  27. log_begin_msg “Starting Apache-Check server: $NAME”
  28. if [ $RUNNING = 1 ]; then
  29. log_begin_msg “is running”
  30. else
  31. sudo start-stop-daemon –start –background -m –pidfile $PIDFILE –exec $DAEMON && log_end_msg 0 || log_end_msg 1
  32. fi
  33. ;;
  34. stop)
  35. log_begin_msg “Stopping Apache-Check server: $NAME”
  36. kill -9 $PID && log_end_msg 0 || log_end_msg 1
  37. #sudo start-stop-daemon –stop –pidfile $PIDFILE –signal 1 –exec $DAEMON && log_end_msg 0 || log_end_msg 1
  38. ;;
  39. *)
  40. log_success_msg “Usage: $DEAMON {start|stop}”
  41. exit 1
  42. ;;
  43. esac
  44. exit 0
复制代码
此checkrun脚本由Cron定期执行,检查checkapache这个脚本是否运行正常,如果发现checkapache没有运行,则重新启动它。

cron新加指令代码行如:*/1 * * * * /var/log/checkshd start

意即每一分钟检查一次,可以定期检查一下日志文件/var/log/checkapache.log的内容,掌握Apache服务器的运行状态.





欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5