在不久的将来,我将拥有 3 个 nginx 服务器。一个是其他两个的 SSL 反向代理。所以,例如,我去:
https://www.mysitename.com/site1
Run Code Online (Sandbox Code Playgroud)
本示例中的另外两个服务器是 site1 和 site2。我在代理上安装了 SSL 证书,我想使用反向代理(不需要 SSL,因为所有 3 个都在内部网络上)。出于测试目的,我让 nginx 在 443 上监听 SSL/反向代理,请监听端口 8081 是用于站点 1 的 Rails 应用程序,而 8082 用于站点 2。
我有这个...
server {
listen 443;
server_name mysitename.com;
ssl on;
ssl_certificate ssl/mysitename.com.crt;
ssl_certificate_key ssl/mysitename.com.key;
keepalive_timeout 60;
location /site1 {
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http:// https://;
}
location /site2 {
proxy_pass http://localhost:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http:// https://;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我访问 www.mysitename.com/site1 时,我希望它基本上返回通常来自 localhost:8081 的内容(或稍后返回另一台服务器的内部 IP)。
有没有办法让它从本地主机调用中删除“site1”?它似乎在做的是使用 localhost:8081/site1。site1 和 site2 站点具有“/login/index”或“/whatever/list”等性质,没有“site1”。
站点控制器中也有重定向(使用redirect_to),从/login/index 到/whatever/list。
我是否必须重新设计站点的 URL 才能使用 site1?或者 NGINX 代理能弄明白吗?
谢谢。
Max*_*nin 57
引用http://nginx.org/r/proxy_pass:
如果使用 URI 指定了 proxy_pass,则在向服务器传递请求时,与位置匹配的规范化请求 URI 的一部分将被指令中指定的 URI 替换:
Run Code Online (Sandbox Code Playgroud)location /name/ { proxy_pass http://127.0.0.1/remote/; }
也就是说,你必须proxy_pass
像这样使用:
location /site1/ {
proxy_pass http://localhost:8081/;
...
}
Run Code Online (Sandbox Code Playgroud)
注意尾随/
的proxy_pass
指令-它会替代的位置,也就是匹配原始的URI的一部分 /site1/
。