Docker容器entrypoint中nginx启动后PHP-fpm无法自动启动问题求助
问题根因
你现有脚本的问题在于nginx -g 'daemon off;'命令会以前台模式运行Nginx,会阻塞脚本后续命令的执行,所以service php7.4-fpm start永远没有执行机会,这就是PHP-FPM没有自动启动的核心原因。
解决方案
方案1:调整启动顺序(轻量场景适用)
只需要调换两条命令的顺序,先后台启动PHP-FPM,再前台运行Nginx作为容器主进程即可,修改后的entrypoint.sh内容如下:
#!/usr/bin/env sh set -e # 先启动PHP-FPM service php7.4-fpm start # 最后前台启动Nginx,作为容器主进程阻塞运行 nginx -g 'daemon off;'
该方案实现简单,无需额外安装依赖,适合测试或低负载场景使用。缺点是仅Nginx为容器主进程,若PHP-FPM意外退出容器无法感知,不会自动重启。
方案2:使用supervisor管理多进程(生产场景适用)
如果需要同时监控Nginx和PHP-FPM的运行状态,任意进程异常都能自动重启,可以用supervisor作为进程管理工具,操作步骤如下:
- 在构建镜像时安装supervisor,Debian/Ubuntu系镜像可添加命令
apt update && apt install -y supervisor - 新建supervisor配置文件
/etc/supervisor/conf.d/services.conf,内容如下:
[supervisord] nodaemon=true logfile=/var/log/supervisord.log pidfile=/var/run/supervisord.pid [program:php-fpm] command=service php7.4-fpm start autostart=true autorestart=true priority=10 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:nginx] command=nginx -g 'daemon off;' autostart=true autorestart=true priority=20 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
- 修改Dockerfile的ENTRYPOINT配置:
ENTRYPOINT ["supervisord", "-c", "/etc/supervisor/conf.d/services.conf"]
该方案能保证两个进程的运行稳定性,任意进程异常退出都会被自动拉起,适合生产环境使用。
内容的提问来源于stack exchange,提问作者kevin chua
相关产品推荐
相关产品推荐

