如何通过Docker Compose关联Nginx与PHP-FPM容器并解决页面显示异常问题
如何通过Docker Compose关联Nginx与PHP-FPM容器并解决页面显示异常问题
兄弟,我太懂你这种跟着教程一步步走,结果页面跳出Nginx默认欢迎页的憋屈感了!我刚学Docker Compose的时候也踩过这个坑,咱们一步步把问题拆解解决掉。
首先,核心问题大概率出在容器网络通信或者Nginx配置没正确转发PHP请求上,咱们从最基础的配置开始排查:
一、先确认你的Docker Compose配置是否正确
我给你一个经过验证的基础配置模板,你可以对比自己的文件:
version: '3.8' services: nginx: image: nginx:latest ports: - "80:80" volumes: # 挂载本地代码目录到Nginx的网页根目录 - ./html:/usr/share/nginx/html # 挂载自定义Nginx配置,覆盖默认配置 - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: # 确保PHP服务先启动(避免时序问题) - php networks: # 加入自定义网络,让容器之间能互相通信 - app-network php: image: php:8.2-fpm volumes: # 同样挂载本地代码目录到PHP的工作目录,和Nginx保持同步 - ./html:/var/www/html networks: - app-network # 定义共享网络 networks: app-network: driver: bridge
这里要注意几个关键点:
- 两个容器必须加入同一个自定义网络(
app-network),这样它们才能用服务名(比如php)互相通信,而不是靠随机的网络。 - 本地的
./html目录要同时挂载到Nginx和PHP容器里,这样两边访问的是同一套代码,避免出现Nginx能看到文件但PHP找不到的情况。
二、Nginx配置是关键!别让请求走默认路由
你看到默认欢迎页,90%是因为Nginx没把.php结尾的请求转发给PHP-FPM。创建一个nginx.conf文件放在项目根目录,内容如下:
server { listen 80; server_name localhost; # 这个根目录要和Nginx容器里挂载的路径一致 root /usr/share/nginx/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } # 处理所有.php结尾的请求,转发给PHP-FPM location ~ \.php$ { # 这里的`php`是Docker Compose里PHP服务的名字,容器之间用服务名就能通信 fastcgi_pass php:9000; fastcgi_index index.php; # 告诉PHP要执行的文件路径,必须和PHP容器里的代码目录对应 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
重点划重点:fastcgi_pass php:9000里的php必须和你Docker Compose里PHP服务的名称完全一致,不能写错!这是容器之间通信的关键,写错了Nginx就找不到PHP服务,只能返回默认页面。
三、检查你的代码文件和目录
- 在项目根目录创建
html文件夹,里面放index.php文件,内容就是你要的:
<?php echo "Hello from PHP!"; ?>
- 确保本地目录权限没问题,开发环境下可以简单执行
chmod -R 755 ./html,让容器能正常读取文件。
四、启动容器并排查问题
- 先清理旧容器(避免残留问题):
docker-compose down
- 启动服务:
docker-compose up -d
- 查看日志找问题:
- 看Nginx日志:
docker-compose logs nginx,如果有类似connect() failed (111: Connection refused) while connecting to upstream,说明Nginx连不上PHP,检查网络或者服务名。 - 看PHP日志:
docker-compose logs php,如果有No such file or directory,说明PHP找不到代码文件,检查挂载路径是否正确。
- 可以进Nginx容器测试网络:
docker exec -it [你的Nginx容器ID] ping php
如果能ping通,说明网络没问题;ping不通的话,检查Docker Compose里的网络配置。
为什么会出现Nginx默认页面?
你看到的"Welcome to nginx!"页面,本质是Nginx用了默认的配置文件,没有把PHP请求转发给PHP-FPM,或者你的
index.php文件不存在/路径不对,Nginx只能返回它的默认欢迎页。
内容来源于stack exchange
相关产品推荐
相关产品推荐

