我有一台新的 VPS 机器,其中:
在主主机上安装 nginx,通过端口 80,443 为我的域名网站(例如 example.com)提供服务。主机 nginx 中的 example.com 配置:
server { server_name example.com www.example.com; root /var/www/www.example.com; listen 80; listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/certs/example.com_by_cloudflare.pem; ssl_certificate_key /etc/ssl/private/example.com_by_cloudflare.key; }
已安装容器化邮件服务器(Poste.io2docker) 为@exmaple.com 提供电子邮件服务。邮件服务器主机名:mail.example.com。它还使用 nginx 在端口 80、443 上为 webmail 门户提供服务。(Poste.io2通过此命令安装:
sudo docker run \ --net=host \ -e TZ=Etc/UTC \ -v /var/posteiodata:/data \ --name "posteiomailserver" \ -h "mail.example.com" \ -t analogic/poste.io
问题是我希望网站 (example.com) 和网络邮件 (mail.example.com) 都能正常工作。我不确定这是否可以通过主机/docker 上的 DNS、nginx/反向代理进行管理?或者无法通过这种方式进行管理,我应该进行一些更改。
如果您有任何建议我将不胜感激。
PS DNS 由 Cloudflare 管理,DNS 记录如下所示:
mail.example.com. 1 IN A <server_ip_address>
example.com. 1 IN A <server_ip_address>
www.example.com. 1 IN CNAME example.com.
example.com. 1 IN MX 0 mail.example.com.
答案1
在我看来,反向代理是可行的方法。它监听两个子域的 80 和 443,并将请求转发到其中一个服务器。两个服务器都会公开其他端口,例如,为 Web 服务器公开 8080、8443,为邮件服务器公开 9090、9443。
答案2
我按如下方式解决了该问题:
- 使用 HTTP_PORT=5080 和 HTTPS_PORT=4433 环境变量运行 docker。这将使容器化的 nginx 在端口 5080、4433 上运行:
sudo docker run \
--net=host \
-e TZ=UTC \
-e "HTTP_PORT=5080" \
-e "HTTPS_PORT=4433" \
-v /var/posteiodata:/data \
--name "posteiomailserver"
-h "mail.example.com" \
-t analogic/poste.io
- 在宿主机上打开端口4433、5080:
sudo iptables -A INPUT -p tcp --dport 4433 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5080 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo service iptables save
- 创建 nginx conf,当打开 mail.example.com 时将 443 转发到 4433:
sudo nano /etc/nginx/sites-available/mail.example.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mail.example.com;
ssl_certificate /etc/ssl/certs/example.com_by_cloudflare.pem;
ssl_certificate_key /etc/ssl/private/example.com_by_cloudflare.key;
location / {
proxy_pass https://127.0.0.1:4433;
}
}
- 启用新配置并启动 nginx:
sudo ln -s /etc/nginx/sites-available/mail.example.com.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo service nginx start
现在我可以在 example.com 上浏览我的网站,在 mail.example.com 上浏览网络邮件,瞧!