为什么 mod_wsgi 的 apache 超时?

Why apache with mod_wsgi timed out?

我使用 apache 和 mod_wsgi 来部署我的 django 项目。我所做的是:

  1. python manage.py startproject mysite 作为 django 教程指南,
  2. 在apache conf/httpd.conf中添加如下配置:

    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin webmaster@example.com
    
    WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP} python-path=/root/mysite python-home=/usr
    WSGIProcessGroup example.com
    
    WSGIScriptAlias / /root/mysite/mysite/wsgi.py
    
    <Directory /root/mysite/mysite>
    Require all granted
    </Directory>
    

  3. 在地址栏中输入example.com,然后得到超时响应:

    网关超时

    网关没有收到来自上游服务器或应用程序的及时响应。

如果只是一个玩具 django 应用程序,如何处理这个超时?我认为这与性能问题无关,但可能是由某些错误配置引起的。有人能帮忙吗?谢谢!

你不需要:

python-home=/usr

因为您正在使用系统 Python。只有在使用 Python 虚拟环境时才需要。

现在添加:

WSGIApplicationGroup %{GLOBAL}

看看是否有任何改变。如果这是一个全新的 Django 项目,则不应该,但是如果您更改了它并正在导入某些 Python 包,这些包在 Python 子解释器中不起作用,您将需要它。

同时检查 Apache 错误日志,因为它会为您提供更准确的超时原因。


更新 1

如果您自己编译 mod_wsgi 并希望它使用 /usr/local/python3 进行 Python 安装,您需要添加:

WSGIPythonHome /usr/local/python3

就在 wsgi_moduleLoadModule 行之后。如果您还安装了 3.6 版的系统 Python,这一点非常重要。

您还需要检查它是否选择了正确的共享库。按照以下说明使用 ldd

查看正在获取的 Python 共享库以及是否在 /usr/local/python3/lib 下找到。如果它从 /usr/lib 中拾取一个,那将导致问题。