You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令,而这些操作会强制终止正在处理的请求及守护进程。现咨询:

  1. 如何让Apache无需重启或重载即可识别虚拟主机的修改或新增?
  2. 若上述操作不可行,是否存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:18:25