Django 应用程序在尝试通过 Apache 连接到数据库时挂起
Posted
技术标签:
【中文标题】Django 应用程序在尝试通过 Apache 连接到数据库时挂起【英文标题】:Django app hangs when attempting to connect to database via Apache 【发布时间】:2015-08-05 19:54:10 【问题描述】:我在解决此问题时遇到了困难。我有一个在 Ubuntu 14.04 服务器上运行的 Django 应用程序(使用 Apache 2.4 和用于 Python 3.4 的 mod_wsgi)。它通过 pymssql 连接到 SQL Server。
在开发中,该应用运行良好。我查询数据库,数据库返回了预期的结果。
但是,在生产环境中(在 Apache 用户下),脚本会在进行数据库查询时挂起。我的浏览器(Chrome 或 Firefox)显示一个旋转的***,只要浏览器窗口打开,它就会继续旋转。
我的apache2.conf
文件中有以下内容:
ServerName localhost
# WSGIDaemonProcess application
WSGIPythonPath /home/production_code/python3env/lib/python3.4/site-packages:/home/production_code/school
# WSGIProcessGroup application
WSGIScriptAlias / /home/production_code/school/school/wsgi.py
# Python virtualenv home
WSGIPythonHome /home/production_code/python3env
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
我的sites-enabled/000-default.conf
文件中有以下内容:
<VirtualHost *:80>
ServerAdmin *****@school.edu
ServerName localhost
DocumentRoot /var/www/html
ErrorLog $APACHE_LOG_DIR/error.log
CustomLog $APACHE_LOG_DIR/access.log combined
Alias /static/ /home/production_code/school/static/
<Directory /home/production_code/school/>
Require all granted
</Directory>
<Directory /home/production_code/school/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
<Directory /home/production_code/school/static>
Require all granted
</Directory>
</VirtualHost>
有谁知道可能是什么原因造成的,或者我可以如何解决这个问题? Apache 错误日志和访问日志在这种情况下并不是特别有用,因为对请求的响应永远不会呈现。同样,Django 的调试在这里也没有什么用处。
【问题讨论】:
应用程序对数据库的访问通常是通过另一个端口,而不是通过Apache。生产环境中SQL Server地址是否配置正确? 感谢您的回复,aldux。我正在使用 freetds 通过端口 1433 访问 SQL Server。此设置对于我的开发和生产环境是相同的,但我会尽快在这里再次检查。 【参考方案1】:代替:
# WSGIDaemonProcess application
WSGIPythonPath /home/production_code/python3env/lib/python3.4/site-packages:/home/production_code/school
# WSGIProcessGroup application
使用:
WSGIDaemonProcess application python-path=/home/production_code/python3env/lib/python3.4/site-packages:/home/production_code/school
WSGIProcessGroup application
WSGIApplicationGroup %GLOBAL
其中一个关键部分是WSGIApplicationGroup
指令,它被设置为%GLOBAL
。
这是为了绕过错误的 Python 第三方扩展模块,这些模块在子解释器中不起作用,并且可能因死锁或崩溃而失败。
见:
https://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API还建议您返回使用守护程序模式。使用嵌入式模式通常不是一个好主意。
http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html【讨论】:
太棒了!谢谢你,格雷厄姆!那解决了它。这些链接也很有帮助。以上是关于Django 应用程序在尝试通过 Apache 连接到数据库时挂起的主要内容,如果未能解决你的问题,请参考以下文章
可以通过 Java 中的 Apache TelnetClient 连接到 AS400 吗?
Django + Plesk + Apache - 在某些 url 上禁止 403 但 404 的显示应用程序正在运行...?
Apache 不在 443 (aws) 上为 Django 提供服务
在 AIX7.1 上通过 Apache 使用 PHP 连接到 DB2
尝试 OAuth 到 Twitter 时,无服务器 Django 应用程序(通过 Zappa 的 AWS Lambda)超时