sub1.dom1.com
我有一个具有静态 IP (虚构 IP)的DDNS 子域99.88.77.66.55
。
我有一个域,dom2.com
托管在异地,sub2.dom2.com
并且sub3.dom2.com
具有指向同一 IP(再次,虚构)的DNS CNAME 条目99.88.77.66.55
。
在99.88.77.66.55
,我的防火墙后面有一个 LAN。在这个 LAN 上,我有三个服务器:
www.local.lan
本地 FQDN 为的Web 服务器192.168.1.3:80
- 本地 FDQN
app.local.lan
为192.168.1.4:8069
fs.local.lan
本地 FQDN 为的文件服务器192.168.1.5:2430
请参阅下图以了解详情。所有三台服务器都在同一 freeBSD (freeNAS) 系统上的 jail 中作为虚拟服务器运行。
我想要实现的目标
根据上图,我想添加一个反向代理服务器,在上述系统的 jail 内运行。来自 WAN 的请求需要根据 HTTP 标头中提供的主机名称定向到适当的服务器。
注意事项
- 标准港口转运:目前,我通过 LAN 路由器上的简单端口转发来访问这些服务器。这通常是一种可接受的解决方案,但是,当需要远程干扰网络时,保持 WAN 到 LAN 端口的直接关系就变得很困难。此外,对于除我之外需要访问这些服务器的用户来说,他们不必记住端口号会更容易。
- DD-WRT 应用程序:由于我的路由器运行的是 DD-WRT 固件,并且安装了 4 GiB USB 驱动器,因此我研究了在路由器上安装和运行反向代理服务器,使用 Pound 或类似的东西。我在网上搜索了很多方法。我遇到的问题是,大多数指南或教程都很旧,并且包含指向所需资源的无效链接。
- Apache / 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 无法连接到上游(proxy_pass
)。
- 您是否检查过 DMZ->LAN 的防火墙策略?
- 您检查过
error.log
提示吗?