Digital Ocean上PHP-FPM容器与Caddy搭配后间歇性无响应求助
问题总结
三台搭载Docker的DigitalOcean Ubuntu云服务器实例,以Caddy作为反向代理,其中2台使用PHP-FPM、1台使用PHP-FPM Alpine版本。运行一段时间后(几天到3-4周不等,近期部分实例每日故障),所有请求停止响应,Caddy/Nginx均返回502 Bad Gateway,日志显示连接PHP-FPM端口超时,但PHP容器仍处于运行状态,重启Caddy或PHP容器即可恢复服务。
排查与修复建议
1. 检查PHP-FPM连接池配置
PHP-FPM连接池耗尽会导致无法接受新连接,即便容器仍运行。
- 进入PHP容器查看池配置:
docker exec -it PHP_CONTAINER cat /usr/local/etc/php-fpm.d/www.conf - 重点关注以下参数:
pm.max_children:最大子进程数,需根据服务器内存调整(建议每进程占用内存×数量 ≤ 容器可用内存)request_terminate_timeout:脚本最大执行时间,避免长时间运行的脚本挂死进程pm.max_spare_servers:最大空闲进程数,防止进程过度堆积
- 启用慢请求日志追踪异常脚本:
在www.conf中添加:
挂载日志目录到宿主机,便于排查超时脚本。slowlog = /var/log/php-fpm/slow.log request_slowlog_timeout = 10s
2. 优化Caddy FastCGI连接配置
默认的php_fastcgi配置可能存在连接泄漏或超时设置不合理的问题,调整参数优化长连接管理:
mydomain.com { root * /var/www/public php_fastcgi /* php:9000 { keepalive 20 # 限制长连接数量,避免连接堆积 dial_timeout 5s # 缩短连接超时时间 read_timeout 30s # 调整请求读取超时 } file_server }
3. 排查Docker网络连接问题
故障发生时,先验证网络连通性:
- 在Caddy容器内测试PHP-FPM端口:
docker exec -it CADDY_CONTAINER nc -zv php 9000 - 检查宿主机/容器内的TCP连接状态,查看是否有大量TIME_WAIT或ESTABLISHED连接堆积:
netstat -anp | grep 9000 - 调整宿主机内核参数优化TCP连接回收,在
/etc/sysctl.conf添加:
执行net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.core.somaxconn = 1024sysctl -p使参数生效。
4. 添加容器健康检查实现自动恢复
通过Docker健康检查,自动重启故障服务:
Docker Compose示例:
services: php: build: ./php healthcheck: test: ["CMD-SHELL", "nc -zv 127.0.0.1 9000 || exit 1"] interval: 30s timeout: 5s retries: 3 start_period: 60s caddy: image: caddy:latest healthcheck: test: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"] interval: 30s timeout: 5s retries: 3
5. 排查应用代码与扩展问题
- 检查PHP应用是否存在数据库连接泄漏、未关闭的资源句柄,导致进程挂死
- 对于WordPress站点,禁用第三方插件逐一排查,确认是否存在插件导致的内存泄漏或长时间运行脚本
内容的提问来源于stack exchange,提问作者bonsay
相关产品推荐
相关产品推荐

