源码安装apache需手动创建apache2.service文件实现优雅停机:设type=forking,execstart调用apachectl start,execstop设为apachectl graceful-stop并配timeoutstopsec=60,显式声明path与ld_library_path环境变量,确保信号机制对齐。

源码安装的 Apache 默认不带 systemd 服务单元文件,要实现优雅停机,关键不是“加个 service 文件就行”,而是让 systemctl 能正确理解 Apache 的 graceful-stop 行为,并与 apachectl 的信号机制对齐。
手动创建并配置 apache2.service 单元文件
Apache 源码安装后(如装在 /usr/local/apache2),需自行提供 systemd 单元文件,路径为 /etc/systemd/system/apache2.service。内容必须明确指定 graceful-stop 方式:
- 使用 Type=forking,因 Apache 主进程会 fork 子进程并退出前台
-
ExecStart 调用
/usr/local/apache2/bin/apachectl start,而非直接运行 httpd -
ExecReload 设为
/usr/local/apache2/bin/apachectl graceful,实现配置热重载 -
ExecStop 必须设为
/usr/local/apache2/bin/apachectl graceful-stop,这是优雅停止的核心——它发送 WINCH 信号,让子进程处理完当前请求再退出,父进程等待全部完成后再终止 - 添加 TimeoutStopSec=60,避免 systemd 在子进程尚未结束时强行 kill;若后端有长连接,可适当调高(如 120)
确保 apachectl 可被 systemd 正确调用
源码安装的 apachectl 默认依赖环境变量(如 PATH、LD_LIBRARY_PATH),systemd 执行时环境精简,易导致启动失败或 graceful-stop 不生效:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 在 service 文件中显式设置 Environment,例如:
Environment="PATH=/usr/local/apache2/bin:/usr/local/bin:/usr/bin:/bin"Environment="LD_LIBRARY_PATH=/usr/local/apache2/lib" - 确认 apachectl 文件有执行权限且首行 shebang 正确(如
#!/bin/sh) - 运行
sudo systemctl daemon-reload刷新配置,再用sudo systemctl status apache2检查是否识别到 “graceful-stop” 行为(状态应显示 “Stopping…” 而非立即变为 “inactive”)
验证优雅停机是否真正生效
不能只看 systemctl status 显示 “inactive”,要确认请求未被中断:
- 启动 Apache 后,用
ab -n 1000 -c 50 http://localhost/或持续 curl 发起长连接(如含 keep-alive 的循环请求) - 执行
sudo systemctl stop apache2,观察ps aux | grep httpd:主进程应仍在,子进程数逐步归零 - 检查错误日志
/usr/local/apache2/logs/error_log,末尾应出现类似:[Mon Jul 21 06:15:22.1234] [notice] Graceful shutdown initiated...[Mon Jul 21 06:15:23.5678] [notice] Apache stopped. - 若日志中出现
caught SIGTERM或无 graceful 相关提示,说明 ExecStop 未触发 apachectl graceful-stop,需回查 service 文件路径、权限及命令拼写
补充:配合负载均衡器做滚动下线
若 Apache 前有反向代理(如另一台 Nginx 或 HAProxy),仅停本机 Apache 不够;真正优雅需分两步:
- 先让上游代理将该节点标记为 draining(如修改 upstream 状态、返回 503),停止派发新请求
- 再执行
sudo systemctl stop apache2,此时只剩存量连接,graceful-stop 自然耗尽 - 若使用 mod_proxy_balancer,还可配合
status=-D动态设 draining,无需 reload 配置










