一台服务器上有多个Django应用程序

时间:2012-08-28 10:05:26

标签: python django apache mod-wsgi

如何在多个域上提供多个Django应用程序?

例如我有

djangoapp1.com和djangoapp2.com

然后我在两个不同的位置有两个独立的应用

/ SRV /网络/ djangoapp1 / SRV /网络/ 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

4 个答案:

答案 0 :(得分:4)

您可以使用Apache的VirtualHosts

Django有很多例子,例如: here

答案 1 :(得分:3)

您可以采取许多方法,而不是简单的答案 - 这取决于您的要求和限制。

可能工作的最简单的事情很可能是@Hedde建议的方法 - 在虚拟主机内定义每站点的WSGI配置。

第二种可能更灵活的方法是在其自己的包含应用程序服务器中运行每个Django应用程序,例如: gunicorn(希望在virtualenv中隔离特定于应用程序的依赖项)在不同的端口上,然后使用Apache甚至Nginx作为应用程序流量的代理。

这需要一个更复杂的服务器环境来管理,但为您提供了能够单独管理您的应用程序的优势。

您可以一次为一个应用程序重新配置可用的工作人员,升级应用程序版本,更改settings.py等,而不必重新启动单个整体流程。

此外,虽然当然可以在同一个Apache进程中监视虚拟主机比单独监视单个应用程序服务器实例更复杂。

YMMV

答案 2 :(得分:0)

请查看这是否有用

在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

答案 3 :(得分:0)

在单个服务器上运行多个Django应用程序的一种方法是在每个端口上运行一个应用程序。

如何在两个不同的端口上运行两个应用?

按照Django的建议,我正在使用wsgi在apache和Django代码之间进行接口。棘手的是,您不能在“嵌入式​​”模式下使用wsgi。在嵌入式中,某些操作系统资源是共享的,因此会导致竞争状况。解决方案是在守护程序模式下使用wsgi。顾名思义,在守护程序模式下,wsgi作为单独的进程运行,因此没有共享资源。您的两个django应用程序不会相互识别。

这是我的配置外观。我正在端口8082和8083上运行应用程序。请注意带有WSGIDaemonProcessWSGIProcessGroupprocess-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 website的建议,我已替换

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"