Nginx

NGINX SSL Pass-thru 和 Docker

  • June 2, 2018

我有一個有 2 個網站的伺服器。讓我們稱它們為foo.comand bar.com

foo.com有一個子域,稱為mail.foo.com.

兩者都是 WordPress 網站foo.combar.com它們的 NGINX 配置是您在 WP 說明中可以找到的常用 WP 配置。

我還有一個正在執行Mailcow映像的 docker,它正在偵聽埠0.0.0.0:3333 (http)0.0.0.0:3334 (https).

有沒有辦法可以配置 NGINX 以便打開瀏覽器並轉到:

  • foo.com將顯示我的網站foo
  • bar.com將顯示我的網站bar(這兩點目前按預期工作)
  • http://mail.foo.com將使 NGINX 直通到127.0.0.1:3333
  • https://mail.foo.com將使 NGINX 直通到127.0.0.1:3334

目前我正在嘗試通過以下方式實現這一目標:

stream {
   map $ssl_preread_server_name $name {
       mail.foo.com mailcow;
   }

   upstream mailcow {
       server 127.0.0.1:3333;
   }

   server {
       listen 0.0.0.0:80;
       proxy_pass $name;
       ssl_preread on;
   }
}

但是當我嘗試啟動 NGINX 時,它說埠 80 已經在使用中。80 埠沒有監聽。我懷疑 NGINX 這麼說的真正原因是因為http每個虛擬主機(域)配置中的塊也監聽埠 80。

那麼,可能我的問題應該是:我可以在streamhttp部分都收聽埠 80 嗎?

如果“否”,我將如何通過 ssl 傳遞流量mail.foo.com

您不能在同一 IP 地址和埠組合上擁有多個應用層協議。這意味著你不能在同一個埠上同時擁有 HTTP 和 HTTPS,而且你不能在同一個 ip:port 上擁有 HTTP 和流(即未指定的應用層協議)。

但是鑑於您實際上使用流來轉發 HTTP 和 HTTPS,您可能只使用普通的反向代理(proxy_pass) 而不是流,即擁有虛擬主機foo.combar.com就像您目前擁有的那樣,然後擁有另一個虛擬主機,mail.foo.com它是您的反向代理mailcow 實例。由於這將是一個真正的 HTTP/HTTPS 反向代理,而不是 TCP 級別的直通,因此需要在 nginx 上安裝 mailcow 的證書。你也可以簡單地將外部的 HTTPS 和 HTTP 都轉發到 mailcow 的 HTTP 介面,只讓 nginx 處理 HTTPS。設置看起來像這樣:

server {
   listen 80;
   servername mail.foo.com;
   location / {
       proxy_pass http://127.0.0.1:3333;
   }
}
server {
   listen 443 ssl;
   servername mail.foo.com;
   ssl_certificate ...
   ssl_certificate_key ...
   location / {
       proxy_pass http://127.0.0.1:3333;
   }
}

引用自:https://serverfault.com/questions/914911