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>
参数 | 说明 |
---|---|
StartServers | apache 启动时候默认开始的子进程数 |
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 个请求。这样配置还是合理的。一个线程处理太多的请求,也会出现内存溢出,导致进程崩溃。
评论区