2010-04-05 35 views
1

我正嘗試在Nginx和Apache的同一臺服務器上設置多個虛擬主機,並且遇到了一個奇怪的配置問題。在Apache中使用多個WSGI掛載點和Nginx反向代理

我有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的項目,但每個網址條目都回來了與Apache安裝點路徑前綴。所以,如果我爲foo.yoursite.com/wiki/biz/調用django url條目,則django似乎將返回foo.yoursite.com/bar/wiki/biz/。同樣,如果我要求delta.yoursite.com/wiki/biz/的url條目,我可以獲得delta.yoursite.com/gamma/wiki/biz/。

有什麼辦法擺脫由django和apache在url條目上返回的前綴?

回答

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) 

問題就來了約,因爲在不同的URL每個服務器坐騎。因此,您必須通過清除SCRIPT_NAME來使後端認爲它實際安裝在服務器的根目錄中。

請注意,如果您也直接訪問後端,會導致問題。在這種情況下,您需要修改上述內容,以便只有通過代理髮送請求才能執行此操作。

+0

清除SCRIPT_NAME環境變量有訣竅。謝謝,格雷厄姆! – Thomas 2010-04-06 15:10:15