Docker环境下Nginx SSL反向代理失效,求助排查问题根源
问题定位与解决方案
你的问题核心有两个:一是Nginx未加载自定义配置导致80端口返回默认页面,二是证书路径权限问题导致443端口未监听。
关键原因分析
- 自定义配置未被加载:
nginx:1.23.3-alpine镜像的默认主配置/etc/nginx/nginx.conf中,仅包含include /etc/nginx/conf.d/*.conf;,并未配置加载sites-enabled目录。你挂载的配置文件放在sites-enabled下,Nginx根本没读取到,所以80端口使用的是镜像自带的conf.d/default.conf,返回默认页面。 - 证书路径权限不足:Nginx容器内默认以
nginx用户运行,/root目录权限为700,nginx用户无法访问该目录下的文件。即使证书文件权限正常,目录级别的权限限制导致SSL证书无法读取,443端口的server块加载失败,因此Nginx不监听443端口。
修改后的配置
docker-compose.yml
version: "3.8" services: nginx: image: nginx:1.23.3-alpine restart: on-failure:3 container_name: proxy volumes: # 将配置文件挂载到conf.d目录,确保被默认主配置加载 - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro # 将证书挂载到Nginx可访问的目录 - ./nginx/ssl/crt.crt:/etc/nginx/ssl/crt.crt:ro - ./nginx/ssl/key.key:/etc/nginx/ssl/key.key:ro ports: - 80:80 - 443:443
Nginx配置文件(default.conf)
server { listen 80; server_name _; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name localhost; # 修改证书路径到Nginx可访问的目录 ssl_certificate /etc/nginx/ssl/crt.crt; ssl_certificate_key /etc/nginx/ssl/key.key; location / { proxy_pass http://localhost:50000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; } }
验证步骤
- 重启容器:
docker-compose down && docker-compose up -d
- 检查配置有效性:
docker exec proxy nginx -t
- 确认端口监听:
docker exec proxy netstat -lntp
- 测试跳转与代理:
# 测试HTTP转HTTPS curl http://localhost # 测试HTTPS代理(自签证书需加-k参数) curl -k https://localhost
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

