根据 URL 将流量重定向到不同的 IP 地址,维护端口和 URL 信息

根据 URL 将流量重定向到不同的 IP 地址,维护端口和 URL 信息

我们有 QA 版、UAT 版和 DEV 版 Web 应用。用户需要通过 、 和 访问这些版本http://uat.company.com:41002/webapphttp://qa.company.com:41002/webapp他们http://dev.company.com:41002/webapp还需要访问端口 41001 和端口 8080 上的不同 Web 应用。

这些 URL 必须在公司外部可用,并且我们只有一个公共 IP 地址可以访问它们。因此 DNS 记录需要所有 3 个地址指向一个 IP。在该单个 IP 地址上,有一台服务器正在运行 nginx。在后台,我需要每个 URL 指向不同的服务器

http://uat.company.com --> 123.123.123.1
http://qa.company.com  --> 123.123.123.2
http://dev.company.com --> 123.123.123.3

恐怕我不知道正确的术语,但是 URI 的其余部分和端口也必须转移到 IP 地址。即如果有人访问

http://uat.company.com:41002/webapp/somepage`

看起来好像这就是他们访问过的页面,但实际上他们正在查看

http://123.123.123.1:41002/webapp/somepage

或者他们访问过

http://qa.company.com:8080/static/home.html

他们真正关注的是

http://123.123.123.2:8080/static/home.html

但他们的浏览器仍然会说http://qa.company.com:8080/static/home.html

我努力了

server {

    server_name uat.company.com;

    listen 41001;
    listen 41002;
    listen 8080;

    location / {
            proxy_pass http://123.123.123.1:$server_port$uri;
            proxy_set_header Host $host;
    }

}

但是这给了我一个带有日志的错误网关 502 页面:2015/01/28 16:04:49 [crit] 30571#0: *1 connect() to 123.123.123.1:41002 failed (13: Permission denied) while connecting to upstream, client: 172.23.128.245, server: uat.company.com, request: "GET /webapp/ HTTP/1.1", upstream: "http://123.123.123.1:41002/webapp/", host: "uat.company.com:41002"

我希望这更加清楚。


更新 根据 Xaviers 的建议,SELinux 可能已经妨碍了,我已将其禁用,并取得了进一步的进展。使用上面的 nginx 配置现在似乎正在连接到第二台服务器:但是端口仍然没有通过。我正在调用

uat.company.com:41002/webapp/

如果直接调用服务,则会重定向到

uat.company.com:41002/webapp/spring/config/main

然而,通过代理发生的事情是它正在返回或结束于

uat.company.com/webapp/spring/config/main

因此无法加载页面...

答案1

我已经确定我的设置中存在哪些问题。

1) SELinux 阻止我连接上游。我现在已经禁用了它,稍后会考虑正确设置它

2)proxy_pass 按照预期执行其工作,但我需要的参数是http://123.123.123.1:$server_port/$uri$is_args$args;

3)proxy_set_header Host $host正确地将主机名重新设置为我想要的,但它占用了端口号。我需要的正确格式是proxy_set_header Host $host:$server_port

对此可能有更简洁的解决方案,并且我还没有完整的工作解决方案,因为我已经将其削减以使其工作,但是我的配置的一个工作部分是:

server {
    listen 41002;
    server_name uat.comapny.com;

    location /webapp {
        proxy_pass http://123.123.123.1:41002/$uri$is_args$args;
        proxy_set_header Host $host:$server_port;
    }
}

一旦我完善了它,我将发布一个更通用的版本。非常感谢所有提供帮助的人。

答案2

如果你想维护端口,那么你应该把它放进去proxy_pass

server {

    server_name bob.something.com;

    listen 41001;
    listen 41002;
    listen 8080;

    location / {
            proxy_pass http://123.123.123.1:$server_port$uri;
            proxy_set_header Host $host;
    }
}

您必须意识到这将通过 nginx 代理请求。

相关内容