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

Ubuntu多Docker容器及网站的SSL证书配置方案咨询

解决方案:用反向代理统一处理SSL证书

核心结论

不需要为每个Docker容器或http-server单独配置SSL证书,在Ubuntu主机上部署Nginx(或Apache)作为反向代理,给它配置一张覆盖你域名的SSL证书即可——所有外部请求先经过反向代理处理SSL,再转发到对应的容器或服务端口。

反向代理的工作原理

反向代理相当于服务器的"统一入口":

  • 外部iOS应用或浏览器通过HTTPS(443端口)访问你的域名,请求先到达反向代理
  • 反向代理用配置好的SSL证书完成加密握手,将HTTPS请求转换成内部HTTP请求
  • 根据请求的子域名或路径,把请求转发到对应的Docker容器端口(如8080、8081)或http-server端口(如8000)
  • 后端服务处理完请求后,把响应原路返回给反向代理,再由它加密成HTTPS响应发回给客户端

这种方式的优势:

  • 仅需维护一张SSL证书,无需为每个服务单独配置
  • 集中处理SSL加密/解密,减轻后端服务的性能负担
  • 可统一管理路由、限流、缓存等规则

适配你场景的具体步骤

1. 准备域名和SSL证书

先注册一个域名(如yourdomain.com),将其解析到Ubuntu的公网IP。然后用Let's Encrypt免费生成并安装证书:

# 安装certbot及Nginx插件
sudo apt update && sudo apt install certbot python3-certbot-nginx
# 生成证书并自动配置Nginx
sudo certbot --nginx -d yourdomain.com -d api1.yourdomain.com -d api2.yourdomain.com

可以用子域名区分不同服务:api1.yourdomain.com对应第一个容器,api2.yourdomain.com对应第二个容器,主域名yourdomain.com对应静态站。

2. 配置Nginx反向代理

编辑Nginx配置文件(如/etc/nginx/sites-available/yourdomain.conf),添加转发规则:

# 静态站转发规则
server {
    listen 443 ssl;
    server_name yourdomain.com;

    # Certbot自动生成的SSL配置
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 转发到http-server(假设运行在8000端口)
    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 第一个Docker容器转发规则
server {
    listen 443 ssl;
    server_name api1.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 转发到容器端口(假设为8080)
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 第二个Docker容器转发规则
server {
    listen 443 ssl;
    server_name api2.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 转发到容器端口(假设为8081)
    location / {
        proxy_pass http://localhost:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# HTTP请求强制重定向到HTTPS
server {
    listen 80;
    server_name yourdomain.com api1.yourdomain.com api2.yourdomain.com;
    return 301 https://$host$request_uri;
}

3. 验证配置并重启Nginx

# 检查配置语法是否合法
sudo nginx -t
# 重启Nginx使配置生效
sudo systemctl restart nginx

4. 优化后端服务安全性(可选)

确保Docker容器和http-server仅监听localhost或内网IP,避免直接暴露公网。Docker容器运行时可指定绑定本地端口:

docker run -d -p 127.0.0.1:8080:容器内部端口 镜像名

不推荐为每个服务单独配置SSL的原因

  • 维护成本高:每个服务都要配置证书、处理续期,容易遗漏
  • 资源浪费:每个服务单独处理SSL加密/解密,额外消耗CPU资源
  • 体验不佳:HTTPS默认端口为443,多个服务只能占用不同端口,iOS调用时需额外指定端口,不符合常规使用习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:37:07