在CentOS上优化Apache Web服务器性能

在 CentOS 上优化 Apache 性能需要从配置调整、资源分配、缓存策略等多方面入手,以下是关键优化方向和具体操作:

一、调整 Apache 核心配置(httpd.conf)

Apache 的性能很大程度上取决于 httpd.conf(主配置)和 mpm.conf(多处理模块)的参数设置,需根据服务器硬件(CPU、内存)调整。

1. 选择合适的 MPM(多处理模块)

Apache 有三种 MPM 模式,需根据服务器类型选择:

 

  • prefork:适合单核 / 低内存服务器,进程独立(内存占用高,稳定性好)
  • worker:适合多核服务器,混合进程 + 线程(内存占用低,并发高)
  • event:worker 的改进版,处理长连接更高效(推荐现代服务器)

 

查看当前 MPM

 

bash
httpd -V | grep -i mpm

 

切换 MPM(以 event 为例)

 

bash
# 编辑配置(CentOS 7 路径)
sudo vi /etc/httpd/conf.modules.d/00-mpm.conf

# 注释其他 MPM,启用 event
LoadModule mpm_event_module modules/mod_mpm_event.so
# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# LoadModule mpm_worker_module modules/mod_mpm_worker.so

2. 优化 MPM 核心参数

根据服务器内存和 CPU 核心数调整(以 event 为例,编辑 /etc/httpd/conf.modules.d/00-mpm.conf):

 

apache
<IfModule mpm_event_module>
    StartServers             4        # 启动时的子进程数
    MinSpareThreads         25        # 最小空闲线程数
    MaxSpareThreads         75        # 最大空闲线程数
    ThreadLimit             64        # 每个子进程的最大线程限制
    ThreadsPerChild         25        # 每个子进程的固定线程数
    MaxRequestWorkers      150        # 最大并发连接数(= 子进程数 × 线程数)
    MaxConnectionsPerChild   0        # 每个子进程处理的最大请求数(0 表示无限制)
</IfModule>

 

参数计算参考

 

  • 假设服务器有 4GB 内存,MaxRequestWorkers 建议不超过 200(每个连接约占用 10-20MB 内存)
  • 若为 prefork 模式,将 MaxRequestWorkers 设为内存(MB)/ 20(如 4GB 内存 → 200)

二、启用压缩与缓存

减少数据传输量和重复请求,提升响应速度。

1. 启用 Gzip 压缩(mod_deflate)

bash
# 确保模块已加载
sudo vi /etc/httpd/conf.modules.d/00-base.conf
LoadModule deflate_module modules/mod_deflate.so

# 添加压缩配置(在 httpd.conf 或单独的 .conf 文件)
sudo vi /etc/httpd/conf.d/compression.conf

 

添加内容:

 

apache
<IfModule mod_deflate.c>
    # 压缩类型(HTML、CSS、JS 等)
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json
    # 压缩级别(1-9,建议 5,平衡性能和压缩率)
    DeflateCompressionLevel 5
    # 不压缩小文件(小于 1KB 可能反而变大)
    SetOutputFilter DEFLATE
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

2. 启用浏览器缓存(mod_expires)

bash
# 加载模块
sudo vi /etc/httpd/conf.modules.d/00-base.conf
LoadModule expires_module modules/mod_expires.so

# 添加缓存配置
sudo vi /etc/httpd/conf.d/cache.conf

 

添加内容:

 

apache
<IfModule mod_expires.c>
    ExpiresActive On
    # 图片缓存 30 天
    ExpiresByType image/jpeg "access plus 30 days"
    ExpiresByType image/png "access plus 30 days"
    ExpiresByType image/gif "access plus 30 days"
    # CSS/JS 缓存 7 天
    ExpiresByType text/css "access plus 7 days"
    ExpiresByType text/javascript "access plus 7 days"
    ExpiresByType application/javascript "access plus 7 days"
    # HTML 不缓存(或短时间缓存)
    ExpiresByType text/html "access plus 10 minutes"
</IfModule>

三、优化连接与请求处理

1. 调整 KeepAlive 参数

长连接(KeepAlive)减少握手开销,但过多会占用资源:

 

apache
# 在 httpd.conf 中修改
KeepAlive On                  # 启用长连接
MaxKeepAliveRequests 100      # 每个长连接最多处理 100 个请求
KeepAliveTimeout 5            # 连接超时时间(秒,建议 2-5)

2. 限制请求速率(防 DoS)

使用 mod_ratelimit 限制单个 IP 的请求频率:

 

bash
# 加载模块
LoadModule ratelimit_module modules/mod_ratelimit.so

# 配置限制(如限制为 100KB/秒)
<Location "/">
    SetOutputFilter RATE_LIMIT
    RateLimitRequestBody 102400  # 100KB
    RateLimitConnection 100
</Location>

四、服务器系统层面优化

1. 调整 Linux 文件描述符限制

Apache 处理大量连接需要足够的文件描述符:

 

bash
# 临时生效
ulimit -n 65535

# 永久生效(编辑 /etc/security/limits.conf)
sudo vi /etc/security/limits.conf
# 添加
* soft nofile 65535
* hard nofile 65535

2. 优化内核网络参数(/etc/sysctl.conf)

bash
sudo vi /etc/sysctl.conf

 

添加以下内容(提升网络并发能力):

 

conf
net.core.somaxconn = 1024        # 最大监听队列长度
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_fin_timeout = 15    # 减少 TIME_WAIT 状态时间
net.ipv4.tcp_tw_reuse = 1        # 复用 TIME_WAIT 连接
net.ipv4.tcp_max_tw_buckets = 5000

 

生效配置:

 

bash
sudo sysctl -p

五、其他实用优化

  1. 禁用不必要的模块
    减少内存占用,编辑 /etc/httpd/conf.modules.d/ 下的文件,注释不需要的模块(如 mod_davmod_userdir 等)。
  2. 启用 FastCGI 或 PHP-FPM(针对 PHP 网站)
    替代传统的 mod_php,减少 Apache 进程阻塞:
    bash
    # 安装 PHP-FPM
    sudo yum install php-fpm
    # 配置 Apache 转发 PHP 请求到 FPM(需启用 mod_proxy_fcgi)
    
  3. 使用缓存工具(如 Varnish 或 Redis)
    对静态资源或动态内容进行缓存,减轻 Apache 压力。
  4. 定期清理日志
    避免日志文件过大占用磁盘 I/O:
    bash
    # 配置 logrotate(Apache 通常已默认配置)
    cat /etc/logrotate.d/httpd
    

六、测试优化效果

  • 查看并发连接netstat -an | grep :80 | wc -l
  • 压力测试工具:使用 ab(Apache Bench)或 wrk 测试性能:
    bash
    # 安装 ab
    sudo yum install httpd-tools
    # 测试 100 并发,共 1000 个请求
    ab -c 100 -n 1000 http://你的域名/
    

优化核心思路:匹配服务器硬件资源(调整 MPM 参数)→ 减少数据传输(压缩)→ 减少重复请求(缓存)→ 提升系统网络能力。需根据实际业务场景(静态 / 动态内容比例、并发量)逐步调整,并通过压力测试验证效果。
阅读剩余
THE END