使用 Nginx 透過單一網域提供應用程式服務

使用 Nginx 透過單一網域提供應用程式服務

我在 Digital Ocean 上有一台伺服器,我用它來部署多個 docker 容器,並使用反向代理將它們託管在 Nginx 上。

我有 2 個網域連結到我的伺服器(單一公用 IP)。我們將它們命名為domain1.com 和domain2.com

現在我有2個服務在docker上運行,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,連接會正常工作,但我不希望這樣做。我希望每個網域只能由分配給它們的服務存取。

例如,從外部遠端登入domain1.com:5432應該可以工作,但是從外部遠端登入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

相關內容