網站被大量爬蟲訪問,經常出現訪問奇慢的情況,經過不斷的探索,終于把php-fpm多開、nginx限制并發、定時重啟php-fpm三者結合起來,解決了困擾已久的難題,
第一步、php-fpm多開
要修改三個地方,nginx配置,php配置,/etc/init.d/中增加php-fpm2
nginx里面添加
upstream backend
{
server 127.0.0.1:9000;
server 127.0.0.1:9002;
}
轉發用tcp協議,不用sock,主要的原因是tcp更穩定,速度差別感覺不到
server中修改
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass backend;
fastcgi_index index.php;
include fastcgi.conf;
}
php組態檔復制一份,分別是php-fpm.conf和php-fpm2.conf
位置在php/etc里面
php-fpm.conf
[global]
pid = run/php-fpm.pid
error_log = /root/php.log
log_level = warning
[www]
listen = 127.0.0.1:9000
listen.backlog = 4096
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 10240
request_terminate_timeout = 100
request_slowlog_timeout = 20
slowlog = /root/slow.log
php-fpm2.conf
[global]
pid = run/php-fpm2.pid
error_log = /root/php.log
log_level = warning
[www]
listen = 127.0.0.1:9002
listen.backlog = 4096
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 10240
request_terminate_timeout = 100
request_slowlog_timeout = 20
slowlog = /root/slow.log
重點講講
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 10240
由于是開了兩個php-fpm,因此開始的時候是10+10=20個行程,最高的時候限制為120個,正常在60個以內是夠用的,
max_spare_servers要低于max_children,好處是高并發后會自動降低行程,減少系統開銷,
cd /etc/init.d
復制一份php-fpm,名稱 php-fpm2
php-fpm2 全部內容
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
prefix=/www/server/php/56
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm2.conf
php_fpm_PID=${prefix}/var/run/php-fpm2.pid
php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"
wait_for_pid () {
try=0
while test $try -lt 35 ; do
case "$1" in
'created')
if [ -f "$2" ] ; then
try=''
break
fi
;;
'removed')
if [ ! -f "$2" ] ; then
try=''
break
fi
;;
esac
echo -n .
try=`expr $try + 1`
sleep 1
done
}
case "$1" in
start)
echo -n "Starting php-fpm "
$php_fpm_BIN --daemonize $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Gracefully shutting down php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -QUIT `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed. Use force-quit"
exit 1
else
echo " done"
fi
;;
status)
if [ ! -r $php_fpm_PID ] ; then
echo "php-fpm is stopped"
exit 0
fi
PID=`cat $php_fpm_PID`
if ps -p $PID | grep -q $PID; then
echo "php-fpm (pid $PID) is running..."
else
echo "php-fpm dead but pid file exists"
fi
;;
force-quit)
echo -n "Terminating php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -TERM `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$0 stop
$0 start
;;
reload)
echo -n "Reload service php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -USR2 `cat $php_fpm_PID`
echo " done"
;;
configtest)
$php_fpm_BIN -t
;;
*)
echo "Usage: $0 {start|stop|force-quit|restart|reload|status|configtest}"
exit 1
;;
esac
核心是修改
prefix=/www/server/php/56
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm2.conf
php_fpm_PID=${prefix}/var/run/php-fpm2.pid
然后執行
chkconfig --add php-fpm2
設定開機啟動
至此,php-fpm雙開已經完成,
第二步、限制nginx并發
在nginx的http中添加
limit_conn_zone $binary_remote_addr zone=one:10m;
limit_req_zone $binary_remote_addr zone=two:100m rate=10r/s;
server中添加
limit_conn one 10;
limit_req zone=two burst=10;
限制單個ip連接數低于10個,并發數10(burst=10),可根據情況修改為20或者30,經測驗不帶nodelay更穩定,
第三步、定時重啟
重啟服務
vi /sbin/cq
#/bin/bash
/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
/etc/init.d/php-fpm2 restart
/etc/init.d/mysql restart
平滑重啟服務
vi /sbin/cq2
#! /bin/sh
getDateTime(){
date "+%m-%d %H:%M:%S"
}
date=$(getDateTime)
count=$(ps aux | grep -c php-fpm)
echo "$date -- $count" >> /www/jt160/cq.txt
/etc/init.d/php-fpm reload
sleep 1
/etc/init.d/php-fpm2 reload
/etc/init.d/mysql reload
添加執行權限
chmod +x /sbin/*
定時每20秒平滑重啟php-fpm,解決php-fpm卡死的問題,經測驗,非常好用,
crontab -e
* * * * * /sbin/cq2
* * * * * sleep 20;/sbin/cq2
* * * * * sleep 40;/sbin/cq2
重啟的記錄保存在 /www/jt160/cq.txt 可以是網站目錄,可以隨時查看,通常100以內是正常的,php-fpm超過100就是負載太高的時候,一目了然,
重啟所有服務輸入命令 cq 即可
通過php-fpm多開、nginx限制并發、定時重啟php-fpm行程三者結合,網站穩定性上一個大臺階,分享給大家,
如有疑問,歡迎交流,
定時重啟記錄如下

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289536.html
標籤:其他
