Nginx

使用 Nginx 代理通行證(反向代理)通過 SSL 為 Apache 託管站點提供服務

  • July 19, 2021

我搜尋了論壇(以及網路上的其他地方)並找到了相關但看似不相同的資訊。希望我不會在這裡重複。

我有一個在 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 在我的路由器後面,並且沒有直接暴露在網路上。

傑森

編輯/更新:

我的原始查詢中缺少重要資訊:

  1. 我想要反向代理到 Apache 的面向網路的 Nginx 機器也服務於我想要反向代理的主域的三個子域(sub1.mydomain.com、sub2.mydomain.com、sub3.mydomain.com)。所有這三個共享一個來自 LetsEncrypt 的 SSL 證書。
  2. 本地網路上的 Apache 伺服器也有一個 LetsEncrypt 頒發的證書,它服務於 mydomain.com,直到我將 Nginx 機器放在它前面。
  3. 我現在已經刪除了 Apache 機器上的 SSL 證書,刪除了 https 虛擬伺服器,並為埠 80 設置了一個簡單的虛擬伺服器。
  4. 我的預設 Nginx 設置向 http://www.mydomain.com 發送請求,它現在只是共享一個非常無聊的 html 頁面。
  5. 我已經在 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 錯誤網關。

您的配置中有四個錯誤:

  1. listen如果要綁定到特定介面,指令僅接受 IP 地址。但是,實際上您可以很好地綁定到所有介面,這樣listen 443 ssl就足夠了。
  2. rootlocation 指定 nginx 應該直接服務的文件的文件系統路徑。由於您的/位置將被反向代理,root因此根本不需要指定,因為 nginx 不提供任何文件。所以,刪除root指令。
  3. proxy_pass需要上游伺服器的 URL。在這種情況下,它應該是proxy_pass https://192.168.11.4
  4. 您尚未指定 TLS 證書/私鑰,它們需要使用ssl_certificatessl_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;
   }
}

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