Nginx readv()报错求助:Connection reset by peer(RHEL6+PHP-FPM5.6)
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),搜索类似关键词:
如果存在这类日志,说明worker进程因段错误崩溃,大概率是某个PHP扩展存在稳定性问题。child xxxx exited on signal xx (SIGSEGV) after yyy seconds from start
进阶定位:开启Core Dump精准排查崩溃点
若确认进程崩溃,开启core dump可以定位到具体崩溃源:
- 在PHP-FPM的pool配置(如
/etc/php-fpm.d/www.conf)中添加:rlimit_core = unlimited - 修改系统core dump限制,执行命令:
要永久生效,可在ulimit -c unlimited/etc/security/limits.conf中添加:* soft core unlimited * hard core unlimited - 重启PHP-FPM:
service php-fpm restart - 问题触发后,会在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/sessionapache或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.

