Docker Nginx反向代理配置example.com:port SSL及协议错误排查
问题描述
我有一个运行在Docker容器中的Web应用,希望通过https://example.com:3300对外发布。为了让应用通过HTTPS运行,我尝试配置Nginx实现重定向和端口绑定,但配置后页面返回ERR_SSL_PROTOCOL_ERROR。应用在HTTP协议下运行无异常。
当前的Nginx配置如下:
upstream application_upstream { server 0.0.0.0:3300; } server { listen 443 ssl; server_name application_upstream; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; return 301 $scheme://example.com:3300$request_uri; } server { listen 3300 ssl; server_name application_upstream; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; location / { proxy_set_header Host $host; proxy_pass http://example.com:3300; proxy_redirect off; } }
配置错误分析
- upstream指向错误:
upstream块中的server 0.0.0.0:3300指向的是Nginx自身监听的端口,而非Docker容器内Web应用的实际地址,导致无法正确转发请求到应用。 - server_name匹配错误:
server_name application_upstream是错误的,server_name需要设置为用户实际访问的域名example.com,否则Nginx无法匹配到对应的请求。 - 循环代理问题:第二个
server块中proxy_pass http://example.com:3300会将请求转发回Nginx自己监听的3300端口,形成无限循环,最终导致SSL协议错误。 - 冗余的443端口监听:如果你的需求仅为对外提供
https://example.com:3300服务,监听443端口的server块可以删除;若需要将https://example.com(默认443端口)的请求重定向到3300端口,需修正该块的server_name为example.com。
修正后的Nginx配置
假设Docker容器内的Web应用监听端口为80,且Nginx与Docker应用在同一主机或Docker网络中,可通过容器IP(如172.17.0.2)、容器名(如my-web-app)或主机映射端口(如localhost:8080)访问应用:
# 定义后端应用的上游地址,替换为你的Docker应用实际访问地址 upstream application_upstream { # 示例1:Docker容器IP+内部端口 # server 172.17.0.2:80; # 示例2:Docker容器名+内部端口(需在同一Docker网络) # server my-web-app:80; # 示例3:主机映射端口(容器端口80映射到主机8080) server localhost:8080; } # 可选:将默认443端口的HTTPS请求重定向到3300端口 server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; return 301 https://example.com:3300$request_uri; } # 处理3300端口的HTTPS请求,反向代理到后端应用 server { listen 3300 ssl; server_name example.com; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 转发到定义的上游应用 proxy_pass http://application_upstream; proxy_redirect off; } }
部署注意事项
- 确保
ssl_certificate和ssl_certificate_key的路径正确,且证书文件有效(与example.com域名匹配)。 - 若Nginx运行在Docker容器中,需将容器的3300端口映射到主机的3300端口(
docker run -p 3300:3300 ...)。 - 确保Nginx能够连通到Docker应用的地址:
- 若Nginx在主机,需确认主机能访问容器IP或映射端口;
- 若Nginx在Docker容器,需将Nginx容器和应用容器加入同一Docker网络。
内容的提问来源于stack exchange,提问作者Shaugi
相关产品推荐
相关产品推荐

