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

求助:Nginx无法在独立Docker容器中执行PHP文件问题

解决Nginx无法执行PHP文件(转为下载)及容器间连接问题

我来帮你一步步排查解决这个问题——核心原因其实是Nginx默认配置没有处理PHP请求的转发规则,再加上容器间的网络连通性需要做针对性配置来确保稳定通信。下面咱们来逐个解决:

1. 先给两个容器配置专属Docker网络

直接把php-fpm的9000端口映射到主机不是容器间通信的最优方案,Docker自定义网络能让容器通过名称互相访问,完全避开IP变动的麻烦:

  • 创建一个专属的通信网络:
    docker network create php-nginx-net
    
  • 重新启动php-fpm容器(加入这个网络,给容器起个好记的名字方便Nginx调用):
    docker run -d --name php-fpm --network php-nginx-net tobi312/rpi-php
    
    (如果之前的php-fpm容器还在运行,先执行docker 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指定运行用户。

额外小提醒

  • 没必要把php-fpm的9000端口映射到主机,容器间用内部网络通信更安全。
  • 后续修改配置后,只需要重启Nginx容器docker restart nginx就能生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:34:57