Nginx 中基于 http 标头的反向代理返回 502 Bad Gateway

Nginx 中基于 http 标头的反向代理返回 502 Bad Gateway

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 上,我有三个服务器:

  1. www.local.lan本地 FQDN 为的Web 服务器192.168.1.3:80
  2. 本地 FDQNapp.local.lan192.168.1.4:8069
  3. fs.local.lan本地 FQDN 为的文件服务器192.168.1.5:2430

请参阅下图以了解详情。所有三台服务器都在同一 freeBSD (freeNAS) 系统上的 jail 中作为虚拟服务器运行。

网络图

我想要实现的目标

根据上图,我想添加一个反向代理服务器,在上述系统的 jail 内运行。来自 WAN 的请求需要根据 HTTP 标头中提供的主机名称定向到适当的服务器。

注意事项

  1. 标准港口转运:目前,我通过 LAN 路由器上的简单端口转发来访问这些服务器。这通常是一种可接受的解决方案,但是,当需要远程干扰网络时,保持 WAN 到 LAN 端口的直接关系就变得很困难。此外,对于除我之外需要访问这些服务器的用户来说,他们不必记住端口号会更容易。
  2. DD-WRT 应用程序:由于我的路由器运行的是 DD-WRT 固件,并且安装了 4 GiB USB 驱动器,因此我研究了在路由器上安装和运行反向代理服务器,使用 Pound 或类似的东西。我在网上搜索了很多方法。我遇到的问题是,大多数指南或教程都很旧,并且包含指向所需资源的无效链接。
  3. 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提示吗?

相关内容