Mit*_*ent 6 rewrite nginx proxy proxypass
我们有 QA 版本、UAT 版本和 webapp 的 DEV 版本。用户需要通过访问这些http://uat.company.com:41002/webapp,http://qa.company.com:41002/webapp和http://dev.company.com:41002/webapp。在端口 41001 和端口 8080 上还有一个不同的 webapp,它们需要访问。
这些 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
Run Code Online (Sandbox Code Playgroud)
恐怕我不知道正确的术语,但是 URI 的其余部分和端口也必须转移到 IP 地址。即如果有人访问
http://uat.company.com:41002/webapp/somepage`
Run Code Online (Sandbox Code Playgroud)
看起来好像那是他们访问过的页面,但实际上他们会查看
http://123.123.123.1:41002/webapp/somepage
Run Code Online (Sandbox Code Playgroud)
或者如果他们访问过
http://qa.company.com:8080/static/home.html
Run Code Online (Sandbox Code Playgroud)
他们真的会看
http://123.123.123.2:8080/static/home.html
Run Code Online (Sandbox Code Playgroud)
但他们的浏览器仍然会说 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;
}
Run Code Online (Sandbox Code Playgroud)
}
但是,这给了我一个带有日志的错误网关 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/
Run Code Online (Sandbox Code Playgroud)
如果直接调用服务,这将重定向到
uat.company.com:41002/webapp/spring/config/main
Run Code Online (Sandbox Code Playgroud)
然而,通过代理发生的事情是它正在返回或结束于
uat.company.com/webapp/spring/config/main
Run Code Online (Sandbox Code Playgroud)
从而无法加载页面...
我已经确定了我的设置存在哪些问题。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
一旦我充实它,我将发布一个更通用的版本。非常感谢所有帮助过的人。
你想维护端口,那么你应该把它放在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;
}
}
Run Code Online (Sandbox Code Playgroud)
您必须意识到这将通过 nginx 代理请求。
| 归档时间: |
|
| 查看次数: |
31066 次 |
| 最近记录: |