Centos

在 Apache 中執行多個 Django 項目,sys.path 被覆蓋

  • January 12, 2014

我一直在嘗試研究如何使用 Apache VirtualHosts 進行多個 Python / Django 部署。

我遇到的問題似乎很簡單,

ImportError: Could not import settings 'hub.settings' (Is it on sys.path?): No module named hub.settings, referer: proposals.internal.local

我遇到的麻煩是proposals.internal.local 正在使用proposals.settings 而hub.settings 實際上來自hub.internal.local。

如果我自己只執行提案或集線器,我不會遇到上述問題,但是,當我同時執行它們時 - 因為人們使用它們。這兩個項目的 sys.path 似乎都已更新。

$$ APACHE CONFIGS - HUB $$

<VirtualHost *:80>

   ServerName hub.internal.local

   DocumentRoot /var/www/hub.internal.local/hub/hub/static
   Alias /static/  /var/www/hub.internal.local/hub/hub/static/

   <Directory /var/www/hub.internal.local/hub/hub/static>

       Allow from all

   </Directory>

   WSGIScriptAlias / /var/www/hub.internal.local/hub/hub/wsgi.py

</VirtualHost>

$$ APACHE CONFIGS - PROPOSALS $$

<VirtualHost *:80>

   ServerName proposals.internal.local

   DocumentRoot /var/www/proposals.internal.local/proposal/proposal/static
   Alias /static/  /var/www/proposals.internal.local/proposal/proposal/static/

   <Directory /var/www/proposals.internal.local/proposal/proposal/static>

       Allow from all

   </Directory>

   WSGIScriptAlias / /var/www/proposals.internal.local/proposal/proposal/wsgi.py

</VirtualHost>

$$ wsgi.py - HUB $$

import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hub.settings")
sys.path.append('/var/www/hub.internal.local')
sys.path.append('/var/www/hub.internal.local/hub')

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

$$ wsgi.py - PROPOSALS $$

import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proposal.settings")
sys.path.append('/var/www/proposals.internal.local')
sys.path.append('/var/www/proposals.internal.local/proposal')

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

顯然我遺漏了一些東西,但我沒有從文件中看到任何異常。

不要使用os.environ.setdefault(). 當 Django 切換到這種設置環境變數的方式時,他們在一個 mod_wsgi 程序中搞砸了多個應用程序的託管。

這在我的部落格中有記錄:在 Apache/mod_wsgi 下的錯誤 Django 實例中執行的請求。

如果這是原因,有兩種解決方案。最快的方法是將 WSGI 腳本文件中使用 setdefault() 設置環境變數替換為更常用的賦值。

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

另一種涉及更多工作但可能有其他好處的替代方法是切換到使用 mod_wsgi 的守護程序模式來執行 Django 實例並將每個實例委託給一組單獨的程序。通過在單獨的程序中執行 Django 實例,環境變數不可能從一個程序洩漏到另一個程序。

WSGIDaemonProcess project-2
WSGIScriptAlias /suburl /some/path/project-2/wsgi.py process-group=project-2

WSGIDaemonProcess project-1
WSGIScriptAlias / /some/path/project-1/wsgi.py process-group=project-1

引用自:https://serverfault.com/questions/566517