
我有一個 DDNS 子網域sub1.dom1.com
,其靜態 IP 為(虛構 IP)99.88.77.66.55
。
我有一個網域,dom2.com
託管在場外,具有指向相同 IP(同樣是虛構的)的 DNS CNAMEsub2.dom2.com
條目sub3.dom2.com
,99.88.77.66.55
.
在99.88.77.66.55
,我的防火牆後面有一個 LAN。在這個區域網路上,我有三台伺服器:
www.local.lan
本地 FQDN 為at 的Web 伺服器192.168.1.3:80
app.local.lan
本地 FDQN 為at 的應用程式伺服器192.168.1.4:8069
fs.local.lan
本地 FQDN 為at 的檔案伺服器192.168.1.5:2430
請參閱下圖以進行說明。所有三台伺服器都在同一個 freeBSD (freeNAS) 系統上作為監獄內的虛擬伺服器運作。
我想要完成什麼
根據上圖,我想添加一個反向代理伺服器以在上述系統的監獄內運行。來自 WAN 的請求需要根據 HTTP 標頭中提供的主機名稱定向到適當的伺服器。
注意事項
- 標準連接埠轉送:目前,我透過 LAN 路由器上的簡單連接埠轉送來存取這些伺服器。這通常是一個可以接受的解決方案,但是,當需要遠端對網路進行故障排除時,保持直接的 WAN 到 LAN 連接埠關係就成為一項挑戰。此外,對於除我之外需要存取這些伺服器的用戶來說,他們更容易不必記住連接埠號碼。
- DD-WRT應用:由於我的路由器正在運行 DD-WRT 韌體並安裝了 4 GiB USB 驅動器,因此我考慮使用 Pound 或類似的東西在路由器上安裝和運行反向代理伺服器。我進行了大量的網絡搜索,尋找實現此目的的方法。我遇到的問題是大多數指南或教程都很舊,並且包含所需資源的損壞連結。
- 阿帕契/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
提示嗎?