繁体   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