apache性能优化

 

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、50100,以防内存溢出。

</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

 

 

 

 

 

 

;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值