【问题标题】:Apache throws ERROR 500: Internal Server Error when GET from localhost/internal networkApache 抛出 ERROR 500: Internal Server Error when GET from localhost/internal network
【发布时间】:2020-04-02 17:05:49
【问题描述】:

我有一个使用 mod_wsgi 安装了 apachedjango 的生产服务器。

django 应用程序有一个 REST API,它在发送 GET 请求时提供一些信息。

这在开发服务器上一直运行良好,如果我们在屏幕中使用 manage.py 运行 django。现在我们用运行 django 的 apache 创建了一个生产服务器,但是这个 API 在从 localhost 运行 wget 时返回 Error 500 或同一网络中的其他机器(使用 192.168.XX IP)。

这是 wget 的输出:

~$ wget localhost:80/someinfo
--2020-04-02 16:26:59--  http://localhost/someinfo
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 500 Internal Server Error
2020-04-02 16:26:59 ERROR 500: Internal Server Error.

好像连接成功了,估计不是apache的问题。错误来自 API 响应。

apache error.log 中的错误如下所示:

127.0.0.1 - - [02/Apr/2020:14:24:36 +0000] "GET /someinfo HTTP/1.1" 500 799 "-" "Wget/1.19.4 (linux-gnu)"

问题:500后面的数字是多少?有时是 799,有时是 803。

但如果请求是从外部(即浏览器)使用服务器的公共 IP 完成的,则 API 工作正常,我会看到正确的信息。

我已经检查了 django 允许的主机,它正在接受 localhost,以及另一台机器的 192.168.X.X IP。最后我像这样离开了 django 的 settings.py

#ALLOWED_HOSTS = ['localhost', '127.0.0.1', '192.168.1.101']
ALLOWED_HOSTS = ['*']

注意:192.168.1.101 是尝试发出 GET 请求的机器。 所有这一切的最终目标是能够从该机器上运行的 python 脚本发出 GET 请求(如果 django 通过 manage.py 运行,它已经可以工作)。

我的 apache.conf


    <VirtualHost *:80>

            ServerAdmin webmaster@localhost
            #DocumentRoot /var/www/html

            Alias /static /home/myuser/myproject/django/static_root
        <Directory /home/myuser/myproject/django/static_root>
            Require all granted
        </Directory>

        <Directory /home/myuser/myproject/django/myproject_django>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        WSGIDaemonProcess myproject python-home=/home/myuser/env python-path=/home/myuser/myproject/django
        WSGIProcessGroup myproject
        WSGIScriptAlias / /home/myuser/myproject/django/myproject_django/wsgi.py
    </VirtualHost>

我尝试通过 manage.py 运行 django,来自 localhost 的 wget 工作正常。 只有当 django 被 apache 运行时才会出现这个问题。

我也尝试了this post中给出的解决方案,但是换行并不能修复错误。

我对这个错误有些怀疑:

  1. apache 是如何运行 django 的?
  2. 重启apache2服务是否也会重启django? (因此,再次阅读 settings.py)
  3. 除了我正在编辑的那个之外,还有其他的 django 设置文件吗?
  4. 如何查看 django 日志?我现在没有控制台,所以看不到实时打印。

非常感谢任何帮助。

【问题讨论】:

  • 如果您在 settings.py 文件中将 DEBUG = False 更改为 True,您将更好地了解从浏览器访问网站时发生的情况。确保在进行此更改后重新启动 apache。将该错误粘贴到您的帖子中,我们可以更好地了解在哪里查找错误。
  • 我会补充一点,您的 VirtualHost 对我来说看起来是正确的,但我不习惯没有看到未列出的 ServerName 指令。我假设如果不存在,它只是使用了 IP。
  • @ja408 Debug 在 settings.py 中已经是 True。问题不在于请求来自浏览器时,实际上它实际上工作正常。问题是来自本地主机或同一网络中的机器的 wget。
  • 实际上,我要问的主要问题之一是在哪里检查来自 django 的错误,现在它作为 apache 的一部分运行。
  • 一旦你在settings.py 中设置了DEBUG = False,来自 Django 的所有详细错误都将写入 apache error.log 文件或在 apache conf 文件中指定一个单独的错误。 ErrorLog /var/log/httpd/localhost-error.log

标签: django apache rest mod-wsgi internal-server-error


【解决方案1】:

我终于自己解决了。

事实证明 wsgi 将来自 localhost 或外部 IP 的请求作为不同的实例组处理。所以我所要做的就是放

WSGIApplicationGroup %{GLOBAL}

/etc/apache2/sites-available/000-default.conf

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2022-12-08
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多