You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx readv()报错求助:Connection reset by peer(RHEL6+PHP-FPM5.6)

解决Nginx readv() failed (104: Connection reset by peer) 随机500错误的排查方案

针对你在RHEL 6 + Nginx 1.12.2 + PHP-FPM 5.6环境中遇到的随机500错误,结合你已经排查过的点,我整理了几个高优先级的排查方向和解决方案:


1. 排查PHP-FPM Worker进程是否异常崩溃

这个错误最常见的诱因是PHP-FPM的worker进程在处理请求时意外退出,导致Nginx与后端的连接被强制重置。虽然你开启了catch_workers_output,但像段错误这类底层崩溃可能不会被普通日志捕获,需要重点检查PHP-FPM的进程日志:

  • 查看PHP-FPM默认进程日志(通常路径为/var/log/php-fpm/www.log),搜索类似关键词:
    child xxxx exited on signal xx (SIGSEGV) after yyy seconds from start
    
    如果存在这类日志,说明worker进程因段错误崩溃,大概率是某个PHP扩展存在稳定性问题。

进阶定位:开启Core Dump精准排查崩溃点

若确认进程崩溃,开启core dump可以定位到具体崩溃源:

  1. 在PHP-FPM的pool配置(如/etc/php-fpm.d/www.conf)中添加:
    rlimit_core = unlimited
    
  2. 修改系统core dump限制,执行命令:
    ulimit -c unlimited
    
    要永久生效,可在/etc/security/limits.conf中添加:
    * soft core unlimited
    * hard core unlimited
    
  3. 重启PHP-FPM:service php-fpm restart
  4. 问题触发后,会在PHP-FPM运行目录生成core文件,用gdb分析调用栈:
    gdb /usr/bin/php /path/to/core-file
    (gdb) bt full
    
    输出的调用栈会直接指向崩溃的扩展或代码行。

2. 调整TCP连接与队列参数

你使用TCP端口连接Nginx与PHP-FPM,RHEL 6的2.6.32内核默认TCP参数可能无法支撑高并发或快速连接复用,进而引发连接重置:

修改内核TCP参数

编辑/etc/sysctl.conf,添加以下优化参数:

net.core.somaxconn = 2048          # 提升系统最大监听队列长度
net.ipv4.tcp_tw_reuse = 1         # 允许复用TIME_WAIT状态的连接
net.ipv4.tcp_tw_recycle = 1       # 快速回收TIME_WAIT连接
net.ipv4.tcp_fin_timeout = 30     # 缩短FIN等待时间
net.ipv4.tcp_syncookies = 1       # 开启SYN Cookie防御SYN洪水

执行sysctl -p让参数立即生效。

调整PHP-FPM监听队列

在PHP-FPM pool配置中增大监听队列容量:

listen.queue_size = 2048

重启PHP-FPM生效。

调整Nginx Worker连接数

确保Nginx的worker_connections足够覆盖PHP-FPM的最大进程数,在nginx.conf的events块中修改:

events {
    worker_connections 2048;  # 需大于你设置的pm.max_children(1000)
}

重启Nginx生效。


3. 排查SELinux限制

RHEL 6默认开启SELinux,可能会阻止PHP-FPM的某些操作(如读写特定文件、连接外部服务),导致进程异常退出:

  • 临时关闭SELinux测试:setenforce 0
  • 如果问题消失,说明SELinux是诱因,可查看/var/log/audit/audit.log中的deny记录,针对性调整策略:
    audit2allow -a -M php-fpm-custom
    semodule -i php-fpm-custom.pp
    

4. 检查PHP会话存储目录权限

你的PHP会话存储在/var/lib/php/session,若目录权限或SELinux上下文不正确,可能导致PHP进程读写会话时出错:

  • 检查目录权限与上下文:
    ls -ldZ /var/lib/php/session
    
    确保所有者为apache或nginx(取决于PHP-FPM运行用户),SELinux上下文为httpd_sys_rw_content_t。
  • 权限异常时修复:
    chown -R apache:apache /var/lib/php/session
    chcon -R -t httpd_sys_rw_content_t /var/lib/php/session
    

5. 临时禁用可疑PHP扩展

你安装了多个PECL扩展(如imagick、memcached、ssh2等),部分旧版本扩展可能存在稳定性bug:

  • 临时注释php.ini或/etc/php.d/下的扩展配置(比如注释/etc/php.d/imagick.ini中的extension=imagick.so),逐一禁用后测试,排查是否是某个扩展导致的问题。
  • 若找到问题扩展,尝试升级到该扩展的最新稳定版本(适配PHP 5.6)。

内容的提问来源于stack exchange,提问作者Chad E.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:43:03