在不久的将来,我将拥有 3 个 nginx 服务器。其中一个是另外两个 SSL 的反向代理。例如,我转到:
https://www.mysitename.com/site1
本例中的另外两台服务器是 site1 和 site2。我在代理上安装了 SSL 证书,我想使用反向代理(由于所有 3 个都在内部网络上,因此不需要 SSL)。出于测试目的,我让 nginx 在 443 上侦听 SSL/反向代理,在端口 8081 上侦听,这是 site1 的 rails 应用程序,8082 用于 site2。
我有这个...
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://;
}
}
因此,当我访问 www.mysitename.com/site1 时,我希望它基本上返回通常来自 localhost:8081(或稍后返回另一台服务器的内部 IP)的内容。
有没有办法让它从 localhost 调用中去掉“site1”?它似乎正在使用 localhost:8081/site1。site1 和 site2 站点的性质为“/login/index”或“/whatever/list”等,没有“site1”。
站点控制器中还有重定向(使用 redirect_to),从 /login/index 到 /whatever/list。
我是否必须重新设计网站的 URL 才能使用 site1?或者 NGINX 代理可以解决这个问题吗?
谢谢。
答案1
引用http://nginx.org/r/proxy_pass:
如果 proxy_pass 指定了 URI,则在向服务器传递请求时,与位置匹配的规范化请求 URI 的一部分将被指令中指定的 URI 替换:
location /name/ { proxy_pass http://127.0.0.1/remote/; }
也就是说,你必须proxy_pass
像这样使用:
location /site1/ {
proxy_pass http://localhost:8081/;
...
}
/
注意指令中的尾随proxy_pass
- 它将替换位置匹配的原始 URI 的一部分,即 /site1/
。