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

Docker容器中Nginx转发请求至php-apache时出错的问题求助

问题排查与解决方案

错误原因分析

  • 容器间通信端口错误:Nginx配置中fastcgi_pass apache:81是错误的。81是宿主机映射到Apache容器的端口,而Apache容器内部的服务实际监听的是80端口。容器之间的通信不需要经过宿主机映射端口,直接使用容器内部的服务端口即可。
  • 脚本路径配置错误:Nginx的root指向静态文件目录(本地./php/static挂载到容器/var/www/html),但动态文件dynamic1.php存放在Apache容器的/var/www/html目录(本地./php/dynamic挂载)。当前SCRIPT_FILENAME使用Nginx的$document_root,会让Apache去Nginx的静态目录查找脚本,导致文件找不到。

解决方案

1. 修正Nginx配置文件

修改nginx.conf中的两处关键配置:

server {
    listen 0.0.0.0:80;
    root /var/www/html;
    location / {
        index index.php index.html;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass apache:80; # 改为Apache容器内部的80端口
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; # 使用Apache容器内的脚本路径
    }
}

2. 优化Docker Compose配置(可选)

移除冗余的links字段(Docker Compose默认支持服务名DNS解析),并显式配置网络(增强可读性):

version: "3.8"
services:
    db:
        image: "mysql:latest"
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: 1
        volumes:
          - ./mysql:/docker-entrypoint-initdb.d
        ports:
          - "3306"
        networks:
          - app-network
    apache:
        build:
            context: ./apache
        volumes:
          - ./php/dynamic:/var/www/html/
        ports:
            - 81:80
        networks:
          - app-network
    nginx:
        build:
            context: ./nginx
        ports:
            - 82:80
        volumes:
          - ./php/static:/var/www/html/
        networks:
          - app-network
networks:
    app-network:
        driver: bridge

验证步骤

重新构建并启动容器:

docker-compose down
docker-compose up --build

再次访问http://localhost:82/dynamic1.php,即可正常加载动态内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:05:27