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

单VPS部署多Docker Web服务的域名导向80/443端口配置咨询

单VPS部署多Docker Web服务的域名导向80/443端口配置咨询

兄弟,你的需求我太熟了!之前刚在VPS上搭了四五个Docker站点,用的就是反向代理方案,刚好能给你唠唠:

(1) Nginx vs Apache2:选哪个更简单?

果断选Nginx!完全符合你提到的「简单易配置」需求,尤其是结合你说的DigitalOcean配置工具,简直事半功倍:

  • 配置简洁直观:Nginx的反向代理和虚拟主机语法非常清爽,写多域名转发的配置文件几乎不会绕晕。比如针对每个域名,只要写几行server块就能搞定转发逻辑,新手也能快速上手。
  • SSL管理更省心:配合Certbot(免费SSL证书工具),能一键给所有域名申请、续期证书,而且自动把配置注入Nginx,不用手动改一大堆东西。
  • DigitalOcean的工具确实好用:他们的Nginx配置生成器能直接帮你生成反向代理、SSL重定向的模板代码,你只要替换下域名和后端端口就行,省得自己踩坑。

反观Apache2,不是说它不行,但多域名反向代理的步骤要繁琐不少:得先手动启用mod_proxy、mod_proxy_http一堆模块,虚拟主机的配置语法也更啰嗦,对于你这种要快速部署多个站点的场景,确实不如Nginx高效。

(2) 多容器的端口映射与转发方案

首先得纠正一个小误区:不能给每个容器都映射宿主机的443端口——因为宿主机的端口是独占的,80/443只能被Nginx(或Apache)这一个进程占用。正确的思路是:Nginx独占宿主机的80/443,然后根据域名把请求转发到对应的Docker容器。具体有两种常用方式:

方式一:宿主机端口映射(适合新手快速上手)

  • 每个Web容器把内部的服务端口(比如容器里的80或443)映射到宿主机的其他空闲端口,比如:
    • 容器A:docker run -d -p 1234:80 your-image-a(把容器A的80端口映射到宿主机1234)
    • 容器B:docker run -d -p 2345:80 your-image-b(把容器B的80端口映射到宿主机2345)
  • 然后在Nginx的配置里,针对不同域名写转发规则,比如把a.example.org的请求转发到http://localhost:1234,b.example.org转发到http://localhost:2345。

方式二:Docker内部网络(更安全、更优雅)

  • 先创建一个自定义Docker网络:docker network create web-network
  • 启动Nginx容器时加入这个网络:docker run -d -p 80:80 -p 443:443 --network web-network nginx
  • 启动每个Web容器时也加入同一个网络:
    • 容器A:docker run -d --name web-a --network web-network your-image-a
    • 容器B:docker run -d --name web-b --network web-network your-image-b
  • 这时Nginx可以直接用容器名称访问后端服务,比如转发a.example.org到http://web-a:80,不用映射宿主机端口,避免端口冲突,也更安全(外部无法直接访问容器端口)。

给你个Nginx配置示例(参考)

# 处理HTTP请求,统一重定向到HTTPS
server {
    listen 80;
    server_name a.example.org b.example.org;
    return 301 https://$host$request_uri;
}

# a.example.org的HTTPS配置
server {
    listen 443 ssl;
    server_name a.example.org;

    # SSL证书路径(用Certbot会自动生成)
    ssl_certificate /etc/letsencrypt/live/a.example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.org/privkey.pem;

    location / {
        proxy_pass http://web-a:80; # 如果用宿主机端口就是http://localhost:1234
        # 传递必要的请求头,让后端容器能正确识别请求信息
        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;
    }
}

# b.example.org的HTTPS配置
server {
    listen 443 ssl;
    server_name b.example.org;

    ssl_certificate /etc/letsencrypt/live/b.example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/b.example.org/privkey.pem;

    location / {
        proxy_pass http://web-b:80; # 如果用宿主机端口就是http://localhost:2345
        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;
    }
}

这样不管你以后加多少个容器(C、D、E...),只要重复上述步骤,给新域名加个Nginx配置块就行,非常容易扩展。

备注:内容来源于stack exchange,提问作者Ranone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:32:46