python - 网关超时在 Apache 上使用 Django 和 mod_wsgi

标签 python django apache postgresql mod-wsgi

我在让 Apache 正确回复时遇到问题。我收到一个浏览器错误:网关超时:网关没有收到来自上游服务器或应用程序的及时响应。

我知道该应用程序正在通过 mod_wsgi 连接到 Django 层,因为我已验证当连接发生时,从 Wagtail CMS 的中间件运行时,查询正在 PostgreSQL 中发生。

系统运行 RHEL 7.1、Apache 2.4.6 和 mod_wsgi 4.4.21,Python 3.4 和 Django 1.8。

这是 Apache 日志中的错误:

[Thu Jan 07 13:25:54.554395 2016] [wsgi:error] [pid 17128] [client 128.91.91.123:50664] Timeout when reading response headers from daemon process 'my_classroom-https': /var/www/html/my_classroom/my_classroom/wsgi.py

这是 wsgi.py:

import os, sys
from socket import gethostname
from django.core.wsgi import get_wsgi_application

sys.path.append(os.sep.join(os.path.abspath(__file__).split(os.sep)[:-2]))

# cpl == Core, Production, Linux..
if(gethostname()[:3]) == 'cpl':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_classroom.settings.prod")
# csl == Core, Staging, Linux.
elif(gethostname()[:3]) == 'csl':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_classroom.settings.stage")
# else use dev settings.
# cdl == Core, Development, Linux. vag == Vagrant.
else:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_classroom.settings.dev")

application = get_wsgi_application()

这是 Apache 配置的相关部分:

LoadModule wsgi_module modules/mod_wsgi.so
LoadModule ssl_module modules/mod_ssl.so

WSGISocketPrefix /var/run/wsgi

NameVirtualHost *:443
Listen 443
<VirtualHost *:443>

  ServerName my-python-dev.school.edu
  ErrorLog /var/www/logs/classroom-apache-errors.log

  SSLENGINE on

  SSLCertificateFile /etc/pki/tls/certs/localhost.crt
  SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLProtocol all -SSLv2

  WSGIApplicationGroup %{GLOBAL}
  WSGIDaemonProcess my_classroom-https python-home=/var/www/virtualenvs/my_classroom request-timeout=600
  WSGIScriptAlias /classroom /var/www/html/my_classroom/my_classroom/wsgi.py process-group=my_classroom-https
  WSGIProcessGroup my_classroom-https
  Alias /classroom/static/ /var/www/html/my_classroom/static/

  LogLevel info
</VirtualHost>

我尝试了一些方法,包括将 WSGIDaemonProcess 指令的 request-timeout 参数增加到 600 秒而不是 60 秒,但它似乎仍然在 60 秒左右超时。

任何想法或帮助将不胜感激。谢谢。

最佳答案

我得到了这个工作。问题是无法连接到服务器的辅助数据库定义(不是 default)。不幸的是,日志中的任何地方都没有这方面的迹象。这是一个很难调试的错误。

以下是我下次看到此错误时会采取的一些步骤:

  • 深呼吸,放松!
  • 确认数据库中是否针对请求发生了任何事件。
  • 确保您可以连接到 telnet 所需的所有服务(telnet mypostgresserver.domain.com 5432telnet ldap.myprivate.network 636),并且它们“没有挂。
  • 修改设置文件,排除任何可能的内容(中间件、可选应用程序、ModelBackend 以外的后端等)
  • 如果做不到这一点,请开始注释掉设置文件的各个部分,看看您是否可以获得不那么隐晦的响应。

关于python - 网关超时在 Apache 上使用 Django 和 mod_wsgi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751452/

相关文章:

python - 配置 Kivy > y 轴的反转输入

python - 在 PyPI 托管存储库上搜索、注册和安装的异常(exception)情况

python - 将 matplotlib.pylab 的 imshow 与 python ide 一起使用?

python - 使用 PIL.Image._getexif() 访问 exif 信息时遇到问题

python - 跨 Django 数据库移动大型数据集

python - 将动态生成的模型添加到 Django 项目中的 models.py

.net - 第一次加载页面时出现 "this content cannot be viewed in a frame"错误

perl - 可以在不更新配置的情况下动态更改 Perl 的 Log::Log4perl 的日志级别吗?

php - 200k 页面网站的网站搜索

python - 如何设置和拆卸用于单元测试的临时 Django 数据库?