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

php-fpm与DNS随机失效问题排查求助

问题分析与解决方案

针对你遇到的随机DNS解析失败问题,结合环境和现象,我整理了几个可能的原因和对应的解决思路:

1. PHP-FPM子进程资源泄漏(最可能的原因)

你的问题在重启PHP-FPM后恢复,且周期1-3个月,这大概率是长时间运行的PHP-FPM子进程出现了DNS解析相关的资源泄漏。比如进程内的DNS缓存句柄、系统调用资源没有被正确释放,随着进程运行时间增加,最终无法发起新的DNS查询。

解决办法:

修改PHP-FPM的配置文件(通常是/etc/php-fpm.d/www.conf),设置pm.max_requests参数,让子进程处理一定数量的请求后自动重启,避免资源累积:

pm.max_requests = 500  # 可根据实际负载调整,比如1000以内

保存配置后重启PHP-FPM:

systemctl restart php-fpm

这个设置会让每个子进程处理500个请求后自动退出,由主进程重新生成新的子进程,从根源上避免资源泄漏的累积。

2. 系统DNS解析配置或服务异常

CentOS 7的DNS解析机制可能存在配置不合理,或者缓存服务(如nscd)异常,导致PHP进程偶尔无法获取域名解析结果。单会话多次调用解析函数触发问题,也可能是进程内的DNS缓存逻辑出现异常。

解决办法:

  • 调整DNS超时与重试:编辑/etc/resolv.conf,添加或修改options参数,优化DNS解析的容错性:
    options timeout:2 attempts:3
    
    这个设置让DNS查询超时时间设为2秒,重试3次,减少因网络波动导致的解析失败。
  • 检查DNS缓存服务:如果服务器启用了nscd(名称服务缓存守护进程),尝试重启它:
    systemctl restart nscd
    
    也可以考虑禁用nscd,改用PHP自身的DNS缓存(如果你的PHP版本支持),或者直接使用公共DNS服务器(比如在resolv.conf中添加nameserver 8.8.8.8)。

3. PHP-FPM进程数的间接影响

虽然日志提示pm.max_children达到8,但服务器运行正常,不过当进程池满负荷时,可能会导致单个进程的资源分配受限,间接影响DNS解析的系统调用。

解决办法:

先计算当前PHP-FPM进程的内存占用,再调整pm.max_children到合理值:

  1. 查看当前所有PHP-FPM进程的总内存占用:
    ps aux | grep php-fpm | awk '{sum+=$6} END {print "Total PHP-FPM memory usage: " sum/1024 " MB"}'
    
  2. 根据服务器可用内存调整pm.max_children,比如服务器有2GB内存,扣除系统和Apache占用的1GB,可设置pm.max_children = 20(假设每个PHP进程占用50MB)。同时配套调整其他进程池参数:
    pm.start_servers = 5
    pm.min_spare_servers = 3
    pm.max_spare_servers = 8
    
    这样让进程池的数量更灵活,避免瞬间满负荷。

4. PHP 7.x版本的已知BUG

部分PHP 7.x早期版本存在DNS解析相关的BUG,比如长时间运行的进程中DNS解析状态异常、资源泄漏等。虽然你提到环境已更新,但可能仍存在未覆盖的补丁问题。

解决办法:

  • 升级到当前PHP 7.x分支的最新稳定版(比如PHP 7.4的最新补丁版),官方通常会修复这类长期运行的进程问题。
  • 如果业务允许,尝试升级到PHP 8.1+版本,新版本在网络和资源管理上有更完善的优化。

内容的提问来源于stack exchange,提问作者step

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:57:12