You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

同一服务器多站点HTTPS部署问题咨询(Nginx+Docker)

解决方案:用Nginx反向代理统一管理多站点端口与HTTPS

问题分析

你遇到的HTTPS强制加载失败问题,大概率是主站example.com设置了**HSTS(HTTP严格传输安全)**且包含includeSubDomains属性,导致浏览器强制所有子域名(包括art.example.com)使用HTTPS,但之前art.example.com仅通过8080提供HTTP服务,因此出现加载异常。通过Nginx反向代理可以完美解决端口统一和HTTPS适配问题。


1. 关于多站点统一使用80/443端口的可行性

完全可以!Nginx虚拟主机+反向代理是当前多站点管理的标准方案,比单纯的端口转发更灵活,支持SSL终止、请求路由、缓存等功能,非常适配你的场景。


2. 具体实现步骤(端口转发+反向代理配置)

步骤1:调整Docker容器的网络配置

为了更安全和便捷,建议将Lychee容器与Nginx放在同一个Docker自定义网络中(避免暴露宿主端口),或者仅将容器端口映射到宿主的回环地址(仅本地可访问)。

方案A:使用Docker自定义网络(推荐)
# 创建专属网络,让Nginx和容器互通
docker network create nginx-internal

# 停止并删除现有Lychee容器(如果已运行)
docker stop lychee-art && docker rm lychee-art

# 重新启动Lychee容器,加入自定义网络
docker run -d \
  --name lychee-art \
  --network nginx-internal \
  kdelfour/lychee-docker

这样Nginx可以直接通过容器名lychee-art访问服务,无需映射端口到宿主。

方案B:映射到宿主回环地址

如果你不想用自定义网络,修改容器运行命令,仅把端口映射到127.0.0.1:

docker run -d \
  --name lychee-art \
  -p 127.0.0.1:8080:80 \
  kdelfour/lychee-docker

步骤2:配置Nginx虚拟主机

/etc/nginx/conf.d/目录下新建art.example.com.conf文件,添加以下配置:

(1)HTTP 80端口:强制重定向到HTTPS
server {
    listen 80;
    server_name art.example.com;

    # 永久重定向到HTTPS
    return 301 https://$server_name$request_uri;
}
(2)HTTPS 443端口:反向代理到Docker容器
server {
    listen 443 ssl http2;
    server_name art.example.com;

    # 配置LetsEncrypt SSL证书(路径和主站一致)
    ssl_certificate /etc/letsencrypt/live/art.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/art.example.com/privkey.pem;

    # 复用主站的SSL安全配置(比如加密套件、会话缓存)
    include /etc/nginx/ssl.conf; # 如果主站有统一的SSL配置文件,直接引用即可

    # 反向代理核心配置
    location / {
        # 如果你用了自定义网络,填容器地址:http://lychee-art:80
        # 如果用了回环映射,填:http://127.0.0.1:8080
        proxy_pass http://lychee-art:80;

        # 传递必要的请求头,确保Lychee服务能正确识别请求
        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;
    }
}

步骤3:修复HSTS导致的强制跳转问题

检查主站example.com的Nginx配置,如果有类似以下的HSTS配置:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

includeSubDomains会强制所有子域名使用HTTPS,这正是你之前遇到问题的原因。现在art.example.com已经配置了HTTPS,这个配置可以保留;如果不想让HSTS影响其他未配置HTTPS的子域名,可以去掉includeSubDomains

步骤4:验证配置并重启Nginx

# 检查Nginx配置语法是否正确
nginx -t

# 重启Nginx生效配置
systemctl restart nginx

最终效果

现在访问art.example.com会自动跳转到HTTPS,无需携带端口8080;example.com的静态站点也能正常运行,两个站点共享80/443端口,且都通过LetsEncrypt SSL加密。

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

火山引擎 最新活动