求助:Nginx无法在独立Docker容器中执行PHP文件问题
解决Nginx无法执行PHP文件(转为下载)及容器间连接问题
我来帮你一步步排查解决这个问题——核心原因其实是Nginx默认配置没有处理PHP请求的转发规则,再加上容器间的网络连通性需要做针对性配置来确保稳定通信。下面咱们来逐个解决:
1. 先给两个容器配置专属Docker网络
直接把php-fpm的9000端口映射到主机不是容器间通信的最优方案,Docker自定义网络能让容器通过名称互相访问,完全避开IP变动的麻烦:
- 创建一个专属的通信网络:
docker network create php-nginx-net - 重新启动php-fpm容器(加入这个网络,给容器起个好记的名字方便Nginx调用):
(如果之前的php-fpm容器还在运行,先执行docker run -d --name php-fpm --network php-nginx-net tobi312/rpi-phpdocker stop 容器ID再docker rm 容器ID清理掉)
2. 配置Nginx转发PHP请求到php-fpm
默认的Nginx配置根本不知道怎么处理.php文件,你需要自定义一个配置文件,让Nginx明确把PHP请求交给php-fpm容器处理:
步骤2.1 编写Nginx自定义配置
在LibreELEC的存储目录(比如/storage/nginx-config/)下创建一个default.conf文件,内容如下:
server { listen 80; server_name localhost; # 网站根目录,要和容器挂载的路径一致 root /var/www/html; index index.php index.html index.htm; # 处理PHP请求的核心规则 location ~ \.php$ { # 用php-fpm容器的名称访问,因为在同一网络里可以直接解析 fastcgi_pass php-fpm:9000; fastcgi_index index.php; # 告诉php-fpm文件的实际路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 静态文件直接返回,提升访问速度 location / { try_files $uri $uri/ =404; } }
步骤2.2 启动Nginx容器(挂载配置和网站目录)
先把你的网站文件放到主机的某个目录(比如/storage/webroot/),然后启动Nginx时挂载这个目录和刚才的配置文件,同时加入同一个网络:
docker run -d --name nginx --network php-nginx-net \ -p 80:80 \ -v /storage/webroot:/var/www/html \ -v /storage/nginx-config/default.conf:/etc/nginx/conf.d/default.conf \ tobi312/rpi-nginx
3. 验证配置是否生效
- 在
/storage/webroot里创建一个info.php测试文件,内容:<?php phpinfo(); ?> - 访问树莓派的IP地址(比如
http://你的树莓派IP/info.php),如果能正常显示PHP信息页面,说明配置成功;如果还是下载文件,检查这几点:- 确认Nginx加载了自定义配置:进入容器
docker exec -it nginx bash,查看/etc/nginx/conf.d/default.conf内容是否和你编写的一致。 - 检查php-fpm监听地址:进入php-fpm容器
docker exec -it php-fpm bash,查看/usr/local/etc/php-fpm.d/www.conf里的listen参数,确保是listen = 0.0.0.0:9000(这个镜像默认应该配置好了,但可以确认下)。 - 调整网站目录权限:LibreELEC的用户权限可能和容器内的
www-data用户不一致,执行chmod -R 755 /storage/webroot给目录赋权,或者启动容器时加上-u www-data指定运行用户。
- 确认Nginx加载了自定义配置:进入容器
额外小提醒
- 没必要把php-fpm的9000端口映射到主机,容器间用内部网络通信更安全。
- 后续修改配置后,只需要重启Nginx容器
docker restart nginx就能生效。
内容的提问来源于stack exchange,提问作者ManuKILLED
相关产品推荐
相关产品推荐

