单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)
- 容器A:
- 然后在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
- 容器A:
- 这时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
相关产品推荐
相关产品推荐

