使用 Nginx 代理通行證(反向代理)通過 SSL 為 Apache 託管站點提供服務
我搜尋了論壇(以及網路上的其他地方)並找到了相關但看似不相同的資訊。希望我不會在這裡重複。
我有一個在 Apache 伺服器上執行的站點。它已經有一個 SSL 證書(通過 LetsEncrypt)並且執行沒有問題。
我最近在它“前面”設置了一台執行 Nginx 的機器。該機器服務於三個域(使用 LetsEncrypt 的一個證書)。
我想通過 Nginx 在 Apache 機器上傳遞對域的請求,但在確定正確的設置時遇到了麻煩。過去我用兩台 Apache 服務機器完成了這項工作,沒有太多困難,但我是 Nginx 的新手,顯然還不夠熟練。
我在 Nginx 面向網路的機器上(通過路由器)的虛擬伺服器設置是:
server { listen domain.pointing.to.apache.com:443 ssl; server_name domain.pointing.to.apache.com; location / { root 192.168.11.14/var/www/html/; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass domain.pointing.to.apache.com; } }
但是,當然,Nginx 不喜歡這樣,並且在添加 vs 後不會重新載入。任何建議等將不勝感激。
注意 - 我想這很明顯,但 192.168.11.14 在我的路由器後面,並且沒有直接暴露在網路上。
傑森
編輯/更新:
我的原始查詢中缺少重要資訊:
- 我想要反向代理到 Apache 的面向網路的 Nginx 機器也服務於我想要反向代理的主域的三個子域(sub1.mydomain.com、sub2.mydomain.com、sub3.mydomain.com)。所有這三個共享一個來自 LetsEncrypt 的 SSL 證書。
- 本地網路上的 Apache 伺服器也有一個 LetsEncrypt 頒發的證書,它服務於 mydomain.com,直到我將 Nginx 機器放在它前面。
- 我現在已經刪除了 Apache 機器上的 SSL 證書,刪除了 https 虛擬伺服器,並為埠 80 設置了一個簡單的虛擬伺服器。
- 我的預設 Nginx 設置向 http://www.mydomain.com 發送請求,它現在只是共享一個非常無聊的 html 頁面。
- 我已經在 Nginx 機器上為域 https //www.mydomain.com 安裝了 SSL 證書,並希望使用 Tero 提供的建議將 mydomain.com 上的代理 https 請求與本地 Apache 機器反向。如下:
server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem; server_name www.mydomain.com; location / { proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://192.168.11.14; } }
問題是我從 Nginx 機器收到 502 Bad Gateway 錯誤……所以我想我的 Nginx 設置有問題……我快接近了,但還沒有完全到位。此外,我注意到在沒有 https 的情況下訪問www.mydomain.com的嘗試不再為無聊的 html 頁面提供服務……它們被轉移/重寫到 https -> www.mydomain.com和相同的 502 錯誤網關。
您的配置中有四個錯誤:
listen
如果要綁定到特定介面,指令僅接受 IP 地址。但是,實際上您可以很好地綁定到所有介面,這樣listen 443 ssl
就足夠了。root
location 指定 nginx 應該直接服務的文件的文件系統路徑。由於您的/
位置將被反向代理,root
因此根本不需要指定,因為 nginx 不提供任何文件。所以,刪除root
指令。proxy_pass
需要上游伺服器的 URL。在這種情況下,它應該是proxy_pass https://192.168.11.4
。- 您尚未指定 TLS 證書/私鑰,它們需要使用
ssl_certificate
和ssl_certificate_key
指令指定。所以,總的來說,你的配置應該是:
server { listen 443 ssl; ssl_certificate /path/to/certificate; ssl_certificate_key /path/to/key; server_name domain.pointing.to.apache.com; location / { proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://192.168.11.4; } }
如果要在反向代理伺服器上使用 Letsencrypt 證書,則需要
/.well-known
從伺服器提供目錄:server { listen 80; location /.well-known { try_files $uri =404; } location / { # Redirect http requests to https return 301 https://domain.pointing.to.apache.com; } }
使用此配置,您可以在反向代理伺服器上執行 Certbot,然後它將正確驗證域所有權並獲取證書/密鑰。
但是,使用此配置,您無法在本地網路上執行的伺服器上執行 Certbot。如果本地網路被認為是安全的,那麼我建議在反向代理伺服器和本地網路伺服器之間使用
http
而不是。https
如果
https
需要在反向代理伺服器和本地網路伺服器之間,則可以使用此配置:server { listen 80; # Try to serve `.well-known` files from local file system. If not found, send to upstream server location /.well-known { try_files $uri @local; } location @local { proxy_pass http://192.168.11.4; } location / { return 301 https://domain.pointing.to.apache.com; } }