apache虚拟主机资源争抢本质是多站点共享cpu、内存等有限资源,优化关键在于分层隔离、按需限制、错峰调度:采用php-fpm+event mpm替代mod_php,为各站配置独立fpm池与php_admin_value资源限制,启用keepalive但严控参数,分离日志与静态资源路径,并协同内核调优文件描述符及tcp参数。

Apache 虚拟主机环境下的资源争抢,本质是多个站点共享同一台服务器的 CPU、内存、文件描述符、带宽和 PHP 进程等有限资源,当某一站点突发高流量、慢脚本或爬虫扫描时,容易拖垮其他站点。优化关键不是“平均分配”,而是分层隔离、按需限制、错峰调度。
隔离 PHP 执行环境,防止单站耗尽进程与内存
避免使用老旧的 mod_php(prefork + mod_php 组合),它会让每个 Apache 子进程都加载完整 PHP 解释器,极易因一个站点的内存泄漏或死循环导致整机响应迟缓。
- 改用 PHP-FPM + event MPM:Apache 仅负责网络连接与路由,PHP 由独立的 FPM 池管理,支持 per-site 配置
- 在虚拟主机配置中绑定专属 FPM socket,并限制资源:
<virtualhost><br> ServerName site-a.example.com<br> ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php8.2-fpm-sitea.sock|fcgi://localhost/var/www/site-a/<br> php_admin_value memory_limit 192M<br> php_admin_value max_execution_time 45<br> php_admin_value upload_max_filesize 8M<br></virtualhost>
- 为每个站点配置独立的 FPM pool(如
/etc/php/8.2/fpm/pool.d/site-a.conf),设置pm.max_children、pm.start_servers等参数,避免跨站抢占
限制连接与并发,防止雪崩式请求堆积
不加约束的 KeepAlive 或爬虫高频请求会快速占满 MaxRequestWorkers,导致新请求排队甚至超时。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 全局启用 KeepAlive,但严格控制参数(适用于大多数业务):
KeepAlive On<br>KeepAliveTimeout 5<br>MaxKeepAliveRequests 100
- 对已知高负载路径(如 API 接口、上传入口)单独限流,例如用
mod_ratelimit控制每秒请求数:<location><br> SetOutputFilter RATE_LIMIT<br> SetEnv rate-limit 100000 # 100KB/s<br></location>
- 结合
mod_evasive防御简单爬虫或暴力请求:限制单 IP 每秒请求数、并发连接数,自动临时封禁异常源
分离日志、缓存与静态资源路径
所有虚拟主机共用同一日志目录或缓存区时,磁盘 I/O 竞争明显,尤其在写入密集型场景(如访问日志滚动、OPcache 共享内存争用)。
- 为每个站点配置独立日志路径:
ErrorLog /var/log/apache2/site-a-error.log<br>CustomLog /var/log/apache2/site-a-access.log combined
- 禁用全局 OPcache 共享(
opcache.use_cwd=1),或为不同站点使用不同 FPM pool + 不同opcache.interned_strings_buffer值,降低哈希冲突 - 静态资源(图片、字体、CSS/JS)统一走 CDN,或通过
mod_expires设置长缓存,减少 Apache 实时处理压力
内核与系统级协同调优
Apache 层的限制若缺乏底层支撑,容易被绕过或失效。
- 提升文件描述符上限:在
/etc/security/limits.conf中设置* soft nofile 65535<br>* hard nofile 65535
- 优化 TCP 参数(
/etc/sysctl.conf):net.ipv4.tcp_fin_timeout = 30<br>net.ipv4.tcp_tw_reuse = 1<br>net.core.somaxconn = 65535<br>net.ipv4.ip_local_port_range = 10000 65000
- Apache 启动用户(如
www-data)需在 systemd service 文件中显式声明 LimitNOFILE,否则 limits.conf 可能不生效










