本地Symfony+Nginx+PHP-FPM报错:无法连接FastCGI进程
在本地运行Symfony项目(搭配Nginx和PHP-FPM)时遇到以下错误:
unable to connect to the PHP FastCGI process: dial tcp :53315: socket: too many open files
同时使用symfony serve -d启动Symfony服务器后,Chrome浏览器会出现ERR_CONNECTION_CLOSED错误,执行symfony server:log命令无日志输出。
环境配置:MAC M1 Ventura 13.4、Docker 23.0.5、php 8.2.6、nginx/1.25.0、homebrew、symfony cli 5.5.6。
已尝试的排查步骤:临时提高文件打开限制(ulimit -n 65535)、调整Nginx配置(worker_rlimit_nofile 4096;)、修改PHP-FPM的www.conf(pm.max_requests = 20;)、重启所有服务、重装Nginx/PHP/Symfony CLI,且nginx -t测试配置有效,PHP内置服务器可正常运行。
1. 系统级文件打开限制未永久生效
ulimit -n 65535仅临时生效,重启终端或系统后会重置,需配置永久生效:
- 编辑
/etc/sysctl.conf,添加:kern.maxfiles=65535 kern.maxfilesperproc=65535 - 执行以下命令让配置立即生效:
sudo sysctl -w kern.maxfiles=65535 sudo sysctl -w kern.maxfilesperproc=65535 - 编辑
/etc/launchd.conf(不存在则创建),添加:limit maxfiles 65535 65535 - 重启系统完成配置
2. PHP-FPM进程未继承文件限制
即使系统级调优,PHP-FPM进程可能未获取到新限制,需单独配置:
- 打开PHP-FPM的
www.conf配置文件,添加:rlimit_files = 65535 - 重启PHP-FPM服务
3. Nginx进程配置与资源不匹配
Nginx的worker进程数、连接数设置不合理可能耗尽文件句柄:
- 调整
worker_processes为CPU核心数(M1建议设为8) - 提高
worker_rlimit_nofile并匹配worker_connections:worker_rlimit_nofile 65535; events { worker_connections 10240; use epoll; } - 重启Nginx服务
4. Symfony CLI用户级文件限制未配置
Symfony Serve依赖当前用户的文件限制,需永久设置:
- 编辑
~/.zshrc或~/.bash_profile,添加:ulimit -n 65535 - 执行
source ~/.zshrc(或对应配置文件)加载设置,重启Symfony CLI
5. Docker后台占用过多资源
后台运行的Docker容器可能消耗大量文件句柄:
- 在Docker Desktop的
Settings -> Resources -> Advanced中提高文件句柄限制 - 关闭未使用的Docker容器释放资源
6. 端口残留进程占用
错误中的53315端口可能有残留进程,导致Symfony无法正常绑定:
- 查找占用端口的进程:
lsof -i :53315 - 杀掉对应进程:
kill -9 <PID> - 重新启动Symfony服务
7. PHP-FPM进程管理参数不合理
除pm.max_requests外,需调整其他进程参数避免资源耗尽:
- 根据M1资源配置建议值:
pm.max_children = 20 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 - 重启PHP-FPM服务
内容的提问来源于stack exchange,提问作者bahahmadou94

