目录
回复内容:
首页 后端开发 php教程 nginx-php5-fpm - 当nginx显示502 Bad Gateway错误,如何实现用户无感知的自动重启php-fpm

nginx-php5-fpm - 当nginx显示502 Bad Gateway错误,如何实现用户无感知的自动重启php-fpm

Jun 06, 2016 pm 08:28 PM
nginx php php-fpm

最近nginx间隙性的出现502错误,如何实现自动重启php-fpm呢

想到的解决方案

1、使用crontab定时执行shell脚本,出现错误后重启(每5秒定时执行)
2、使用nohup,shell脚本后台执行

示例脚本

<code>#!/bin/bash
        
while : 
do   

    URL="http://192.168.1.30"
    RESULT=`curl -m 10 -I -s  $URL | grep "HTTP/1.1 502"`
    if [ -n "$RESULT" ]; then
        /etc/init.d/php-fpm restart
    fi  
    sleep 5
done </code>
登录后复制
登录后复制

3、编写nginx模块,通过条件执行shell脚本

能想到的也就是这几种了,感觉这几种方案都不太好,谁有更好的解决方案?

回复内容:

最近nginx间隙性的出现502错误,如何实现自动重启php-fpm呢

想到的解决方案

1、使用crontab定时执行shell脚本,出现错误后重启(每5秒定时执行)
2、使用nohup,shell脚本后台执行

示例脚本

<code>#!/bin/bash
        
while : 
do   

    URL="http://192.168.1.30"
    RESULT=`curl -m 10 -I -s  $URL | grep "HTTP/1.1 502"`
    if [ -n "$RESULT" ]; then
        /etc/init.d/php-fpm restart
    fi  
    sleep 5
done </code>
登录后复制
登录后复制

3、编写nginx模块,通过条件执行shell脚本

能想到的也就是这几种了,感觉这几种方案都不太好,谁有更好的解决方案?

受到fastcgi_next_upstream这个参数的启发,使用PHP-FPM线程池的概念,可以完美的解决502错误(http_502是没有的

http里面的配置

<code>upstream php_fpm_sock{
    server unix:/dev/shm/php-fpm.socket;
    server unix:/dev/shm/php-fpm-b.socket;
    server unix:/dev/shm/php-fpm-c.socket;
}   
fastcgi_next_upstream error timeout invalid_header http_503  http_500;
</code>
登录后复制

server里面fastcgi_pass配置

<code>location ~* \.php$ {
    fastcgi_pass    **unix:php_fpm_sock;**
    fastcgi_index   index.php;
    client_max_body_size 50M;
    client_body_temp_path /data/www/tmp;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi.conf;
    include        fastcgi_params;
}      
</code>
登录后复制

php-fpm的配置

<code>#/etc/php-fpm.conf 文件包含多个配置文件
include=/etc/php-fpm.d/*.conf

#/etc/php-fpm.d/ 目录
www-a.conf
www-b.conf
www-c.conf
#配置,三个文件这里不一致,分别对应
#Start a new pool named www-a   
                                                                          
[www-a]
listen = /dev/shm/php-fpm.socket
</code>
登录后复制

ps -ef 查看

<code>www      17996 31539  0 12:13 ?        00:00:51 php-fpm: pool www-b
www      17999 31539  0 12:13 ?        00:00:48 php-fpm: pool www-a
www      18010 31539  0 12:14 ?        00:00:46 php-fpm: pool www-b
www      18063 31539  0 12:25 ?        00:00:42 php-fpm: pool www-c
www      18153 31539  0 12:47 ?        00:00:34 php-fpm: pool www-c
www      18154 31539  1 12:47 ?        00:00:37 php-fpm: pool www-a
www      18185 31539  0 12:55 ?        00:00:29 php-fpm: pool www-c
www      18313 31539  0 13:24 ?        00:00:10 php-fpm: pool www-a</code>
登录后复制

1、启动的各个PHP-FPM线程池,只要不都挂掉,nginx就可以正常执行PHP,如果有的异常退出了,基本也不影响网站运行
2、fastcgi_next_upstream那行的参数,不需要加http_502,实际你也加不上去的
3、原有的每段类似这种location ~ \.php$ {} 代码都需要对fastcgi_pass这行根据示例改造

Nginx可以配置fastcgi_next_upstream实现故障转移,比如:

<code>fastcgi_next_upstream error timeout invalid_header http_500 http_503;</code>
登录后复制

后端PHP-FPM返回error、timeout等信息则自动切换到upstream里的下一台PHP-FPM应用服务器。

个人觉得最好还是找出PHP-FPM工作进程崩溃的原因,是代码问题,还是系统资源不足导致响应超时。
注意两点,一是不要在PHP-FPM里执行耗时太长或不确定的代码,比如curl发出网络请求。二是PHP-FPM工作进程不是越多越好,个人认为,PHP-FPM工作进程数,设置为2倍CPU核心数就足够了。毕竟,Nginx和MySQL以及系统同样要消耗CPU。根据服务器内存来设置PHP-FPM进程数是非常不合理的,把内存分配给MySQL、Memcached这些服务显然更合适,过多的PHP-FPM进程反而会增加CPU上下文切换的开销。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP:处理数据库和服务器端逻辑 PHP:处理数据库和服务器端逻辑 Apr 15, 2025 am 12:15 AM

PHP在数据库操作和服务器端逻辑处理中使用MySQLi和PDO扩展进行数据库交互,并通过会话管理等功能处理服务器端逻辑。1)使用MySQLi或PDO连接数据库,执行SQL查询。2)通过会话管理等功能处理HTTP请求和用户状态。3)使用事务确保数据库操作的原子性。4)防止SQL注入,使用异常处理和关闭连接来调试。5)通过索引和缓存优化性能,编写可读性高的代码并进行错误处理。

怎么查看nginx是否启动 怎么查看nginx是否启动 Apr 14, 2025 pm 01:03 PM

确认 Nginx 是否启动的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 检查端口 80 是否开放;3. 查看系统日志中 Nginx 启动消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

linux怎么查看nginx是否启动 linux怎么查看nginx是否启动 Apr 14, 2025 pm 12:48 PM

在 Linux 中,使用以下命令检查 Nginx 是否已启动:systemctl status nginx根据命令输出进行判断:如果显示 "Active: active (running)",则 Nginx 已启动。如果显示 "Active: inactive (dead)",则 Nginx 已停止。

linux怎么启动nginx linux怎么启动nginx Apr 14, 2025 pm 12:51 PM

在 Linux 中启动 Nginx 的步骤:检查 Nginx 是否已安装。使用 systemctl start nginx 启动 Nginx 服务。使用 systemctl enable nginx 启用在系统启动时自动启动 Nginx。使用 systemctl status nginx 验证启动是否成功。在 Web 浏览器中访问 http://localhost 查看默认欢迎页面。

nginx在windows中怎么配置 nginx在windows中怎么配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安装 Nginx 并创建虚拟主机配置。修改主配置文件并包含虚拟主机配置。启动或重新加载 Nginx。测试配置并查看网站。选择性启用 SSL 并配置 SSL 证书。选择性设置防火墙允许 80 和 443 端口流量。

PHP的目的:构建动态网站 PHP的目的:构建动态网站 Apr 15, 2025 am 12:18 AM

PHP用于构建动态网站,其核心功能包括:1.生成动态内容,通过与数据库对接实时生成网页;2.处理用户交互和表单提交,验证输入并响应操作;3.管理会话和用户认证,提供个性化体验;4.优化性能和遵循最佳实践,提升网站效率和安全性。

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

怎么解决nginx跨域问题 怎么解决nginx跨域问题 Apr 14, 2025 am 10:15 AM

解决 Nginx 跨域问题有两种方法:修改跨域响应头:添加指令以允许跨域请求,指定允许的方法和头,以及设置缓存时间。使用 CORS 模块:启用模块并配置 CORS 规则,允许跨域请求、方法、头和设置缓存时间。

See all articles