【发布时间】:2020-04-02 17:05:49
【问题描述】:
我有一个使用 mod_wsgi 安装了 apache 和 django 的生产服务器。
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中给出的解决方案,但是换行并不能修复错误。
我对这个错误有些怀疑:
- apache 是如何运行 django 的?
- 重启apache2服务是否也会重启django? (因此,再次阅读 settings.py)
- 除了我正在编辑的那个之外,还有其他的 django 设置文件吗?
- 如何查看 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