apache 优化 cgi 性能需改用 fastcgi 常驻进程、限制并发与生命周期、复用数据库连接、分离静态资源。配置 mod_fcgid,设 maxprocesses 和 maxrequestsperprocess,移除 cgi 中重复初始化,静态文件禁用 execcgi 并独立部署。

Apache 默认以传统 CGI 模式运行脚本时,每个请求都会 fork 一个新进程、加载解释器、执行程序、再退出——这在高并发下极易拖垮服务器。优化核心是减少进程创建开销、避免重复初始化,并控制资源滥用。
改用 FastCGI 替代传统 CGI
FastCGI 让 CGI 程序常驻内存,由 Apache 复用进程处理多个请求,彻底避开反复 fork 和初始化的代价。
- 安装并启用
mod_fcgid(推荐)或mod_fastcgi(需额外编译) - 为脚本目录配置 FastCGI 处理器,例如:
<directory><br> Options +ExecCGI<br> AddHandler fcgid-script .py .pl<br> FCGIWrapper /usr/lib/cgi-bin/python-fcgi .py<br></directory>
- 确保 CGI 脚本头部仍保留
#!/usr/bin/env python3,但不再需要print("Content-Type:...")前置输出——FastCGI 协议自行管理头信息
限制 CGI 进程数量与生命周期
即使启用 FastCGI,不加约束仍可能耗尽内存或触发系统限制。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 通过
MaxProcesses控制最大并发实例数(如设为 10~20,视内存而定) - 用
MaxRequestsPerProcess限制单个进程处理请求数(如 500),防止内存泄漏累积 - 设置
IPCConnectTimeout和IPCCommTimeout(默认 3 秒),及时回收无响应进程
剥离数据库连接等重操作
CGI 脚本每次启动都重新连数据库,高峰时易触发连接池满或超时。
- 将数据库连接移至 FastCGI 启动阶段,在进程生命周期内复用连接对象
- 对读多写少的数据,加一层内存缓存(如 Redis 或本地字典),避免每次请求查库
- 若必须新建连接,使用连接池(如 Python 的
DBUtils.PooledDB),而非sqlite3.connect()直连
静态资源绝不走 CGI
图片、CSS、JS 等文件被误配到 CGI 目录,会导致 Apache 试图执行它们,既失败又浪费资源。
- 确认
<directory></directory>中仅对真正需要执行的脚本后缀启用ExecCGI - 把静态资源统一放在
/var/www/static/等非 CGI 目录,用Alias映射,禁用任何执行权限 - 在 CGI 脚本中输出静态资源路径时,用绝对 URL(如
/static/logo.png),而非相对路径或 CGI 路径










