You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
   }
}
配置错误分析
  1. upstream指向错误:upstream块中的server 0.0.0.0:3300指向的是Nginx自身监听的端口,而非Docker容器内Web应用的实际地址,导致无法正确转发请求到应用。
  2. server_name匹配错误:server_name application_upstream是错误的,server_name需要设置为用户实际访问的域名example.com,否则Nginx无法匹配到对应的请求。
  3. 循环代理问题:第二个server块中proxy_pass http://example.com:3300会将请求转发回Nginx自己监听的3300端口,形成无限循环,最终导致SSL协议错误。
  4. 冗余的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;
    }
}
部署注意事项
  1. 确保ssl_certificate和ssl_certificate_key的路径正确,且证书文件有效(与example.com域名匹配)。
  2. 若Nginx运行在Docker容器中,需将容器的3300端口映射到主机的3300端口(docker run -p 3300:3300 ...)。
  3. 确保Nginx能够连通到Docker应用的地址:
    • 若Nginx在主机,需确认主机能访问容器IP或映射端口;
    • 若Nginx在Docker容器,需将Nginx容器和应用容器加入同一Docker网络。

内容的提问来源于stack exchange,提问作者Shaugi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:46:58