NGINX SSL Pass-thru 和 Docker
我有一個有 2 個網站的伺服器。讓我們稱它們為
foo.com
andbar.com
。
foo.com
有一個子域,稱為mail.foo.com
.兩者都是 WordPress 網站
foo.com
,bar.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。那麼,可能我的問題應該是:我可以在
stream
和http
部分都收聽埠 80 嗎?如果“否”,我將如何通過 ssl 傳遞流量
mail.foo.com
?
您不能在同一 IP 地址和埠組合上擁有多個應用層協議。這意味著你不能在同一個埠上同時擁有 HTTP 和 HTTPS,而且你不能在同一個 ip:port 上擁有 HTTP 和流(即未指定的應用層協議)。
但是鑑於您實際上使用流來轉發 HTTP 和 HTTPS,您可能只使用普通的反向代理(proxy_pass) 而不是流,即擁有虛擬主機
foo.com
,bar.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; } }