首页 > 解决方案 > Apache 总是在没有日志或终端反馈的情况下抛出 500 内部服务器错误

问题描述

当我在 localhost 服务器中遇到错误时,我正在使用 django 和 Apache2。Apache 会抛出 500 Internal Server Error,没有日志或终端反馈。我用官方 Apache2 安装了 mod_wsgi。我的 apache2.conf 看起来像这样:

WSGIPythonHome "/usr"
WSGIPythonPath var/www/mysite

<VirtualHost *:80> 
    WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py
    LoadModule wsgi_module "/home/server/.local/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"

    <Directory /var/www/mysite/mysite>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess 127.0.1.1 python-path=/var/www/mysite python-home=/usr
    WSGIProcessGroup 127.0.1.1

    Alias /file.zip /var/www/mysite/static/file.zip
    Alias /static/ /var/www/mysite/static/

    <Directory /var/www/mysite/static>
        Require all granted
    </Directory>
</VirtualHost> 

当我刚开始使用 apache 时,我确实有一些日志。他们告诉我它无法从 wsgi.py 导入 django,但我认为这些不会有太大帮助,因为它们是很久以前生成的。我把它留在里面,以防万一。我已经尝试了两天查看多个 Stack Exchange 站点,但没有找到合理的解释。我使用 sudo apachectl start 启动我的服务器。有人可以帮我找出为什么会发生这种情况以及如何预防吗?谢谢!

编辑:

我删除了旧的错误日志并再次运行该程序。错误日志显示无法从wsgi.py导入django,和之前我一开始创建的错误日志一样。

标签: pythondjangoserverapache2http-status-code-500

解决方案


有一个很好的服务 django 和 apache教程。它很旧,但它仍然应该很好地适用于您的情况。

从您的配置文件中,您的问题似乎出在以下两行之一:

LoadModule wsgi_module "/home/server/.local/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
WSGIDaemonProcess 127.0.1.1 python-path=/var/www/mysite python-home=/usr

您可能使用了错误的模块或错误的路径。我不知道该模块,但您可以检查路径,特别是与python-home.

首先检查您是否已全局安装了 django python -m django --version:. (如果您同时拥有 v2 和 v3,请使用 python3)

如果它在全局中,则检查查找 python 的安装位置(如果它不是默认目录)以查看您的 python 的安装位置并使用该路径。

如果您收到未安装的错误,您可能正在为您的项目使用虚拟环境。然后改用该路径。存在不同的虚拟环境程序,因此您需要检查它们的文档以找到所需的路径。例如,它可能在/var/www/mysite/venv. 那么它将是:

WSGIDaemonProcess 127.0.1.1 python-path=/var/www/mysite python-home=/var/www/mysite/venv

警告:某些虚拟环境无法移动。例如,如果您的项目在“/home/user/webproject”下,您在其中使用了“python -m venv venv”,并尝试将文件夹复制到 apache 下,则此虚拟环境路径将不起作用。在这种情况下,您将需要pip freeze程序。


我可以看出你的Loadmodule台词在困扰我的是什么。

首先,它显示您已经安装了本地 python,/home/server/.local/lib/python3.8/因此您可以将其用作您的python-home,但我不建议使用用户文件夹下的位置。

然后,用于/usr/sbin/httpd -M查看 apache 是否启动并加载模块。您可能没有将其设置为从该位置读取用户目录。它也可能只是引号的问题,删除引号。

简而言之,您私下从事您的项目,但 apache 将为公众服务。确保您在另一个文件夹中使用单独的安装,apache 可以自由读取/写入,而不会影响用户。


推荐阅读