只有第一个要加载的 Django 站点有效

Only the first Django site to be loaded works

我最近向 Whosebug 提交了一个标题为 Django infinite loading after multiple requests on apache using mod_wsgi 的问题。无论如何,我最近更改了很多代码,现在我遇到了一个新问题。我请求的第一个 Django 网站有效,但是,第二个指向我加载的第一个网站并给出响应 DisallowedHost 因为显然它正在尝试访问具有不同域名的 Django 应用程序。我显然希望它这样做它应该这样做,如果有人能帮助我那会很棒。这是我所有的代码。


编辑: 使用 Razenstein 的建议,我的网站现在停止运行,这意味着它们无法加载。

编辑 #2 每次我尝试连接到 neostorm.us.to(我的第一个网站)[Sun Apr 03 19:26:58.563023 2022] [ssl:info] [pid 17528:tid 2116] [client 10.0] 时都会出现此错误.0.138:59334] AH01964:连接到 child 147 已建立(服务器 astinarts.uk.to:443)

编辑#3 运气不好,我用它更新了我的 XAMPP 版本,Apache 问题仍然存在。似乎没有人知道为什么会这样。我的 python 版本(3.10.4)

虚拟主机

    LoadFile "C:/Users/taber/AppData/Local/Programs/Python/Python310/python310.dll"
    LoadModule wsgi_module "C:/Users/taber/AppData/Local/Programs/Python/Python310/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
    WSGIPythonHome "C:/Users/taber/AppData/Local/Programs/Python/Python310"
    ##################################################################################################
    #                                       ASTINARTS.UK.TO VIRTUAL HOST                             #
    ##################################################################################################
    <VirtualHost *:443>
        ServerName astinarts.uk.to
        SSLEngine on
        SSLCertificateFile "conf/astinarts/astinarts.uk.to-chain.pem"
        SSLCertificateKeyFile "conf/astinarts/astinarts.uk.to-key.pem"
    
    Alias /static "C:/xampp/htdocs/astinarts/static"
    <Directory "C:/xampp/htdocs/astinarts/static">
        Require all granted
    </Directory>
    Alias /media "C:/xampp/htdocs/astinarts/media"
    <Directory "C:/xampp/htdocs/astinarts/media">
        Require all granted
    </Directory>
    Alias /.well-known "C:/xampp/htdocs/astinarts/.well-known"
    <Directory "C:\xampp\htdocs\astinarts\.well-known">
        Require all granted
    </Directory>
    Alias /sitemap.xml "C:/xampp/htdocs/astinarts/sitemap.xml"
    Alias /robots.txt "C:/xampp/htdocs/astinarts/robots.txt"
    <Directory "C:/xampp/htdocs/astinarts/astinarts">
        Require all granted
    </Directory>
    WSGIScriptAlias / "C:/xampp/htdocs/astinarts/astinarts/wsgi.py"
    <Directory "C:/xampp/htdocs/astinarts/astinarts">
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    </VirtualHost>
    ##################################################################################################
    #                                       NEOSTORM.US.TO VIRTUAL HOST                              #
    ##################################################################################################
    <VirtualHost *:443>
        ServerName neostorm.us.to
        SSLEngine on
        SSLCertificateFile "conf/ssl.crt/neostorm.us.to-chain.pem"
        SSLCertificateKeyFile "conf/ssl.key/neostorm.us.to-key.pem"
    Alias /static "C:/xampp/htdocs/neostorm/static"
    <Directory "C:/xampp/htdocs/neostorm/static">
        Require all granted
    </Directory>
    Alias /media "C:/xampp/htdocs/neostorm/media"
    <Directory "C:/xampp/htdocs/neostorm/media">
        Require all granted
    </Directory>
    Alias /sitemap.xml "C:/xampp/htdocs/neostorm/sitemap.xml"
    Alias /robots.txt "C:/xampp/htdocs/neostorm/robots.txt"
    WSGIScriptAlias / "C:/xampp/htdocs/neostorm/neostorm/wsgi_windows.py"
    <Directory "C:/xampp/htdocs/neostorm/neostorm">
        <Files wsgi_windows.py>
            Require all granted
        </Files>
    </Directory>
    ErrorLog "C:\xampp\apache\logs\neostorm_error.log"
    CustomLog "C:\xampp\apache\logs\neostorm_custom.log" common
    </VirtualHost>
    ##################################################################################################
    #                                   MAIL.NEOSTORM.US.TO VIRTUAL HOST                             #
    ##################################################################################################
    <VirtualHost *:443>
        ServerName mail.neostorm.us.to
        SSLEngine on
        SSLCertificateFile "conf/ssl.crt/neostorm.us.to-chain.pem"
        SSLCertificateKeyFile "conf/ssl.key/neostorm.us.to-key.pem"
        DocumentRoot "C:/xampp/htdocs/webmail"
        <Directory "C:/xampp/htdocs/webmail">
            Require all granted
        </Directory>
    </VirtualHost>

站点 1 WSGI 文件

    import os
    import sys
    from django.core.wsgi import get_wsgi_application
    from pathlib import Path
    
    # Add project directory to the sys.path
    path_home = str(Path(__file__).parents[1])
    if path_home not in sys.path:
        sys.path.append(path_home)
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'astinarts.settings'
    
    application = get_wsgi_application()

站点 2 WSGI 文件


    import os
    import sys
    from django.core.wsgi import get_wsgi_application
    from pathlib import Path
    
    # Add project directory to the sys.path
    path_home = str(Path(__file__).parents[1])
    if path_home not in sys.path:
        sys.path.append(path_home)
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'neostorm.settings'
    
    application = get_wsgi_application()

注意:我不知道以下行为是否适用于 mod_wsgi 的所有版本,以及该错误是否已修复。我在 Windows 的 2020/2021 年观察到了它。版本记不清了。它从未出现在 Ubuntu 环境中。

如果您在 Windows Apache 中使用 virt 主机和 mod_wsgi 并定义 App..Group %{GLOBAL} 总是第一个(!!)virt 中的 WSGIApplication。 host 将被称为任何 ServerName 等。那一定是 mod_wsgi 或 Apache 中的错误。

<VirtualHost *:443>
    ServerName my_server_one.com
    ....
    WSGIApplicationGroup %{GLOBAL}
    ....
</VirtualHost>


<VirtualHost *:443>
    ServerName my_server_two.com
    ....
    WSGIApplicationGroup %{GLOBAL}
    ....
</VirtualHost>

解决方案:使用单独的显式组名称:

    
<VirtualHost *:443>
    ServerName my_server_one.com
    ....
    WSGIApplicationGroup my_app_one
    ....
</VirtualHost>



<VirtualHost *:443>
    ServerName my_server_two.com
    ....
    WSGIApplicationGroup my_app_two
    ....
</VirtualHost>

问题不在于拥有多个网站,使用 mod wsgi 甚至使用 Windows。实际问题是数据库。由于某种原因(不知道为什么)默认数据库损坏。

我的解决方案是从默认数据库切换到 MySQL。我不完全确定为什么默认数据库会损坏。

如果你想切换到 MySQL,你可以这样做。

在你的 settings.py 中找到 DATABASES 并把它变成这样。

DATABASES = {
'default': {
    'ENGINE'  : 'django.db.backends.mysql', # <-- UPDATED line 
    'NAME'    : 'DATABASE_NAME',                 # <-- UPDATED line 
    'USER'    : 'USER',                     # <-- UPDATED line
    'PASSWORD': 'PASSWORD',              # <-- UPDATED line
    'HOST'    : 'localhost',                # <-- UPDATED line
    'PORT'    : '3306',
}
}

有关详细信息,请参阅:Django 网站在请求后加载失败