【问题标题】:Multiple Django Apps on one Server一台服务器上的多个 Django 应用程序
【发布时间】:2012-08-22 19:50:57
【问题描述】:

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

【问题讨论】:

    标签: python django apache mod-wsgi


    【解决方案1】:

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

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

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

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

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

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

    YMMV

    【讨论】:

    • 您是否尝试过 dokku 在一台服务器上托管多个项目?
    【解决方案2】:

    你可以使用Apache的VirtualHosts

    有很多 Django 的例子,例如here

    【讨论】:

      【解决方案3】:

      在单个服务器上运行多个 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"
      

      【讨论】:

      【解决方案4】:

      看看有没有用

      在 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
      

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2019-10-29
        • 1970-01-01
        • 2019-06-15
        • 2014-03-21
        • 2021-03-02
        相关资源
        最近更新 更多