【问题标题】:Serving Multiple WSGI Applications As Different Virtual Hosts on Apache在 Apache 上将多个 WSGI 应用程序作为不同的虚拟主机提供服务
【发布时间】:2017-11-17 04:07:49
【问题描述】:

我有一个 EC2 AWS 服务器,我想在其上托管几个 Django 应用程序。这些应用程序中的每一个都有自己的 URL。例如,

example1.com example2.com

就其本身而言,example1.com 有效。问题是让example2.com 同时使用它。

当我访问example2.com时,我得到一个错误:

DisallowedHost at /
Invalid HTTP_HOST header: 'example2.com'. You may need to add 'example2.com' to ALLOWED_HOSTS.
Request Method: GET
Request URL:    http://example2.com
Django Version: 1.9.13
Exception Type: DisallowedHost
Exception Value:    
Invalid HTTP_HOST header: 'example2.com'. You may need to add 'example2.com' to ALLOWED_HOSTS.
Exception Location: /var/www/vhosts/example1/example1-env/lib/python3.5/site-packages/django/http/request.py in get_host, line 109
Python Executable:  /usr/bin/python3
Python Version: 3.5.1
Python Path:    
['/usr/lib64/python3.5',
 '/usr/lib64/python3.5/plat-linux',
 '/usr/lib64/python3.5/lib-dynload',
 '/usr/local/lib64/python3.5/site-packages',
 '/usr/local/lib/python3.5/site-packages',
 '/usr/lib64/python3.5/dist-packages',
 '/usr/lib/python3.5/dist-packages',
 '/var/www/vhosts/example1/',
 '/var/www/vhosts/example1/example1-env/lib/python3.5/site-packages']
Server time:    Wed, 14 Jun 2017 20:31:27 +0000

如您所见,Apache 在为example2.com 服务时试图以某种方式使用example1.com 的虚拟环境。我该如何纠正?每个都应该使用自己的 virtualenv。

这里是 Apache 配置文件:

    <VirtualHost *:80>
        # This is name based virtual hosting. So place an appropriate server name
        #   here. Example: django.devsrv.local
        ServerName  example1.com

        WSGIDaemonProcess example1 python-home=/var/www/vhosts/example1/example1-env
        WSGIProcessGroup %{GLOBAL}

        # Insert the full path to the wsgi.py-file here
        WSGIScriptAlias / /var/www/vhosts/example1/example1/wsgi.py

        <Directory /var/www/vhosts/example1/>
            Require all granted
        </Directory>

        Alias /static/ /var/www/vhosts/example1/static/

        <Directory /var/www/vhosts/example1/static/>
        Order deny,allow
        Allow from all
        </Directory>

        Alias /media/ /var/www/vhosts/example1/media/
        <Directory /var/www/vhosts/example1/media/>
        Order deny,allow
        Allow from all
        </Directory>

    </VirtualHost>

    <VirtualHost *:80>
        # This is name based virtual hosting. So place an appropriate server name
        #   here. Example: django.devsrv.local
        ServerName  example2.com
        WSGIDaemonProcess example2 python-home=/var/www/vhosts/example2/example2-env
        WSGIProcessGroup %{GLOBAL}

        # Insert the full path to the wsgi.py-file here
        WSGIScriptAlias / /var/www/vhosts/example2/example2/wsgi.py

        <Directory /var/www/vhosts/example2/>
            Require all granted
        </Directory>

        Alias /static/ /var/www/vhosts/example2/static/

        <Directory /var/www/vhosts/example2/static/>
        Order deny,allow
        Allow from all
        </Directory>

        Alias /media/ /var/www/vhosts/example2/media/
        <Directory /var/www/vhosts/example2/media/>
        Order deny,allow
        Allow from all
        </Directory>
  </VirtualHost>

编辑: 在阅读了 cmets 中的一些建议后,我来到了这里。这仍然不起作用。

ServerName  example1.com

WSGIDaemonProcess example1 display-name=%{GROUP} python-path=/var/www/vhosts/example1/ python-home=/var/www/vhosts/example1/example1-env/
WSGIApplicationGroup %{GLOBAL}
WSGIProcessGroup example1

# Insert the full path to the wsgi.py-file here
WSGIScriptAlias / /var/www/vhosts/example1/example1/wsgi.py process-group=example1

...

ServerName  example2.com

WSGIDaemonProcess example2 display-name=%{GROUP} python-home=/var/www/vhosts/example2/example2-env/ python-path=/var/www/vhosts/example2/
WSGIApplicationGroup %{GLOBAL}
WSGIProcessGroup example2

# Insert the full path to the wsgi.py-file here
WSGIScriptAlias / /var/www/vhosts/example2/example2/wsgi.py process-group=example2

【问题讨论】:

  • 这个错误与虚拟环境无关。您需要在 settings.py 中将 example2.com 添加到允许的主机。
  • 你没有抓住重点。这不会解决它,因为错误来自 example1 env Python
  • 您错误地设置了WSGIProcessGroup。它应该是虚拟主机的守护进程组的名称,而不是%{GLOBAL}。您可能指的是WSGIApplicationGroup %{GLOBAL},这是推荐的,但您仍然需要WSGIProcessGroup。阅读blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html
  • @GrahamDumpleton 如果我理解正确,我可以设置WSGIApplicationGroup %{GLOBAL},然后给WSGIPRocessGroup我选择的任意名称吗?
  • 我做了一些编辑来展示我尝试过的东西(除其他外)。仍然无法让它工作。

标签: django apache virtualenv mod-wsgi wsgi


【解决方案1】:

以下配置对我有用。简而言之,它使用各自的虚拟环境在example1.comexample2.com 为两个不同的 Django 应用程序提供服务。

如您所见,插入 ServerAlias AND ServerName 带来了巨大的变化,同时社区提出了一些其他更正建议。

Apache 配置:

<IfModule !wsgi_module>
LoadModule wsgi_module modules/mod_wsgi.so
</IfModule>

<VirtualHost *:80>

    ServerName  www.example1.com
    ServerAlias example1.com

    WSGIDaemonProcess example1 display-name=%{GROUP} python-path=/var/www/vhosts/example1/ python-home=/var/www/vhosts/example1/example1-env/
    WSGIApplicationGroup %{GLOBAL}
    WSGIProcessGroup example1


    # Insert the full path to the wsgi.py-file here
    WSGIScriptAlias / /var/www/vhosts/example1/example1/wsgi.py process-group=example1

    <Directory /var/www/vhosts/example1/>
        Require all granted
    </Directory>

    Alias /static/ /var/www/vhosts/example1/static/

    <Directory /var/www/vhosts/example1/static/>
    Order deny,allow
    Allow from all
    </Directory>

    Alias /media/ /var/www/vhosts/example1/media/
    <Directory /var/www/vhosts/example1/media/>
    Order deny,allow
    Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:80>

    ServerName  www.example2.com
    ServerAlias example2.com

    WSGIDaemonProcess example2 display-name=%{GROUP} python-home=/var/www/vhosts/example2/example2-env/ python-path=/var/www/vhosts/example2/
    WSGIApplicationGroup %{GLOBAL}
    WSGIProcessGroup example2

    # Insert the full path to the wsgi.py-file here
    WSGIScriptAlias / /var/www/vhosts/example2/example2/wsgi.py process-group=example2

    <Directory /var/www/vhosts/example2/>
        Require all granted
    </Directory>

    Alias /static/ /var/www/vhosts/example2/static/

    <Directory /var/www/vhosts/example2/static/>
    Order deny,allow
    Allow from all
    </Directory>

    Alias /media/ /var/www/vhosts/example2/media/
    <Directory /var/www/vhosts/example2/media/>

</VirtualHost>

【讨论】:

  • 您不需要ServerAlias 来让虚拟主机工作。如果您确实还需要通过没有www 的主机名访问它,则只需要ServerAliasWSGIProcessGroup 是多余的,因为您有 process-group 选项到 WSGIScriptAlias。您也可以使用application-group 选项来消除WSGIScriptAlias 以消除WSGIApplicationGroup,尽管请注意使用WSGIScriptAlias 的这两个选项将启用在进程启动时预加载WSGI 脚本。
猜你喜欢
  • 2013-10-06
  • 2018-09-08
  • 2023-04-03
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多