目 录CONTENT

文章目录

Apache优化

简中仙
2023-05-25 / 0 评论 / 0 点赞 / 88 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-07,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

1、添加保持会话

客户端在访问过程中,会发送链接请求(三次握手)和断开请求(四次挥手),而且是每个页面访问会发送一次。大量的链接请求占用网络带宽和服务器的CPU运算。

# vim /usr/local/apache/conf/httpd.conf
keepalive                       on
keepalivetimeout                60
maxkeepaliverequests            300
参数说明
keepalive ON/OFF是否打开保持连接功能。根据网站的并发请求量决定是否打开,高并发时打开,并发量不高时可选择关闭。
keepalive timeout一次TCP连接多次HTTP请求之间的最大间隔时间,两次HTTP请求超过此时间连接将会断开。默认5秒
MaxKeepAliveRequests一次TCP连接能够传输的最大HTTP请求数量。默认100

2、网页压缩

对web服务器发送的数据使用gzip格式进行压缩后,传输给浏览器,能够加快网页加载的速度,节省带宽,有利于搜索引擎抓取。但是会占用一定的CPU运算量。

Apache支持的压缩模块:

mod_gzip:类似gzip算法,压缩速度慢,压缩比例高,CPU占用略高,适用于访问量比较低的服务器。

mod_deflate:类似gzip算法,压缩速度快,压缩比例低,CPU占用低,适用于访问量比较高的服务器。

安装时添加 --enable-deflate 启用压缩算法

mod_deflate是压缩模块,就是对要传输到客户端的代码进行gzip压缩;mod_headers模块的作用是告诉浏览器页面使用了gzip压缩,如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载,而无法正常显示。

# vim /usr/local/apache/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so                 # 取消注释
LoadModule headers_module modules/mod_headers.so                 # 取消注释
<IfModule mod_deflate.c>
 DeflateCompressionLevel 6
 SetOutputFilter DEFLATE
 #AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php              
 #AddOutputFilterByType DEFLATE image/*                
 AddOutputFilterByType DEFLATE text/*                 # 设置对文件是文本的内容进行压缩
 AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript                  # 对 javascript 文件进行压缩
 AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp                  # 对 php 类型的文件进行压缩
 SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary                  # 设置不对后缀gif,jpg,jpeg,png 的图片文件进行压缩。注:?:表示不会捕获 ( )里内容了
 SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary                 # 设置不对 exe,tgz,gz 等的文件进行压缩
 SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary                 # 设置不对 pdf,avi,mp3 等的文件进行压缩
</IfModule>
参数说明
AddOutputFilterByType对什么格式的内容启用压缩
DeflateCompressionLevel压缩级别为9,范围是1-9,数字大压缩率高
SetOutputFilter启用deflate压缩方式

3、优化启用网站缓存expires

客户端能够对网页内容进行缓存的集中情况:

  • 服务器允许客户端进行页面缓存
  • 服务器站点是静态页面
  • 动态网站只能缓存结构,不能缓存数据库中的数据。
  • 图片,视频,flash等可以缓存,但不能缓存人机对话的内容(游戏类)。

缓存的作用:

  • 能够加快客户端访问重复页面内容的速度,如刷新页面或返回主页,后退等操作。
  • 节省服务器的数据处理量和数据传输量。

需要--enable-expires模块支持

# vim /usr/local/apache/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so                 # 去除“#”号
<IfModule mod_expires.c>
ExpiresActive On                
ExpiresByType text/css "now plus 1 month"              
ExpiresByType application/x-javascript "now plus 5 day"              
ExpiresByType image/jpeg "access plus 1 month"                
ExpiresByType image/gif "access plus 1 month"              
ExpiresByType image/bmp "access plus 1 month"                
ExpiresByType image/x-icon "access plus 1 month"             
ExpiresByType image/png "access plus 1 minute"               
ExpiresByType application/x-shockwave-flash "access plus 1 month"          
ExpiresDefault "now plus 0 minute"                
</IfModule>

4、隐藏apache的版本号

作用:防止黑客通过查询版本号,检测到响应的漏洞进行攻击。

# vim /usr/local/apache/conf/httpd.conf
Include conf/extra/httpd-default.conf                 # 去除“#”号
# vim /usr/local/apache/conf/extra/httpd-default.conf
ServerTokens Prod									  # 显示最少的信息,默认是Full显示完整信息
ServerSignature Off									  # 生成页面的页脚
# vim /usr/local/apache/conf/httpd.conf
ServerTokens Prod
ServerSignature Off
# systemctl restart httpd

5、防盗链

作用:本地网站上传的图片被其他网站盗用,在大量用户访问的情况下,本地网站的CPU运算量会大幅度提升。防盗链是为了禁止其他网站链接图片。

# vim /usr/local/apache/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so                 # 去除“#”号
# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost>
......                 # 添加
 RewriteEngine On                 # 启用 rewrite
 RewriteCond %{HTTP_REFERER} !^$              
 RewriteCond %{HTTP_REFERER} !^http://example.com/.*$ [NC]                
 RewriteCond %{HTTP_REFERER} !^http://example.com$ [NC]                
 RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*$ [NC]                
 RewriteCond %{HTTP_REFERER} !^http://www.example.com$ [NC]              
 RewriteRule . *\.(gif|jpg|png|swf)$http://www.example.com/about/nolink.png[R,NC,L]                 
 </VirtualHost>
# systemctl restart httpd

6、禁止网站目录遍历

由于开启目录浏览会让整个目录下的内容全部都暴露到外面,因此必须要禁止目录浏览功能。当然一些目录开放给客户做下载的,可以忽略此项优化。

# vim /usr/local/apache/conf/httpd.conf
Options FollowSymLinks                 # 原Options Indexes FollowSymLinks去除Indexes
# systemctl restart httpd

7、日志轮替切割(按天轮询)

apache 服务器,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计。

Apache自带rotatelogs分割工具实现

# vim /usr/local/apache/conf/httpd.conf
#ErrorLog "logs/error_log"                 # 注释
#CustomLog "logs/access_log" common                 # 注释
ErrorLog "|/usr/local/apache/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"                 # 添加
CustomLog "|/usr/local/apache/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined                 # 添加
# systemctl restart httpd

8、mpm配置优化

Web 服务器 Apache 目前一共有三种稳定的 MPM(Multi-Processing Module,多进程处理模块)模式。如:Prefork(进程模式)、worker(线程模式)、Event (事件模式,2.4 版本后开始稳定)。

Apache2.4 版本以后,默认使用的是 worker 模式。

Event MPM:event 模式是在 2.4 版本中才可以稳定运行。

这是 Apache 最新的工作模式,它和 worker 模式很像,不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。当某个连接没有请求时,会主动关闭连接,在 work 模式下,必须等 keep-alive 超时,才可以释放

# vim /usr/local/apache/conf/extra/httpd-mpm.conf
Include conf/extra/httpd-mpm.conf    //取消注释
<IfModule mpm_event_module>
    StartServers            10
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         50
    MaxRequestWorkers      10000
    MaxConnectionsPerChild   0
</IfModule>
参数说明
StartServersapache 启动时候默认开始的子进程数
MinSpareThreads最小空闲数量的工作线程
MaxSpareThreads最大空闲数量的工作线程
ThreadsPerChild每个子进程产生的线程数量
MaxRequestWorkers允许同时的最大接入请求数量
MaxConnectionsPerChild每个子进程可处理的请求数

查看 httpd 占用内存的平均数: 使用 ps 查看 RSS 列,每个进程占用的内存容量

# ps -aux|grep -E "^apache"|awk '{print $6}'
8280
11992
13988
16072
16072
26892
22912
26888
22920
22912

注:默认单位是 K。

后期随着 Apache 进程处理的 web 请的增加,每个进程使用的内存数量还会增加的。 因为每个网站和业务不一样。所以每个 Apache 进程使用的内存大小也不一样。但是大家可以在自己的服务器上线 1 天后,使用此命令查看一下,每个进程使用的内存大小,这样可以准确算出每个进程使用的内存数量。
查看进程使用的内存的总大小:

# ps -axu | grep -E "apache" | awk '{sum += $6;n++};END{print sum}'
222816

大约 217.5MB 内存

查看每个进程使用内存的平均:

# ps -axu | grep -E "apache" | awk '{sum += $6;n++};END{print sum/n}'
14856.8

注:这样就可以根据每个进程使用内存的大小,来算一下我们最多可以给多少内存。

示例

假如一台服务器 cpu 是 8 核心,物理是内存 32G ,想达到 2000 并发的 apache,worker模式的配置参数如下:

<IfModule mpm_event_module>
 StartServers 16 
 MinSpareThreads 75 
 MaxSpareThreads 1250 
 ThreadsPerChild 125 
 MaxRequestWorkers 2000 
 MaxConnectionsPerChild 12500 
</IfModule>

详解每个参数的配置合理性如下:

StartServers 16					# 启动时进程数。一般设同 cpu 核心数一样或是 cpu核心数的 2 倍。这里调成 16 和 cpu 核心一样。

MinSpareThreads 75				# 最小空闲线程数。假设一个网站每天正常被用户使用的时间为早上 7:00 到晚上 2:00。那么 MinSpareThreads 应该配置为,这一时间段,最小并发访问量的 3 倍。比如 7:00 最少并发为 25,那就配置成 75。

MaxSpareThreads 1250			# 最大空闲线程数。一般配置为 1 天中最大并发量的 1半。如这台服务器能处理的最大并量为 2500。那么此值应该为 1250。因为内存闲着也是闲着,可以按linux 下尽可能使用内存的原则,配置成 1250.这样在突然到来更多访问量时,响应会更及时。

ThreadsPerChild 125				# 每个进程可以启动的线程数量。生产环境中,在带宽和硬盘性能充足的情况下,希望这个这台可以完成 2000 左右的并发。那么此值应该为:2000/StartServers 的值(这里是 16)=125 。但是一个进程不可能包括无数的线程,包括太多,会导致进程不稳定,容易崩溃。所以我们认为一个进程最多包括 125 线程,就很好了。所以如果还想处理更多的请求,可以把 StartServers 的值增加,而不是增大 ThreadsPerChild 的值。 因为 ThreadsPerChild值过大,会导致 Apache 运行不稳定。系统调优,稳定是一切的前提。

MaxRequestWorkers 2000			# 所有线程数量的最大值,通常表示了一个 web 服务的最大并发值。MaxRequestWorkers 必须是 ThreadsPerChild 的整数倍,否则 Apache 会提示调整到一个相近的值。MaxRequestWorkers=StartServers* ThreadsPerChild。 这里是:16*125=2000
MaxConnectionsPerChild 12500	# 最大连接数限制。每个子进程可以处理的最大请求数。如果设置为 0,表示没有限制。 我们设置为 MaxConnectionsPerChild 12500。当进程处理了 12500 个请求后,Apache 管理进程会去终止此进程继续处理新的请求,当此进程处理完所有的已建立的请求后,管理进程会杀掉此进程,重新生成一个新的进程。结合当前的配置,得出结论:Apache 一个进程中有 125 个线程。 Apache 一个进程处理 12500 个请求。 平均一个线程处理12500/125=110 个请求。这样配置还是合理的。一个线程处理太多的请求,也会出现内存溢出,导致进程崩溃。
0

评论区