4

如何在多个域上提供多个 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

4

4 回答 4

6

您可以在这里采取许多方法,但没有简单的答案 - 这取决于您的要求和限制。

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

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

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

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

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

YMMV

于 2012-08-28T10:31:54.933 回答
5

您可以使用 Apache 的VirtualHosts

Django有很多例子,例如here

于 2012-08-28T10:11:37.923 回答
1

在单个服务器上运行多个 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"
于 2019-05-10T15:40:20.947 回答
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
于 2016-05-02T09:48:18.760 回答