[英]nginx, flower, Django, proxy_pass, and rejecting invalid HOSTs
[英]multiple django apps with nginx proxy_pass and rewrite
我有一个名为myapp
django-admin应用程序,我想在不同的物理盒上部署多个实例,每个客户一个。 但是,我希望所有这些都可以从类似的域名mydomain.com/customer1/myapp
访问。
我已经摆弄了特定的代理设置,并在SO上尝试了多项建议,但没有一个非常适合我的用例...而且因为我对nginx
和django
都知之甚少,所以我很茫然!
我目前的nginx.conf是:
server {
listen 80;
server_name myserver.com
location ^~ /static {
alias /path/to/static/files/;
}
# location / {
# proxy_pass http://127.0.0.1:8001;
# }
location ^~ /customer1/myapp/static {
alias /path/to/static/files/;
}
location /customer1/myapp {
rewrite ^/customer1/myapp/(/?)(.*) /$2 break;
proxy_pass http://127.0.0.1:8001;
}
}
我可以通过myserver.com/customer1/myapp/admin
按预期进入登录屏幕。 但是,当我尝试登录时,nginx将我的URL重写为myserver.com/admin
,这不是一个有效的URL。 如何让nginx实际重写url并只更改传递给127.0.0.1:8001
的url?
FWIW,我正在使用gunicorn服务于gunicorn -b 127.0.0.1:8001 -n myapp
。 如果我取消注释/
location并删除最后两个位置块,那么应用程序效果很好。
如果有其他选择,我对这种方法的态度还很远。 目标是避免为每个部署修改django代码,而只是为nginx.conf添加最少的代码以用于新部署。
基本上,您指定url作为proxy_pass指令的一部分,以下位置指令应该这样做:
location ~ ^/customer1/myapp(/?)(.*) {
proxy_pass http://127.0.0.1:8001/$2;
}
有关nginx如何通过uri的详细说明,请参见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
您应该使用以下内容:
location /customer1/myapp {
return 302 $uri/;
}
location /customer1/myapp/ {
proxy_pass http://127.0.0.1:8001/
}
请注意,这优于在proxy_pass
使用变量,因为如果您确实使用变量,那么proxy_redirect
不能再是默认值default
,而是将off
,然后您的应用中的内部302
重定向将不会映射到/customer1/myapp/
在被nginx提取之后,这可能会给你带来麻烦和更多的404。
并且,是的,为个人客户使用单个域是一个更好的主意,因为它更安全(例如,就cookie处理而言)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.