宿主机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
相关产品推荐
相关产品推荐

