2011-07-06 91 views
39

我試圖讓兩個(或更多)Django應用程序在子目錄中的同一個域下成立,如:多mod_wsgi的應用程序指向錯誤的應用程序

http://example.com/site1/ 
http://example.com/site2/ 

我知道,這正常通過設置一個像這樣的apache虛擬主機可以很好地工作:

<VirtualHost *:80> 
    ... 
    WSGIScriptAlias /site1 /path/to/site1.wsgi 
    WSGIScriptAlias /site2 /path/to/site2.wsgi 
</VirtualHost> 

現在,我已驗證每個網站都單獨運行。但是當我嘗試並行運行時,apache會將我發送到工作進程首先加載的任何站點。例如:

  1. 重啓Apache配置服務的6個線程
  2. 負載example.com/site1/,得到正確的頁面
  3. 負載example.com/site2/,得到正確的頁面
  4. 重複2再多3次。
  5. 重複刷新example.com/site1/,觀看它從一個站點到另一個站點的循環。

實際上,對於任何給定數量的工作進程,無論WSGIScriptAlias指令如何,它都會將發送請求的請求發送到先前發送請求的總數。無論我做什麼(設置WSGIProcessGroup,守護進程模式與嵌入模式或指令),它都會繼續出現這種行爲。

如果任何人都可以指出我做錯了什麼在這裏,這將是驚人的!

+0

當你更換,在「http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used」中描述的WSGI腳本文件,您能得到什麼? –

回答

48

我已經在一個單一的Apache運行多個應用程序WSGI安裝,並發現最容易做的事情就是有多個進程groups--一個爲每個應用程序。

一個缺點,其實與試圖讓一個進程來運行這兩個(或更多)的應用程序,是這可能會使用多一點的駐留內存比你能逃脫,否則。但它保持了很好的分離並避免了麻煩。這可能不是你的問題(這不適合我)。 (這可能不是那麼糟糕,他們可能能夠分享很多文本頁面?這只是空閒的猜測;我還沒有以任何方式驗證這一點,因爲我的設置完全不是內存不足的問題)

這裏是我的httpd.conf的一些片段,約:

WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000 
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/apache/django.wsgi 
<Location /khdx> 
WSGIProcessGroup khdx_wsgi 
</Location> 

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000 
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/django-root/apache/django.wsgi 
<Location /sauron> 
WSGIProcessGroup sauron_wsgi 
</Location> 
+3

除非你真的有一個無法修復的內存泄漏,否則生產網站不鼓勵使用最大請求。 –

+1

太棒了!位置塊內定義的獨立進程組工作。我唯一的遺憾是,我沒有早點問這裏;-) –

+0

謝謝,格雷厄姆!那是因爲偶爾的重啓延遲? –

1

我有麻煩,這一點我自己。我沒有試圖獲得Apache配置,而是決定使用單個WSGIScriptAlias,並使用WSGI中間件將請求路由到正確的應用程序。我的代碼是https://github.com/zhemao/flotilla。我沒有測試過這麼多,所以請謹慎使用它,但我希望它有幫助。

+1

由於Django依賴於單個DJANGO_SETTINGS_MODULE環境變量,因此不能在兩個不同的Django站點上執行此操作,該值是不能從一個請求更改爲下一個請求的值。 –

+0

噢,對,忘了。 –

10

多明戈伊格納西奧的回答讓我在正確的軌道上。我想指出一個關於使其工作的重要事實:兩個進程組必須在相同 VirtualHost中。 (這是基於我對Ubuntu 12.04.3 LTS,Apache 2.2.22和幾個使用Python編寫的WSGI應用程序的測試。)

例如,這並爲我工作,導致訪問APP1的能力,但一個404錯誤APP 2:

<VirtualHost *> 
     WSGIDaemonProcess app1 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app1 /app1/app1.wsgi 

     <Location /app1> 
       WSGIProcessGroup app1 
     </Location> 
</VirtualHost> 

<VirtualHost *> 
     WSGIDaemonProcess app2 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app2 /app2/app2.wsgi 

     <Location /app2> 
       WSGIProcessGroup app2 
     </Location> 
</VirtualHost> 

拆卸中間和標籤,這樣纔能有一個單一的虛擬主機,解決了這個問題:

<VirtualHost *> 
     WSGIDaemonProcess app1 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app1 /app1/app1.wsgi 

     <Location /app1> 
       WSGIProcessGroup app1 
     </Location> 

     WSGIDaemonProcess app2 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app2 /app2/app2.wsgi 

     <Location /app2> 
       WSGIProcessGroup app2 
     </Location> 
</VirtualHost>