使用 Nginx 通过单个域提供应用程序服务

使用 Nginx 通过单个域提供应用程序服务

我在 Digital Ocean 上有一个服务器,我正在使用它来部署多个 docker 容器并使用反向代理将它们托管在 Nginx 上。

我的服务器链接了 2 个域名(单个公共 IP)。我们将它们命名为 domain1.com 和 domain2.com

现在我在 docker 上运行了 2 个服务,Postgres(端口 5432)和 MySQL(端口 3306)

我设置了反向代理,将 domain1.com 转换为 localhost:5432,将 domain2.com 转换为 localhost:3306:

server {
  listen        80;
  server_name   domain1.com;

  location / {
    proxy_pass  http://localhost:5432;
  }
}

server {
  listen        80;
  server_name   domain2.com;

  location / {
    proxy_pass  http://localhost:3306;
  }
}

这里让我烦恼的是,如果我尝试访问 domain1.com:3306,连接会成功,这是我不想要的。我希望每个域只能由分配给它们的服务访问。

例如,从外部 telnet 到 domain1.com:5432 应该可以工作,但从外部 telnet 到 domain2.com:3306 则不可以。

有人可以帮忙吗?

答案1

你必须做出你的mysql实例仅在本地(容器主机)进行监听,因此最终用户无法从外部访问它,只有 nginx 和其他本地进程可以访问它。

因此,你只需使用正确的配置重建你的图像即可我的cnf

FROM mysql
COPY custom.cnf /etc/mysql/my.cnf

或者不重建图像(运行前):

docker run -v <path_to_custom.cnf>:/etc/mysql/conf.d

在哪里我的cnf应包含以下配置:

 bind-address=<host_ip>

你也可以对Postgres

编辑 1:自您上次评论以来:

server{
  listen        3306;
  server_name   domain2.com;
  return 403; 
} 

你也可以反过来阻止nginx级别;但如果你想完全阻止流量,这样它就不会被内核处理,例如 telnet 将显示连接被拒绝,你必须在第 3 层iptables

相关内容