Docker挂载volume后Nginx未解析/var/www/html下index.php问题
问题根因
- Nginx默认配置优先级问题:官方Nginx镜像默认的站点配置中,
index指令的排序为index index.html index.htm;,index.html的优先级远高于index.php,只要目录下存在index.html就会优先返回该文件。你手动拷贝文件时大概率同步修改了容器内的Nginx配置调整了优先级,但是重新创建容器时使用的是原始镜像的默认配置,没有保留修改后的配置,所以挂载目录时就出现了优先返回html的问题。 - PHP解析规则缺失:官方Nginx镜像默认没有配置PHP请求的转发规则,即使调整了index优先级,没有对应php-fpm的转发配置也无法解析PHP文件,会直接返回PHP文件下载或者报错。你手动拷贝文件功能正常,说明你之前修改过容器内的Nginx配置添加了PHP解析规则,但是重新run容器时没有持久化该配置,导致挂载目录时配置失效。
- 挂载覆盖问题:你直接挂载本地目录到容器的
/var/www/html路径,不会修改容器内的Nginx配置,之前手动修改的容器内配置没有被持久化,新启动的容器依然使用默认配置,这是只有挂载时才出现问题的核心原因。
解决步骤
- 本地准备自定义Nginx配置
在本地创建配置文件(比如路径为~/docker-image/nginx/default.conf),内容参考如下:
server { listen 80; listen [::]:80; server_name localhost; root /var/www/html; # 调整优先级,把index.php放在最前面 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } # 新增PHP解析规则,如果你是用单独的php-fpm容器,把fastcgi_pass改成你的php容器名称:9000,比如php-fpm:9000 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意:如果你使用的是Nginx+PHP一体化镜像,确认PHP-FPM监听的地址和端口匹配即可;如果是分开部署的PHP容器,需要把Nginx容器和PHP容器加入同一个Docker网络,fastcgi_pass填写PHP容器的服务名加端口即可。
- 重新启动容器,挂载配置和代码目录
先删除原有问题容器:
sudo docker rm -f game-nginx
使用新的参数启动容器,同时挂载代码目录和自定义配置:
sudo docker run --name game-nginx -p 80:80 \ -v ~/docker-image/html:/var/www/html \ -v ~/docker-image/nginx/default.conf:/etc/nginx/conf.d/default.conf \ -d nginx
如果遇到文件权限问题(挂载的文件属主是1000:1000,Nginx默认运行用户无权限读取),可以在启动命令中添加--user 1000:1000参数,或者修改本地挂载目录的权限为755。
- 验证配置生效
启动后执行以下命令检查Nginx配置是否正确加载:
sudo docker exec game-nginx nginx -t
如果返回success说明配置正常,重载配置或者直接重启容器即可:
sudo docker exec game-nginx nginx -s reload
此时再访问localhost就会优先解析index.php文件。
内容的提问来源于stack exchange,提问作者May
相关产品推荐
相关产品推荐

