IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php-fpm彻底解决502(php-fpm多开、nginx限制并发、定时重启)解决网站卡顿的终极奥义 -> 正文阅读

[PHP知识库]php-fpm彻底解决502(php-fpm多开、nginx限制并发、定时重启)解决网站卡顿的终极奥义

网站被大量爬虫访问,经常出现访问奇慢的情况,经过不断的探索,终于把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进程三者结合,网站稳定性上一个大台阶,分享给大家。

如有疑问,欢迎交流。?

定时重启记录如下

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 13:54:33  更:2021-07-22 13:56:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/27 12:37:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码