Apache服务器性能优化:基本原则与实战案例详解

阿木 发布于 16 小时前 3 次阅读


始于默认安装,历经转变,成为能承载百万级访问量之Web服务器,其中仅隔着一份经精心调优所形成的配置文件。期间变化,仅因这一份配置而言。

不少运维工作者惯于采用yum install之后的默认参数,然而却并不清楚这样做会致使服务器起码丧失30%的吞吐能力。

内核参数与网络栈优化

操作系统内核直接决定了服务器处理并发连接的能力。

对/etc/sysctl.conf文件内的TCP参数予以调整,能够把服务器的并发连接数提高好多倍。

举个例子来说,把net.ipv4.tcp_tw_reuse的数值设置成为1,这就意味着,允许那种处于TIME_WAIT状态的socket,再次被运用到全新的TCP连接之中。

文件描述符限制是另一个常被忽略的瓶颈。

进行如下操作,在 /etc/security/limits.conf 里添加 nofile 限制,使得单个进程能够打开 65535 个文件。

协同更改 /etc/httpd/conf/httpd.conf 里头的 ThreadsPerChild 指令,以使每个子进程能够应对更多的并发请求。

启用MPM工作模式

Apache给出了三种多处理模块,存在prefork,还有worker,另外有event。

预置安装常常运用prefork样式,每一回请求占据一项进程,内存耗费极为庞大。

在2.4及以上版本中,event模式是最佳选择。

配置event MPM需要精确计算参数。

把StartServers设定成3,将MinSpareThreads定为75,把MaxSpareThreads设置成250,把ThreadsPerChild设为25,把MaxRequestWorkers设定为400。

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so

此些数值,需按照服务器实际内存大小予以调整,以此使每个请求分配将近2MB内存得以保障。

缓存机制深度配置

mod_cache模块可以将动态内容缓存为静态文件。

进行配置,使CacheEnable disk /生效,把所有URL都启用磁盘缓存。

把CacheDefaultExpire设定成3600秒,使得缓存的内容留存一小时。

结合CacheMaxFileSize这一条件,以及CacheMinFileSize这一条件,对缓存文件大小予以限制。

利用mod_mem_cache加速


 ServerAdmin admin@example.com
 ServerName example.com
 documentRoot /var/www/example.com
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

对于频繁访问的小文件,内存缓存比磁盘缓存快三个数量级。

设置MCacheSize为512MB,设定MCacheMaxObjectCount为10000,选定MCacheMinObjectSize为1,以使小于1MB的文件留存于内存之中。

配合mod_cache一起使用,形成两级缓存架构。

压缩传输与带宽优化

mod_deflate模块能减少70%的传输数据量。

将SetOutputFilter进行配置,使其为DEFLATE,以此对全部输出内容予以压缩。

借助AddOutputFilterByType指令,仅对text/html、text/css、text/javascript等文本类型的文件实施压缩处理,而图片以及PDF文件予以跳过压缩处理。

设置压缩级别与阈值

Deflate压缩级别被设置成6,这是性能跟压缩比的平衡点。

将DeflateMemLevel维持在默认状态,且把DeflateWindowSize也设置为默认值就行。

设置压缩缓冲区为16KB,通过DeflateBufferSize来进行此项设置,目的在于防止大文件压缩时占用过多内存。


 ExpiresActive On
 ExpiresByType image/jpg "access plus 1 month"
 ExpiresByType image/png "access plus 1 month"
 ExpiresByType image/gif "access plus 1 month"
 ExpiresByType text/css "access plus 1 month"
 ExpiresByType application/javascript "access plus 1 month"


 AddOutputFilterByType DEFLATE text/plain
 AddOutputFilterByType DEFLATE text/css
 AddOutputFilterByType DEFLATE application/javascript
 AddOutputFilterByType DEFLATE application/x-javascript
 AddOutputFilterByType DEFLATE application/xml
 AddOutputFilterByType DEFLATE application/xml+rss

静态文件分离处理

把图片,CSS,JavaScript等静态文件交予mod_expires去处理。

把ExpiresActive On进行配置,针对不同类型的文件,去设置不一样的过期时间。

将图片文件设定为1个月后过期,把CSS文件设置成1周后过期,对JS文件也设置为1周后过期,以此来引导浏览器缓存这些资源。

配置ContentDigest

开启FileETag指令,让服务器为静态文件生成唯一标识。

设定FileETag MTime Size,借着修改时间外加文件大小的组合来缔造ETag。

这般在文件内容保持不变的情形下,浏览器能够直接取用缓存文件,进而削减304状态码的请求次数。

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
CustomLog ${APACHE_LOG_DIR}/access.log combined

访问控制与安全加固

Apache借助mod_remoteip模块,能够获取到真实存在的客户端IP地址。

将RemoteIPHeader X-Forwarded-For进行配置,于代理环境之中,对数访问者原本的IP予以记录。

伴随着mod_requeue模块,对单个IP的并发连接数予以限制,以此来防止恶意爬虫将服务器资源消耗殆尽,导致资源耗尽。

防御慢连接攻击

通过mod_reqtimeout模块设置请求超时。

做出这样的设置,将RequestReadTimeout的header配置为20 - 40,同时把MinRate设定为500,对于body部分也如法炮制,配置成20 - 40且MinRate为500,以此来达成让慢速攻击不能够长时间地占用连接的目的。

采用mod_evasive模块,对短时间之内发起大量请求的IP予以检测,随后自动把这个IP加入黑名单。

你在优化Apache性能时遇到过最难解决的问题是什么?


 SecRuleEngine On
 SecRuleRequestHeader Name -C
 SecRuleRequestBody Name -C
 SecRuleURIPattern /.* -C

来到评论区域,把你的实战经历奉献出来分享,点下赞进行转发,使得更多从事运维工作的同行伙伴可以看到这些具备实用性质的技巧。