4

我正在使用 nginx 为可能位于防火墙后面的 Web 应用程序创建反向代理。对于我最初的概念证明,我使用了以下位置块来确保它有效。

    location / {
            proxy_pass https://localhost:2222;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

我在我的网络应用程序上使用ssh -f -N -T -R2222:localhost:443 user@nginx-ip. 这完全符合我的喜好。我在我nginx-ip的浏览器中输入我的内容,我从我的网络应用程序中获得了 https 流量,但被nginx-ip等混淆了。

我希望通过几千个端口(而不是在上述情况下只有 2222)允许潜在的几千个反向隧道。阅读 nginx,我想使用正则表达式来动态使用包含端口号的 URI 来 proxy_pass 到该特定端口。

也就是说,我愿意并且https://nginx-ip/2222/proxy_pass https://localhost:2222;愿意https://nginx-ip/1111/proxy_pass https://localhost:1111;

我已经尝试了很多变体,但据我所知,我认为这应该可行:

    location ~* ^/(\d+) {
            proxy_pass https://localhost:$1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }

它没有。我在浏览器中收到 502 Bad Gateway,错误日志显示:

2016/05/31 21:02:36 [错误] 6188#0: *3584 没有定义解析器来解析本地主机,客户端:{my-client-ip},服务器:本地主机,请求:“GET /2222/HTTP/1.1 ", 主机: "{nginx-ip}"

当我使用127.0.0.1而不是localhost我得到一个 404. 网页说

未找到 在此服务器上未找到请求的 URL /2222/。

我正在尝试使用 nginx 配置吗?

重申一下,我希望能够通过 nginx Web 服务器启动许多(数千个)独特的反向隧道。我最初的想法是根据我想要代理的其他 Web 应用程序来改变 nginx 服务器的传出端口,并通过 URI 中的端口将对我的 nginx 服务器的请求分配给不同的端口(通过正则表达式提取) .

4

2 回答 2

3

为了解决我的问题,在@Cirdec 的帮助下,我最终走向了不同的方向。

我没有使用 URI 中的路径来引用端口,而是成功地将端口用作子域。也就是说,1111.my-host-name将通过端口127.0.0.1( ) 上的反向代理发送内容。这需要使用一些 DNS 通配符来帮助处理一些繁重的列表(注意:通配符 DNS 匹配不起作用,但您可以硬编码一些条目来测试它是否有效。localhost1111/etc/hosts

摘自我的/etc/hosts文件:

nginx-box-ip-address     2222.my-host-name
nginx-box-ip-address     1111.my-host-name

这与 nginx 配置配对:

server {
    listen 443;
    server_name ~^(?<port_subdomain>[0-9]*).my-host-name$;

    # NOTE: omitted extra ssl configuration lines

    location / {
            proxy_pass https://127.0.0.1:$port_subdomain;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
}

现在我可以让我的网络应用程序打开反向代理隧道到我的 nginx 盒子(我的主机名)上的任意端口,并通过子域访问它们。

一步一步的例子:

  • 在我的一个 Web 应用程序框中,我打开了一个反向隧道以2222在我的 nginx 框(我的主机名)上端口ssh -f -N -T -R2222:localhost:443 user@my-host-name
    • 在不同的 Web 应用程序盒上,我可以打开到同一个 nginx 盒(我的主机名)的不同隧道,通过在不同的 Web 应用程序盒上1111运行来说端口ssh -f -N -T -R1111:localhost:443 user@my-host-name
  • 在我的 nginx 盒子上,我已经加载了上面的配置。我打开 chrome 并点击2222.my-host-name,就好像我直接点击了我的 web 应用程序框的 URL/IP 地址(由于反向代理,它只能位于防火墙后面)。Hitting1111.my-host-name将我带到另一个 Web 应用程序框,它是完全独立的,并通过一个完全独立的隧道。
于 2016-06-01T20:55:03.090 回答
1

您应该能够结合使用url 重写规则来删除指定端口的数字和命名捕获以将其提取requested_portproxy_pass指令的可用变量。

    location ~* ^/(?<requested_port>\d+) {
            rewrite /(\d+)(.*) /$1  break;
            proxy_pass https://localhost:$requested_port;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
于 2016-05-31T22:06:47.343 回答