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

Dockerfile如何在ENTRYPOINT中同时启动Nginx与php7.4-fpm多进程

问题结论

你当前使用的exec形式ENTRYPOINT无法直接同时启动两个进程,这种写法里所有后续参数都会作为nginx的命令参数传入,无法单独启动php-fpm。

可行解决方案

以下两种方案均可实现同时启动两个进程,优先推荐第一种:

方案1:自定义启动脚本(最稳定)

  1. 先在构建上下文目录新建启动脚本start.sh,内容如下:
#!/bin/bash
# 后台启动php7.4-fpm
service php7.4-fpm start
# 前台启动Nginx作为容器主进程,保持容器运行
nginx -g 'daemon off;'

如果service命令不可用,也可以直接调用php-fpm二进制后台启动:

/usr/sbin/php-fpm7.4 -D
  1. 修改Dockerfile配置,添加脚本复制、授权逻辑,替换原有ENTRYPOINT:
# 复制启动脚本到容器内
COPY start.sh /start.sh
# 给脚本添加执行权限
RUN chmod +x /start.sh
# 替换原有ENTRYPOINT
ENTRYPOINT ["/start.sh"]

这个方案的优势是主进程为Nginx,容器可以正常接收终止信号,还可以灵活添加启动前的配置修改、权限调整等自定义逻辑。

方案2:shell形式ENTRYPOINT(快速实现)

如果你不想额外加脚本,也可以直接用shell形式的ENTRYPOINT一行实现:

ENTRYPOINT service php7.4-fpm start && nginx -g 'daemon off;'

注意这种方案的主进程是shell,会存在信号传递问题,docker stop时可能无法正常终止Nginx、php-fpm进程,仅适合测试场景临时使用。

额外注意事项

两个进程都启动后还需要确认Nginx配置的PHP转发规则和php-fpm的监听地址一致:

  • 打开Nginx站点配置,找到location ~ \.php$块
  • 确认fastcgi_pass参数的值,和/etc/php/7.4/fpm/pool.d/www.conf里的listen参数完全匹配,比如都为127.0.0.1:9000或者/run/php/php7.4-fpm.sock,否则PHP页面依然会访问失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:57:04