Ubuntu 18部署Django+mod_wsgi登录时遇Apache错误求助
问题现象
Django应用在Ubuntu 16实例通过mod_wsgi运行正常,但在Ubuntu 18实例登录时出现以下错误日志:
[Tue Jan 10 22:12:00.930300 2023] [wsgi:error] [pid 11481:tid 140103479047936] [client 10.61.23.144:61958] Truncated or oversized response headers received from daemon process 'server': /home/.../wsgi.py, referer: https://application/login/?next=/application/ [Tue Jan 10 22:12:00.931998 2023] [core:notice] [pid 6523:tid 140103626501056] AH00052: child pid 11479 exit signal Segmentation fault (11)
已尝试在apache2.conf中添加WSGIApplicationGroup %{GLOBAL},也参考过相关社区建议,问题仍未解决,调至info日志级别后无额外有效信息。
解决思路
排查mod_wsgi与Python版本兼容性:Ubuntu 18默认的mod_wsgi版本可能和Ubuntu 16不同,且可能绑定了系统默认Python。如果你的Django应用使用虚拟环境中的Python,需确认mod_wsgi是否正确编译适配该版本。可重新编译mod_wsgi并指定虚拟环境Python路径:
sudo apt-get install apache2-dev python3-dev pip install mod_wsgi mod_wsgi-express module-config将输出的配置内容替换Apache的
mods-available/wsgi.load文件原有内容,重启Apache。调整响应头大小限制:Ubuntu 18的Apache可能收紧了响应头默认限制,导致登录时生成的Cookie或其他响应头超出阈值。在Apache配置中添加以下参数:
LimitRequestFieldSize 16384 LimitRequestLine 16384同时在
WSGIDaemonProcess配置中增加响应头缓冲区参数:WSGIDaemonProcess server response-header-buffer-size=65536调整后重启Apache测试。
排查第三方库兼容性:Ubuntu 18的系统库(如OpenSSL、libc等)版本较Ubuntu 16升级,部分Django依赖库可能存在兼容性问题引发段错误。可尝试:
- 升级Django及所有依赖库到适配Python 3.6+(Ubuntu 18默认Python3.6)的最新稳定版本;
- 逐一禁用登录相关的第三方中间件或插件,定位是否为某一组件触发的问题。
启用core dump定位段错误:开启core dump获取进程崩溃的详细信息,精准定位段错误根源:
ulimit -c unlimited sudo sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%t触发错误后,使用gdb分析core文件:
gdb /usr/sbin/apache2 /tmp/core.apache2.11479.xxxx (gdb) bt通过回溯信息定位到具体出错的代码或库。
内容的提问来源于stack exchange,提问作者timsterc

