博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apache性能优化
阅读量:4615 次
发布时间:2019-06-09

本文共 9946 字,大约阅读时间需要 33 分钟。

 

prefork

工作原理: 一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身 份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。

$ /usr/local/httpd/bin/apachectl -l  ##查看当前使用的工作模式

Compiled in modules:  core.c  prefork.c  http_core.c  mod_alias.c  mod_so.c  ......

 

$ sed -i 's#\#Include conf/extra/httpd-mpm.conf#Include conf/extra/httpd-mpm.conf#g' /usr/local/httpd/conf/httpd.conf

$ vi /usr/local/httpd/conf/extra/httpd-mpm.conf

StartServers 5 ##指定服务器启动时建立的子进程数量,prefork默认为5MinSpareServers 5 ##指定空闲子进程的最小数量,默认为5。 如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大MaxSpareServers 10 ##设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"ServerLimit 400 ##服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。##注意:## 1.修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。## 2. 必须放到MaxClients前,值要大于MaxClientsMaxClients 350 ##限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为150。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit,建议将初始值设为(以Mb为单位的最大物理内存/2)MaxRequestsPerChild 50 ##每个子进程在其生存期内允许伺服的最大请求数量,默认为0.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束(不要设置为0). 内存较小的服务器不妨设置成30、50、100,以防内存溢出。

 

 

worker

生产环境中,建议大家选择worker模式。

别忘了启用mpm配置文件:

$ sed -i 's#\#Include conf/extra/httpd-mpm.conf#Include conf/extra/httpd-mpm.conf#g' /usr/local/httpd/conf/httpd.conf

$ vi /usr/local/httpd/conf/extra/httpd-mpm.conf

worker模式是apche2.x新引进来的模式,是线程与进程的结合,在worker模式下,有多个子进程,每个子进程又会有多个线程,每个线程在某个确定的时间只能维持一个连接

工作原理:由主控制进程生成若干个子进程,而每个子进程中又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配置文件中设置了最小和最大的空闲线程数及所有子进程中的线程总数,如果现有子进程中的线程总数不能满足并发及负载,控制进程将派生新的子进程。

 

安装方法:在配置编译的工程中,加入参数--with-mpm=worker,如果不加的话系统会采用默认prefork模式。

优点:内存占用比prefork模式低,适合高并发高流量HTTP服务。

缺点:假如一个线程崩溃,整个进程就会连同其任何线程一起“死掉”。由于线程共享内存空间,所以一个程式在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式。

StartServers 2 ##最初建立的子进程 MaxClients 150 ##所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。 MinSpareThreads 25 ##最小空闲线程数,如果空闲的线程小于设定值,apache会自动建立线程,如果服务器负载大的话,可以考虑加大此参考值。 MaxSpareThreads 75 ##最大空闲线程数,如果空闲的线程大于设定值,apache会自动kill掉多余的线程,如果服务器负载大的话,可以考虑加大此参考值。 ThreadsPerChild 25 ##每个进程包含固定的线程数,此参数在worker模式中,是影响最大的参数,ThreadsPerChild的最大缺省值是64,如果负载较大,64是不够的。这时要显式使用threadlimit指令,它的最大缺省值是20000. MaxRequestsPerChild 0 ##功能同prefork模式

 

特别说明:如果显示声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则apache将会自动调节到一个相应值(可能是个非期望值)。

数学表达:

MaxClient = 总的进程数(ServerLimit)* 线程数(ThreadsPerChild)

MaxClient % ThreadsPerChild = 0

 

列举几个配置示例:

说明:

进程数25 * 线程数100 > 最大并发数2000

最大并发数2000 % 线程数100 = 0

StartServers 3MaxClients 2000 ##最大并发数ServerLimit 25 ##进程数MinSpareThreads 50MaxSpareThreads 200ThreadLimit 200ThreadsPerChild 100 ##线程数MaxRequestsPerChild 0
StartServers 5MaxClients 9600ServerLimit 64MinSpareThreads 25MaxSpareThreads 500ThreadLimit 200ThreadsPerChild 150MaxRequestsPerChild 0
StartServers 2MaxClients 500ServerLimit 25MinSpareThreads 25MaxSpareThreads 75ThreadsPerChild 25MaxRequestsPerChild 0
StartServers 3MaxClients 1600ServerLimit 25MinSpareThreads 50MaxSpareThreads 200ThreadLimit 200ThreadsPerChild 64

 

 

mod_deflate压缩

1.安装mod_deflate模块: 略

2.修改配置文件 httpd.conf

SetOutputFilter DEFLATE DeflateCompressionLevel 6 DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio #LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate #CustomLog logs/deflate_log.log deflate AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript ##针对不同浏览器的配置, 用处不大 #BrowserMatch ^Mozilla/4 gzip-only-text/html #BrowserMatch ^Mozilla/4\.0[678] no-gzip #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html ##不压缩图片 SetEnvIfNoCase Request_URI (?:gif|jpe?g|png)$ no-gzip dont-vary ##不压缩... SetEnvIfNoCase Request_URI (?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary #SetEnvIfNoCase Request_URI .(css|js)$ no-gzip dont-vary ##确保代理不会发送错误的内容 ##完全阻止代理服务器的缓存, 请用这句: Header set Vary * Header append Vary User-Agent env=!dont-vary

 

可支持的文件类型有:

text/plain text/html text/php text/xml text/css text/javascript

application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png  image/jpe image/swf image/jpeg image/bmp

3.优雅的重启apache:

$ /usr/local/httpd/bin/apachectl graceful

4.访问网页, 利用yslow查看压缩效果:

注意: yslow插件必须结合firebug才可以使用, 且火狐版本必须是ver36以下

此处应该有图...

 

 

 

mod_expires缓存

1.安装mod_expires模块: 略

2.修改配置文件 httpd.conf: 三种情况

2.1.对全局

ExpiresActive onExpiresDefault "access plus 12 month"ExpiresByType text/html "access plus 12 months"ExpiresByType text/css "access plus 12 months"ExpiresByType image/gif "access plus 12 months"ExpiresByType image/jpeg "access plus12  12 months"ExpiresByType image/jpg "access plus 12 months"ExpiresByType image/png "access plus 12 months"EXpiresByType application/x-shockwave-flash "access plus 12 months"EXpiresByType application/x-javascript "access plus 12 months"ExpiresByType video/x-flv "access plus 12 months"

 

2.2.对目录

AllowOverride None Options None Require all granted ErrorDocument 404 /404.html ExpiresActive on ExpiresDefault "access plus 12 month" ExpiresByType text/html "access plus 12 months" ExpiresByType text/css "access plus 12 months" ExpiresByType image/gif "access plus 12 months" ExpiresByType image/jpeg "access plus12 12 months" ExpiresByType image/jpg "access plus 12 months" ExpiresByType image/png "access plus 12 months" EXpiresByType application/x-shockwave-flash "access plus 12 months" EXpiresByType application/x-javascript "access plus 12 months" ExpiresByType video/x-flv "access plus 12 months"

 

此处应该有图...

 

2.3.对虚拟主机

ServerAdmin 274546888@qq.com DocumentRoot "/www/html" ServerName www.test.com ServerAlias test.com CustomLog "|/usr/local/sbin/cronolog /usr/local/httpd/logs/access_%Y%m%d.log" combined ErrorLog "|/usr/local/sbin/cronolog /usr/local/httpd/logs/error_%Y%m%d.log"ExpiresActive on ExpiresDefault "access plus 12 month" ExpiresByType text/html "access plus 12 months" ExpiresByType text/css "access plus 12 months" ExpiresByType image/gif "access plus 12 months" ExpiresByType image/jpeg "access plus12 12 months" ExpiresByType image/jpg "access plus 12 months" ExpiresByType image/png "access plus 12 months" EXpiresByType application/x-shockwave-flash "access plus 12 months" EXpiresByType application/x-javascript "access plus 12 months" ExpiresByType video/x-flv "access plus 12 months"

 

ExpiresDefault的参数:

<num> 必须是整数

<type> 可取值:years,months,weeks,days,hours,minutes,seconds

有效期可以通过增加“<num><type>”子句进一步调整:

ExpiresByType text/html "access plus 1 month 15 days 2 hours"ExpiresByType image/gif "modification plus 5 hours 3 minutes"

 

 

keepalive

$ grep "httpd-default.conf" /usr/local/httpd/conf/httpd.conf

Include conf/extra/httpd-default.conf  ##解开注释

 

$ vi /usr/local/httpd/conf/extra/httpd-default.conf

当网站的静态资源资源占多数的时候, keepalive的效果是最好的

必要情况下考虑动静分离, 分别配置keepalive参数, 以提高网站访问速度

Timeout 30  ##连接多少时间后断开,这个参数设置在30-60是一般的php程序都是适用的,至少要运行一些要占用大量时间的php程序,那么适当调高也是可以的,但请不要太高,否则会影响apache性能KeepAlive OnMaxKeepAliveRequests 100  ##一次连接可以进行的HTTP请求的最大请求次数。对于一般的网页设置在80-120是足够的,我们就设置为100,如果设置太高会导致httpd长时间不能退出释放内存的。KeepAliveTimeout 2  ##当用户处理一次连接时,如果在该参数的时间内还有请求则会继续执行,不需要重新创建新的连接,直到达到MaxKeepAliveRequests的最大值才会退出。对于perfork模式下的,有人认为是将KeepAlive Off会比较好,但是对于绝大多数的网站都会不多不少有些图片元素,所以将该项打开,并将KeepTimeOut设置在2-5秒,不但有效提高服务器性能,也能加快页面打开速度。

 

此处应该有图...

 

 

 

查看服务器状态

1.统计80端口连接数

$ netstat -nat|grep -i "80"|wc -l

2.统计httpd协议连接数(即进程数): 表示当前服务器的并发连接数

$ ps -ef|grep httpd|wc -l

实时检测HTTPD连接数:

$ watch -n 1 -d "pgrep httpd|wc -l"

3.统计已连接上的, 状态为 established, 对比httpd.conf中MaxClients的数字差距多少

$ netstat -an|grep ESTABLISHED|wc -l

4.查看Apache的并发请求数及其TCP连接状态

$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

LAST_ACK 5  ##等待所有分组死掉SYN_RECV 30  ##正在等待处理的请求数ESTABLISHED 1597  ##正常数据传输状态FIN_WAIT1 51  ##应用说它已经完成FIN_WAIT2 504  ##另一边已同意释放TIME_WAIT 1057  ##处理完毕,等待超时结束的请求数. TIME_WAIT并不会占用很大资源的,除非受到攻击

 

5.计算httpd占用内存的平均数:

$ ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'

6.查看已安装的模块

$ /usr/local/httpd/bin/apachectl -t -D DUMP_MODULES

7. 查看当前使用的工作模式

$ /usr/local/httpd/bin/apachectl -l

 

 

----------怎么安装apache模块: 以deflate为例----------

编译安装

$ cd /root/httpd-2.2.31  ##切换到安装包目录

$ ./configure --prefix=/usr/local/httpd --enable-deflate --enable-expires --enable-headers --enable- filter  ##重新编译

----------

可能报错:
error: mod_deflate has been requested but can not be built due to prerequisite failures
解决办法: 安装zlib包
$ yum install zlib-devel
----------

$ make

$ make install

$ /usr/local/httpd/bin/apachectl -t -D DUMP_MODULES  ##查看已安装的

Loaded Modules: core_module (static) deflate_module (static) expires_module (static) headers_module (static) filter_module (static) ......Syntax OK

 

$ service restart httpd

或单独安装

$ find / -name mod_deflate.c

/url/local/tools/httpd-2.2.31/modules/filters/mod_deflate.c

 

$ /usr/local/httpd/bin/apxs -i -c -a /usr/local/tools/httpd-2.2.31/modules/filters/mod_deflate.c

使用了apxs命令后, 会自动生成一个文件、并添加一行LoadModule

Libraries have been installed in: /usr/local/httpd/modules
LoadModule deflate_module     modules/mod_deflate.so

$ chmod 755 /usr/local/httpd/modules/mod_deflate.so

$ service httpd restart

 

 

 

 

 

 

;

转载于:https://www.cnblogs.com/upup2015/p/7782450.html

你可能感兴趣的文章
关于七牛进行图片添加文字水印操作小计
查看>>
DataSource数据库的使用
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>
Java的内部类真的那么难以理解?
查看>>
一文搞懂Java环境,轻松实现Hello World!
查看>>
hash实现锚点平滑滚动定位
查看>>
也谈智能手机游戏开发中的分辨率自适应问题
查看>>
关于 IOS 发布的点点滴滴记录(一)
查看>>
《EMCAScript6入门》读书笔记——14.Promise对象
查看>>
CSS——水平/垂直居中
查看>>
Eclipse连接mysql数据库jdbc下载(图文)
查看>>
Python中Selenium的使用方法
查看>>
三月23日测试Fiddler
查看>>
20171013_数据库新环境后期操作
查看>>
poj 1654 && poj 1675
查看>>
运维派 企业面试题1 监控MySQL主从同步是否异常
查看>>
Docker 版本
查看>>
poj 1753 Flip Game
查看>>
在深信服实习是怎样的体验(研发测试岗)
查看>>
Linux免密码登陆
查看>>