远程Django服务器WSGI守护进程不规则超时问题求助
在虚拟机上通过Apache部署Django服务器后,遇到不规则的随机超时问题:服务器偶尔崩溃,日志仅输出:
Timeout when reading response headers from daemon process 'XXX-0.0.86': /mypath/myproject/wsgi.py
已确认是服务器端/配置问题:完全相同的快速GET请求多次正常执行后,会随机触发超时。尝试过Stack Overflow类似问题的多数解决方案(添加%{GLOBAL}、修改httpd.conf超时设置、对比配置、重启服务),均未解决。但本地或虚拟机上用python manage.py runserver运行项目时无任何错误。
附上Apache Django守护进程的配置文件:
Listen 8075 <Virtualhost *:8075> ErrorLog /var/log/httpd/XXX.log LoadModule wsgi_module /var/www/cgi-bin/python36_virtenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so Alias /static /var/www/cgi-bin/XXX-0.0.86/XXX/static <Directory /var/www/cgi-bin/XXX-0.0.86/XXX/static> Require all granted </Directory> <Directory /var/www/cgi-bin/XXX-0.0.86/XXX/myproject> <Files wsgi.py> Require all granted </Files> </Directory> WSGIDaemonProcess XXX-0.0.86 python-path=/var/www/cgi-bin/XXX-0.0.86/XXX:/var/www/cgi-bin/python36_virtenv/lib/python3.6/site-packages/ WSGIProcessGroup XXX-0.0.86 WSGIScriptAlias / /var/www/cgi-bin/XXX-0.0.86/XXX/myproject/wsgi.py WSGIPassAuthorization On WSGIApplicationGroup %{GLOBAL} Alias /stdouts /home/redacted/stdoutbuffer/ <Directory /home/redacted/stdoutbuffer/> Require all granted Options +Indexes </Directory> Alias /artifacts /mnt/results/ <Directory /mnt/results/> Require all granted Options +Indexes </Directory> </Virtualhost>
调整WSGI守护进程超时参数:在
WSGIDaemonProcess指令中添加request-timeout和connect-timeout参数,比如:WSGIDaemonProcess XXX-0.0.86 python-path=... request-timeout=300 connect-timeout=10默认超时可能过短,若请求中存在偶尔的慢查询或IO操作,容易触发超时。
排查Django应用内存泄漏:本地开发服务器负载低,内存泄漏问题不易暴露,但Apache多进程环境下会被放大。可以用
ps aux持续监控WSGI守护进程的内存占用变化,或在Django中集成tracemalloc工具定位内存泄漏点。增加WSGI守护进程的并发能力:若请求并发量较高,默认的进程/线程数可能不足以处理,导致请求排队超时。在
WSGIDaemonProcess中添加进程和线程配置,比如:WSGIDaemonProcess XXX-0.0.86 python-path=... processes=4 threads=10具体数值根据服务器CPU和内存配置调整。
检查文件系统IO瓶颈:配置中挂载了
/mnt/results/和/home/redacted/stdoutbuffer/目录,若为网络存储(如NFS),可能出现偶发IO延迟,导致Django处理请求时卡住。可以测试本地与挂载目录的文件读写速度,排查存储稳定性。启用mod_wsgi详细日志:在虚拟主机配置中添加
WSGILogLevel info(或debug),获取更详细的守护进程运行日志,便于定位崩溃前的异常行为。验证虚拟环境依赖一致性:虽然本地运行正常,但仍需确认Apache使用的虚拟环境与本地开发环境的依赖版本完全一致(执行
pip freeze对比输出),重点检查mod_wsgi与Django的版本兼容性。调整Apache全局连接参数:检查
httpd.conf中的MaxRequestWorkers、KeepAliveTimeout、Timeout等参数,确保Apache的全局连接处理能力匹配实际请求量,避免因连接阻塞引发超时。
内容的提问来源于stack exchange,提问作者Destaq

