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

宿主机Nginx连接php-fpm容器TCP通信的listen配置问题

宿主机Nginx对接容器化php-fpm配置方案

报错核心原因

将容器内php-fpm的listen参数设置为宿主机IP:9000时启动失败,本质是容器拥有独立的网络命名空间,内部不存在宿主机的物理网卡IP,php-fpm无法绑定不属于自身网络环境的地址,直接触发FPM初始化报错。

正确配置步骤

1. 容器内php-fpm pool配置调整

编辑容器内的php-fpm进程池配置文件(php:7.1-fpm镜像默认路径为/usr/local/etc/php-fpm.d/www.conf),将listen参数修改为:

listen = 0.0.0.0:9000

该配置代表php-fpm监听容器内所有网卡的9000端口,允许来自容器内部任意网卡的请求,禁止在该参数中填写宿主机IP或者容器外的任意地址。配置中listen.owner、listen.group保持官方镜像默认的www-data即可,无需额外修改。

2. 容器启动端口映射配置

启动php-fpm容器时必须配置端口映射规则,将容器的9000端口转发到宿主机本地,启动命令参考:

docker run -d \
  --name php71-fpm \
  -v /your/website/root/path:/var/www/html \
  -p 127.0.0.1:9000:9000 \
  your-custom-php-image:latest

注意:-v参数挂载的网站根路径必须和Nginx配置中指向的网站路径完全对应,否则会出现文件找不到的404错误;端口映射参数-p 127.0.0.1:9000:9000仅将容器9000端口绑定到宿主机回环地址,不会暴露到公网,安全性更高,不需要绑定宿主机公网IP。

3. 宿主机Nginx配置调整

宿主机上的Nginx不需要将fastcgi_pass改为宿主机IP,直接保持指向本地回环即可,配置参考:

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
    include fastcgi_params;
}

配置修改完成后执行nginx -t校验配置语法,无误后执行nginx -s reload重载Nginx即可。

前置检查项

  • 必须完全停止宿主机本地原有的php-fpm服务,避免9000端口被占用导致容器映射失败,执行命令:
    systemctl stop php-fpm
    systemctl disable php-fpm
    
  • 停服后执行ss -tulnp | grep 9000检查端口占用,确认无本地进程监听9000端口后再启动php-fpm容器。
  • 必须保证容器内挂载的网站文件路径和Nginx配置中传递给fastcgi的SCRIPT_FILENAME路径完全匹配,否则会出现"No input file specified"类错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:21:32