在Nginx反向代理中使用多个WSGI挂载点与Apache
我正在尝试在同一台服务器上使用Nginx和Apache设置多个虚拟主机,但遇到了一个奇怪的配置问题。
我已经把Nginx配置成了一个通用的上游服务器,指向Apache。
upstream backend {
server 1.1.1.1:8080;
}
我想在Nginx中设置多个子域名,这些子域名会指向Apache中的不同挂载点。每个子域名的行为类似于以下示例。
server {
listen 80;
server_name foo.yoursite.com;
location / {
proxy_pass http://backend/bar/;
include /etc/nginx/proxy.conf;
}
...
}
server {
listen 80;
server_name delta.yoursite.com;
location / {
proxy_pass http://backend/gamma/;
include /etc/nginx/proxy.conf;
}
...
}
这些挂载点指向的是Django项目,但每个URL的返回结果前面都加上了Apache的挂载点路径。所以,如果我访问foo.yoursite.com/wiki/biz/,Django似乎返回的是foo.yoursite.com/bar/wiki/biz/。同样地,如果我访问delta.yoursite.com/wiki/biz/,我得到的却是delta.yoursite.com/gamma/wiki/biz/。
有没有办法去掉Django和Apache返回的URL前缀呢?
1 个回答
1
最简单的方法是在WSGI脚本文件中使用以下内容:
... existing stuff
import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
# Wrapper to clear SCRIPT_NAME..
environ['SCRIPT_NAME'] = ''
return _application(environ, start_response)
问题出在每个服务器的挂载地址不同。因此,你需要让后端认为它实际上是挂载在服务器的根目录下,这就需要清除SCRIPT_NAME。
请注意,如果你直接访问后端,这样做可能会引发问题。在这种情况下,你需要修改上面的内容,只在请求是通过代理发来的时候才执行这个操作。