簡體   English   中英

一台服務器上的多個 Django 應用程序

[英]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 上運行應用程序。注意帶有WSGIDaemonProcessWSGIProcessGroup以及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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM