Apache+mod_wsgi无需重启识别虚拟主机变更及优雅重载方案咨询
环境信息
- Python 版本:3.9.18
- Apache 版本:2.4.57
- mod_wsgi 版本:4.7.1
虚拟主机配置
#Students Webservice Config Listen 9002 <VirtualHost *:9002> ServerName test.myapp.com ErrorLog /var/log/webservice_error.log WSGIPassAuthorization On WSGIDaemonProcess Tes9002 python-path=/home/uoadmin/releases/1.0.0/students:/home/admin/releases/1.0.0/shared display-name=%{GROUP} WSGIProcessGroup Tes9002 WSGIApplicationGroup %{GLOBAL} WSGIScriptAlias / /home/admin/releases/1.0.0/students/conf/wsgi.py <Directory /home/admin/releases/1.0.0/students/conf> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost> <VirtualHost *:9002> ServerName dev.myapp.com ErrorLog /var/log/webservice_error.log WSGIPassAuthorization On WSGIDaemonProcess Dev9002 python-path=/home/uoadmin/releases/1.1.0/students:/home/admin/releases/1.1.0/shared display-name=%{GROUP} WSGIProcessGroup Dev9002 WSGIApplicationGroup %{GLOBAL} WSGIScriptAlias / /home/admin/releases/1.1.0/students/conf/wsgi.py <Directory /home/admin/releases/1.1.0/students/conf> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
问题描述
修改Django源码时,可通过touch对应版本的wsgi.py文件刷新WSGI守护进程,但新增或修改虚拟主机配置后,Apache无法自动识别变更,必须执行apachectl graceful、apachectl restart或systemctl reload httpd命令,而这些操作会强制终止正在处理的请求及守护进程。现咨询:
- 如何让Apache无需重启或重载即可识别虚拟主机的修改或新增?
- 若上述操作不可行,是否存在Apache优雅重载的方式,在不终止正在处理的请求及mod_wsgi守护进程的情况下完成配置更新?
解决方案
问题1:无需重启/重载识别虚拟主机变更
Apache的核心配置(包括虚拟主机规则)是在启动或重载阶段加载的,没有原生支持无需重启/重载即可动态更新虚拟主机配置的机制。虚拟主机属于Apache的核心配置层,必须通过重载或重启操作让新配置生效。
问题2:优雅重载不终止请求与守护进程
正确使用apachectl graceful
apachectl graceful(部分系统可用systemctl reload httpd)本身就是Apache官方提供的优雅重载方式,它的执行逻辑是:
- 父进程启动新的子进程加载最新配置
- 保留旧子进程继续处理正在进行的请求,直到请求处理完毕后自动退出
- 不会强制中断正在处理的请求
但默认情况下,优雅重载会重启mod_wsgi的守护进程,要避免这个问题,需要调整mod_wsgi的配置:
配置mod_wsgi守护进程持久化
在WSGIDaemonProcess指令中添加以下配置优化:
- 保留已设置的
display-name=%{GROUP},便于进程识别 - 添加
inactivity-timeout=0,禁用守护进程的闲置超时销毁(确保进程长期运行) - 确保
WSGIRestrictEmbedded On(若未设置),避免嵌入式WSGI进程干扰
配置调整后,执行apachectl graceful时:
- 如果虚拟主机配置仅修改了非守护进程相关的规则(如ServerName、日志路径),mod_wsgi守护进程会继续运行,不会被强制重启
- 如果修改了
WSGIDaemonProcess的核心参数(如python-path),会启动新的守护进程,旧进程处理完当前请求后自动退出,不会中断业务
验证优雅重载效果
执行重载后,可通过以下方式确认效果:
- 查看Apache进程:旧的子进程会持续存在直到处理完所有请求
- 查看mod_wsgi守护进程PID:配置未变更时,PID不会改变;配置变更时,新进程启动,旧进程在请求处理完成后退出
额外注意事项
- 新增虚拟主机必须执行优雅重载,但该操作不会中断正在处理的请求
- 代码更新仍可通过
touch wsgi.py触发守护进程重启,无需重载Apache
内容的提问来源于stack exchange,提问作者RajKumar
相关产品推荐
相关产品推荐

