如何使网站和dockerized webmail在同一台服务器上协同工作

如何使网站和dockerized webmail在同一台服务器上协同工作

我有一台新的 VPS 机器,其中:

  1. 在主主机上安装 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;
    }
    
  2. 已安装容器化邮件服务器(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

我按如下方式解决了该问题:

  1. 使用 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
  1. 在宿主机上打开端口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
  1. 创建 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;
  }
}
  1. 启用新配置并启动 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 上浏览网络邮件,瞧!

相关内容