Centos
在 Apache 中執行多個 Django 項目,sys.path 被覆蓋
我一直在嘗試研究如何使用 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