Nginx 中基於 http 標頭的反向代理回傳 502 Bad Gateway

Nginx 中基於 http 標頭的反向代理回傳 502 Bad Gateway

我有一個 DDNS 子網域sub1.dom1.com,其靜態 IP 為(虛構 IP)99.88.77.66.55

我有一個網域,dom2.com託管在場外,具有指向相同 IP(同樣是虛構的)的 DNS CNAMEsub2.dom2.com條目sub3.dom2.com99.88.77.66.55.

99.88.77.66.55,我的防火牆後面有一個 LAN。在這個區域網路上,我有三台伺服器:

  1. www.local.lan本地 FQDN 為at 的Web 伺服器192.168.1.3:80
  2. app.local.lan本地 FDQN 為at 的應用程式伺服器192.168.1.4:8069
  3. fs.local.lan本地 FQDN 為at 的檔案伺服器192.168.1.5:2430

請參閱下圖以進行說明。所有三台伺服器都在同一個 freeBSD (freeNAS) 系統上作為監獄內的虛擬伺服器運作。

網路圖

我想要完成什麼

根據上圖,我想添加一個反向代理伺服器以在上述系統的監獄內運行。來自 WAN 的請求需要根據 HTTP 標頭中提供的主機名稱定向到適當的伺服器。

注意事項

  1. 標準連接埠轉送:目前,我透過 LAN 路由器上的簡單連接埠轉送來存取這些伺服器。這通常是一個可以接受的解決方案,但是,當需要遠端對網路進行故障排除時,保持直接的 WAN 到 LAN 連接埠關係就成為一項挑戰。此外,對於除我之外需要存取這些伺服器的用戶來說,他們更容易不必記住連接埠號碼。
  2. DD-WRT應用:由於我的路由器正在運行 DD-WRT 韌體並安裝了 4 GiB USB 驅動器,因此我考慮使用 Pound 或類似的東西在路由器上安裝和運行反向代理伺服器。我進行了大量的網絡搜索,尋找實現此目的的方法。我遇到的問題是大多數指南或教程都很舊,並且包含所需資源的損壞連結。
  3. 阿帕契/Nginx:這兩個似乎都是可行的解決方案。然而,就像我研究的 DD-WRT 解決方案一樣,許多指南要么提供損壞的鏈接,要么根本沒有指向所需資源的鏈接。對於 Apache 或 Nginx 選項,我面臨的另一個障礙是大多數指南和教程都假設我已經了解有關 Apache 或 Nginx 的所有知識。我一開始對這兩個平台都沒有任何經驗,但願意學習並嘗試讓事情發揮作用。指南和教程大多僅顯示server所需程式碼的部分。此外,還假設您已經知道所需的依賴項以及如何實現它們。

我已經採取的步驟

nginx: 來自我的 nginx.conf 檔案的範例。這只是一部分。其他伺服器的其他server部分的相關詳細資訊已更改。

#nginx.conf

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;
    server_name sub1.dom1.com #I've also tried www.lan.lan, here.
    access_log off;
    error_log off;
    location / {
      proxy_pass http://192.168.1.3:80/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_ass_x_forwarded_for;
      proxy_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_ready_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
    }
  }
}

然而,這;嘗試連線時傳回 502 - Bad Gateway 錯誤。

阿帕契: 需要注意的是,我正在使用 Apache22 嘗試此操作。我最新的 httpd.conf 檔案如下所示:

LoadFile /usr/local/bin/libxml2.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadModule xml2enc_module libexec/apache22/mod_xl2enc.so

<VirtualHost *:80>
  ServerName sub1.dom1.com
  ServerAlias sub1.dom.com
  ProxyPass / http://192.168.1.3:80/
  ProxyPassReverse / http://192.168.1.3:80
</VirtualHost>

<VirtualHost *:80>
  ServerName sub2.dom2.com
  ServerAlias sub2.dom2.com
  ProxyPass / http://192.168.1.4:8069/
  ProxyPassReverse / http://192.168.1.4:8069
</VirtualHost>

<VirtualHost *:80>
  ServerName sub3.dom2.com
  ServerAlias sub3.dom2.com
  ProxyPass / http://192.168.1.5:2430/
  ProxyPass / http://192.168.1.5:2430
</VirtualHost

當我嘗試啟動 Apache22 時,使用:

service apache22 start

我得到以下資訊:

Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration

經過大量研究,我知道這很可能是由於我只mod_proxy加載了許多必需模組之一mod_proxy_html(模組)而引起的。原因是經過大量搜尋後,我只能找到該特定模組的工作連結。

磅: 我在嘗試在 DD-WRT 上安裝 ipkg 時遇到了問題。這可能是由於我的特定路由器的 atheos 架構造成的。正如前面提到的,我還遇到了許多損壞的連結。


好吧,冗長的解釋已經結束了,這就是我從社群中尋找的內容。

鑑於我已經最接近使用 Nginx,我如何正確設定我的nginx.conf文件來完成我想要做的事情?導致 502 錯誤的原因是什麼?

答案1

對於nginx解決方案:

server_name應始終是請求的主機名稱(在 http 標頭中)。

  • 您可以*在此處放置一個以使內容在任何網域/主機上可用。

proxy_pass不應以 結尾/,除非特別需要。

我見過502 Bad gateway最常見的情況是 nginx 無法連接到 upsteam ( proxy_pass)。

  • 您是否檢查了 DMZ->LAN 的防火牆策略?
  • 你檢查過error.log提示嗎?

相關內容