docker compose搭建nginx+php-fpm环境访问https报403无权限错误
问题原因及对应解决方案
1. SSL证书/密钥文件权限异常(最常见原因)
HTTP访问走80端口无需读取SSL证书,因此不受影响;HTTPS访问时Nginx需要读取证书和密钥文件,如果你在WSL生成的证书文件挂载到容器后,权限设置过高(仅root可读、所有者不是Nginx运行用户),就会触发权限拒绝错误。
解决步骤:
- 首先在WSL环境中修改证书文件权限:
# 证书文件设置为所有用户可读 chmod 644 ./nginx/certs/server.crt # 密钥文件设置为所有者可读写 chmod 600 ./nginx/certs/server.key
- 开发环境下也可以直接在docker-compose的nginx服务配置中添加
user: root参数,指定Nginx用root用户运行,避免权限适配问题:
services: nginx: image: nginx:alpine user: root # 新增这一行,仅开发环境使用 # 其余原有配置保持不变
- 修改后重启容器生效:
docker compose down && docker compose up -d
2. 项目目录文件权限不足
如果站点根目录下的index.php或者其他静态文件,挂载到容器后Nginx没有读取权限,也会返回403错误。
解决步骤:
在WSL中给项目目录开放全局可读权限(仅开发环境适用):
chmod -R 755 ./../app
3. 单Server块同时监听80/443的兼容问题
部分旧版本Nginx对同一个Server块同时监听HTTP和HTTPS的配置兼容不好,可能导致HTTPS请求的路径解析异常。
解决步骤:
将HTTP和HTTPS配置拆分到两个独立的Server块,HTTP直接重定向到HTTPS:
# HTTP服务:重定向到HTTPS server { listen 80; server_name test.lan; return 301 https://$host$request_uri; } # HTTPS服务:实际业务配置 server { listen 443 ssl; ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/server.key; root /var/www/test.lan; index index.html index.php; server_name test.lan; location / { try_files $uri $uri/ @rewriteapp; } location @rewriteapp { rewrite ^(.*)$ /index.php/$1 last; } location ~\.php { try_files $uri /index.php; fastcgi_pass php-fpm:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
修改配置后重启Nginx容器即可。
内容的提问来源于stack exchange,提问作者tuga74
相关产品推荐
相关产品推荐

