![如果容器正在偵聽連接埠 80,Nginx 反向代理程式如何設法將流量路由到正確的 docker 容器?](https://rvso.com/image/1586633/%E5%A6%82%E6%9E%9C%E5%AE%B9%E5%99%A8%E6%AD%A3%E5%9C%A8%E5%81%B5%E8%81%BD%E9%80%A3%E6%8E%A5%E5%9F%A0%2080%EF%BC%8CNginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%A8%8B%E5%BC%8F%E5%A6%82%E4%BD%95%E8%A8%AD%E6%B3%95%E5%B0%87%E6%B5%81%E9%87%8F%E8%B7%AF%E7%94%B1%E5%88%B0%E6%AD%A3%E7%A2%BA%E7%9A%84%20docker%20%E5%AE%B9%E5%99%A8%EF%BC%9F.png)
根據這網站,當設定容器網路時,每個容器預設偵聽連接埠 80,這可能會導致傳入流量之間發生衝突。這是透過使用 Nginx 反向代理(也在連接埠 80 上偵聽)來解決的,該代理程式會尋找 VIRTUAL_HOST 變數並將流量路由到正確的容器。
但這是我不明白的地方。如果 Nginx 也監聽連接埠 80(像所有其他容器一樣),那麼如何解決流量衝突問題呢?既然Nginx正在監聽80端口,那麼衝突問題不應該仍然存在嗎? Nginx 是否會自動擷取所有傳入流量,無論其他容器的連接埠號碼為何?我發現這整個概念非常令人困惑。
答案1
如果 Nginx 也監聽連接埠 80(像所有其他容器一樣),那麼如何解決流量衝突問題呢?
也許我誤讀了這篇文章,但似乎「所有其他容器」都沒有在連接埠 80 上偵聽(添加了強調):
預設情況下,Docker 服務都會偵聽連接埠 80,這會對傳入流量造成衝突。當然,您可以更改偵聽端口,但沒有人願意輸入coolwebsite.com:34567來訪問他們最喜歡的網站。
相反,如果您可以使用 nginx 將到達 Coolwebsite.com 的流量路由到偵聽 34567 連接埠的容器的唯一容器,並將到達 anothercoolwebsite.net 的流量路由到偵聽 45678 連接埠的第二個容器,該怎麼辦?
在這種情況下,Nginx 似乎是唯一監聽連接埠 80 的 Web 伺服器。
Nginx 是否會自動擷取所有傳入流量,無論其他容器的連接埠號碼為何?
Nginx 將擷取連接埠 80 上的所有http://coolwebsite.com
流量http://coolwebsite.com:80
。然後,Nginx 將在連接埠 80 和 Docker 容器運行的任何連接埠之間中繼流量,具體取決於主機名稱。