apache性能优化
来源:互联网 发布:apache httppost 编辑:程序博客网 时间:2024/06/06 02:44
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
<IfModule prefork.c>
StartServers 5 ##指定服务器启动时建立的子进程数量,prefork默认为5
MinSpareServers 5 ##指定空闲子进程的最小数量,默认为5。 如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大
MaxSpareServers 10 ##设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"
ServerLimit 400 ##服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。
注意:
1.修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
2. 必须放到MaxClients前,值要大于MaxClients
MaxClients 350 ##限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为150。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit
建议将初始值设为(以Mb为单位的最大物理内存/2)
MaxRequestsPerChild 50 ##每个子进程在其生存期内允许伺服的最大请求数量,默认为0.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束(不要设置为0). 内存较小的服务器不妨设置成30、50、100,以防内存溢出。
</IfModule>
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模式。
<IFModule mpm_worker_module>
StartServers 2 ##最初建立的子进程
MaxClients 150 ##所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
MinSpareThreads 25 ##最小空闲线程数,如果空闲的线程小于设定值,apache会自动建立线程,如果服务器负载大的话,可以考虑加大此参考值。
MaxSpareThreads 75 ##最大空闲线程数,如果空闲的线程大于设定值,apache会自动kill掉多余的线程,如果服务器负载大的话,可以考虑加大此参考值。
ThreadsPerChild 25 ##每个进程包含固定的线程数,此参数在worker模式中,是影响最大的参数,ThreadsPerChild的最大缺省值是64,如果负载较大,64是不够的。这时要显式使用threadlimit指令,它的最大缺省值是20000.
MaxRequestsPerChild 0 ##功能同prefork模式
</IFModule>
特别说明:如果显示声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则apache将会自动调节到一个相应值(可能是个非期望值)。
数学表达:
MaxClient = 总的进程数(ServerLimit)* 线程数(ThreadsPerChild)
MaxClient % ThreadsPerChild = 0
列举几个配置示例:
说明:
进程数25 * 线程数100 > 最大并发数2000
最大并发数2000 % 线程数100 = 0
<IFModule mpm_worker_module>
StartServers 3
MaxClients 2000 ##最大并发数
ServerLimit 25 ##进程数
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100 ##线程数
MaxRequestsPerChild 0
</IFModule>
<IFModule mpm_worker_module>
StartServers 5
MaxClients 9600
ServerLimit 64
MinSpareThreads 25
MaxSpareThreads 500
ThreadLimit 200
ThreadsPerChild 150
MaxRequestsPerChild 0
</IFModule>
<IFModule mpm_worker_module>
StartServers 2
MaxClients 500
ServerLimit 25
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IFModule>
<IFModule mpm_worker_module>
StartServers 3
MaxClients 1600
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 64
</IFModule>
mod_deflate压缩
1.安装mod_deflate模块: 略
2.修改配置文件 httpd.conf
<ifmodule mod_deflate.c>
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
</ifmodule>
可支持的文件类型有:
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 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.2.对目录
<Directory "/usr/local/httpd/htdocs">
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"
</Directory>
此处应该有图...
2.3.对虚拟主机
<VirtualHost *:80>
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"
</VirtualHost>
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 On
MaxKeepAliveRequests 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
- Apache性能优化技巧
- Apache性能优化技巧
- Apache性能优化技巧
- Apache性能优化技巧
- Apache性能优化技巧
- Apache性能优化技巧
- Apache性能优化技巧
- 优化Apache的性能
- Apache性能优化技巧
- Apache 性能优化相关
- apache-性能优化
- apache性能优化
- apache性能优化
- Apache性能优化
- apache 性能优化 MaxClients
- Apache性能优化
- Apache性能优化
- apache性能优化
- apache功能优化
- ZZULI-1905 小火山的围棋梦想 【BFS or DFS】
- OJ2128树结构练习——排序二叉树的中序遍历
- CSS中为什么overflow:hidden能清除浮动(float)的影响?原理是什么?
- Ubuntu16.04安装Samba
- apache性能优化
- laravel框架的搜索后分页
- Java获取时间差(天数差,小时差,分钟差)
- (POJ 3494)Largest Submatrix of All 1’s (DP、单调栈)
- cocos斗地主发牌动画
- 树结构练习——排序二叉树的中序遍历
- ZZULI-oj-1913 小火山的计算能力 ( 模拟 )
- sort命令详解高级语法
- HDOJ 1558 Segment set(并查集 + 线段判交)