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

