添加 Django 站点会破坏我在 CentOS 7 上的虚拟主机

Posted

技术标签:

【中文标题】添加 Django 站点会破坏我在 CentOS 7 上的虚拟主机【英文标题】:Adding a Django site breaks my virtual hosts on CentOS 7 【发布时间】:2017-03-04 04:12:22 【问题描述】:

我有一个 CentOS 7 服务器,其中包含大约 20 个域,所有域都通过 /etc/httpd/conf.d 中的 vhosts 文件自动管理。

我正在尝试学习 Django 并想使用它设置一个域,所以我在 .conf 文件中添加了一个特定的虚拟主机。

结果是 Django 域工作正常,但 所有其他站点都坏了(尝试使用 Django 但会导致错误)。

Django 域有两个文件夹: djangodomain.com 用于静态文件,djangodomain.app 用于 Python 文件。

如何将单个 Django 域集成到我现有的多域虚拟主机设置中?

现有的 vhosts.conf:

<VirtualHost *:80>
    serveradmin username@domain.com
    serveradmin username@domain.com

    usecanonicalname off

    # www.site.com » site.com
    rewriteengine on
    rewritecond %HTTP_HOST    ^www\.(.*)$ [nc]
    rewriterule ^(.*)$          http://%1   [r=301,l]

    # file locations
    virtualdocumentroot "/home/username/%0"

    <directory "/home/username/*">
        allowoverride all
        require all granted
        options indexes followsymlinks
        options +execcgi
        options +includes
    </directory>
</VirtualHost>

我添加的内容破坏了除 Django 网站之外的所有内容:

<VirtualHost djangodomain.com:80>
    ServerName djangodomain.com
    ServerAlias www.djangodomain.com
    ServerAdmin user@domain.com

    DocumentRoot /home/username/djangodomain.com

    WSGIScriptAlias / /home/username/djangodomain.app/django.wsgi

    <Directory /home/username/djangodomain.app>
        Order allow,deny
        Allow from all
    </Directory>

    Alias /robots.txt /home/username/djangodomain.com/robots.txt
    Alias /favicon.ico /home/username/djangodomain.com/favicon.ico
    Alias /images /home/username/djangodomain.com/images
    Alias /static /home/username/djangodomain.com/static

    ErrorLog /home/username/djangodomain.logs/error.log
    CustomLog /home/username/djangodomain.logs/access.log combined
</VirtualHost>

转帖到unix.stackexchange.com

【问题讨论】:

看起来你只需要在 vhosts.conf 文件中,将 django 部分放在底部 我试过了,但没有任何改变。我还尝试将它放在一个单独的文件中,在动态虚拟主机之后加载。 不要在 virtualhost 指令中使用名称。 【参考方案1】:

当 Apache 收到一个 HTTP 请求时,它需要知道应该由哪个虚拟主机来处理这个请求。现在,它的工作方式是。 Apache 获取客户端请求进入的 IP 地址(服务器 IP,而不是客户端),并通过虚拟主机定义列表查找为该 IP 定义的任何虚拟主机。如果有多个,它将​​查看 Host 标头并尝试将其与特定的 ServerName 或 ServerAlias 指令匹配。如果仍然找不到,它会寻找一个默认的虚拟主机。

您有两个虚拟主机定义。如果端口 80 &lt;VirtualHost *:80&gt; 上的默认虚拟主机,则为一个。这是默认设置,因为它有 * 表示 IP。另一个特定于 IP 地址&lt;VirtualHost djangodomain.com:80&gt;。它使用的 IP 是 djangodomain.com 解析到的任何内容。

因此,任何来自该 IP 的请求都将由 IP 特定配置处理,然后才可能被允许进入默认设置。

要解决此问题,您需要将您的 django 虚拟主机指令替换为 &lt;VirtualHost *:80&gt;,与您的其他虚拟主机相同。这应该使它们都处于相同的解析优先级,它将只使用 Host 标头来找出其余部分。

也就是说,如果您正在运行具有 20 多个虚拟主机的 Web 服务器,您确实需要更好地了解它的工作原理。如果有时间,请阅读 HTTP 和网络托管。

【讨论】:

它按照您的建议工作,并使用 将 Django 主机放在动态主机之后。

以上是关于添加 Django 站点会破坏我在 CentOS 7 上的虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

迁移后在 Django 上更改 db_table 不起作用,并且添加用户 (AbstractUser) 外键会破坏 __str__()

一个 Django 实例下的多个站点 - 站点有时会提供错误的内容

Django + MySQL - 管理站点 - 添加用户 - OperationalError - SAVEPOINT 不存在

Django 管理站点:添加用户页面如何工作(编辑更多字段)?

django-mptt 过滤而不破坏树

无法禁用 Django CSRF 框架并且正在破坏我的网站