[英]Multiple Django Apps on one Server
如何在多個域上提供多個 Django 應用程序?
例如我有
djangoapp1.com 和 djangoapp2.com
然后我在兩個不同的位置有兩個單獨的應用程序
/srv/www/djangoapp1 /srv/www/djangoapp2
我正在使用 mod_wsgi 運行 Apache2,我目前在其 httpd.conf 中有以下內容
WSGIScriptAlias / /srv/www/app1/app1/wsgi.py
WSGIPythonPath /srv/www/app1
<Directory /srv/www/app1/system>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
然后我顯然也有虛擬主機,我得到了 django 默認安裝頁面,但現在我想提供我的第二個應用程序,有人能指出我正確的方法嗎?
Django V:1.4.1
您可以在此處采用多種方法,沒有簡單的答案 - 這取決於您的要求和約束。
可能可行的最簡單的事情很可能是@Hedde 建議的方法 - 在虛擬主機內定義每個站點的 WSGI 配置。
第二種可能更靈活的方法是在它自己的包含應用程序服務器中運行每個 Django 應用程序,例如gunicorn (希望在virtualenv中隔離應用程序特定的依賴項)在不同的端口上,然后使用 Apache 甚至Nginx作為應用程序流量的代理。
這涉及更復雜的服務器環境來管理,但為您提供了能夠單獨管理應用程序的優勢。
您可以一次為一個應用程序重新配置可用的工作線程、升級應用程序版本、更改 settings.py 等,而不必重新啟動單個單一進程。
此外,盡管當然有可能,但監控同一 Apache 進程中的虛擬主機比單獨監控單個應用程序服務器實例更復雜。
青年會
您可以使用 Apache 的VirtualHosts
Django 有很多例子,例如這里
在單個服務器上運行多個 django 應用程序的一種方法是在每個端口上運行一個應用程序。
如何在兩個不同的端口上運行兩個應用程序?
按照 Django 的建議,我使用 wsgi 來連接 apache 和 Django 代碼。 這里棘手的事情是您不能在“嵌入式”模式下使用 wsgi。 在嵌入式中,一些操作系統資源是共享的,因此會導致競爭條件。 解決方案是在守護進程模式下使用 wsgi。 在守護進程模式下,顧名思義,wsgi 作為單獨的進程運行,因此沒有共享資源。 您的兩個 django 應用程序將不知道彼此。
這就是我的配置的樣子。 我在端口 8082 和 8083 上運行應用程序。注意帶有WSGIDaemonProcess
和WSGIProcessGroup
以及process-group=pas
Listen 8082
<VirtualHost *:8082>
WSGIDaemonProcess djangoapp1 processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup djangoapp1
WSGIScriptAlias /apis /home/apis/djangoapp1/xyz/config.wsgi process-group=djangoapp1
WSGIApplicationGroup %{GLOBAL}
<Directory /home/apis/djangoapp1>
Options +ExecCGI
<Files config.wsgi>
Require all granted
</Files>
</Directory>
</VirtualHost>
Listen 8083
<VirtualHost *:8083>
WSGIDaemonProcess djangoapp2 processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup djangoapp2
WSGIScriptAlias /apis /home/apis/discovery_api/nykaa/config.wsgi process-group=djangoapp2
WSGIApplicationGroup %{GLOBAL}
<Directory /home/apis/djangoapp2>
Options +ExecCGI
<Files config.wsgi>
Require all granted
</Files>
</Directory>
</VirtualHost>
如何在端口 80 上為這兩個應用程序提供服務?
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName example.com
ServerAlias localhost
ProxyPassMatch "^/(apis/v1/hello$.*)" "http://127.0.0.1:8082/$1"
ProxyPassMatch "^/(apis/v1/hi$.*)" "http://127.0.0.1:8082/$1"
ProxyPassMatch "^/(apis/v1/wassup$.*)" "http://127.0.0.1:8083/$1"
ProxyPassMatch "^/(apis/v1/howdy$.*)" "http://127.0.0.1:8083/$1"
</VirtualHost>
訪問 wassup 和 hello API 的兩種方式:
http://example.com:8083/apis/v2/wassup?q=howsitgoing
http://example.com/apis/v2/wassup?q=howsitgoing
http://example.com:8082/apis/v2/hello?q=how are you
http://example.com/apis/v2/hello?q=howareyou
Django 代碼按照Django 網站上的推薦,我已經替換了
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
到
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
請看看這是否有幫助
在 apache2.conf 或 htppd.conf 中
# Virtual hosts setup
NameVirtualHost *
<VirtualHost *>
ServerName example1.com
............
WSGIScriptAlias / /..../path/to/wsgi1.py
</VirtualHost>
<VirtualHost *>
ServerName example2.com
............
WSGIScriptAlias / /..../path/to/wsgi2.py
</VirtualHost>
in wsgi1.py
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings1' # or projectnaame.settings1
in wsgi2.py
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings2' # or projectname.settings2
In settings1.py & settings2.py you can make necessary databases and other configurations
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.