欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Apache 并发优化设置方法

程序员文章站 2022-05-05 16:50:43
apache优化步骤: 1、先查看apache的运行模式,查看命令: httpd -l compiled in modules:    ...

apache优化步骤:

1、先查看apache的运行模式,查看命令:

httpd -l

compiled in modules:
           core.c
           prefork.c
           http_core.c
           mod_so.c
        这里可以看到运行模式是prefork模式。

2、修改apache 的httpd.conf 配置

本文是对512m 内存并装有apache的vps进行优化,请不要跟我说装nginx就强多了,确实如此,但是你这样说的话,这篇文章就没什么意义了,哈哈。那么进入正题吧!

操作系统(linux):centos 5.5 32位(并不是我说这个比较好,只是cents我用得比较熟练)

    内存:512m
    cpu:1g(1000mhz,vps实际有没有这个数,很难说)
    apache:2.2(建议低版本的,升级到高版本,毕竟旧版有很多问题,且性能也是高版本好点)

运行的主要是php程序,其他的不多说了,与本文关系不大。

首先,如题所说,本文所说的优化是针对apache 2.2以上版本,及使用perfork mpm模式的。perfork是apache在linux下默认安装下的模式,如果使用apache作为服务器的放在,还是使用perfork模式比较好,worker模式下对php某些功能并不支持。如果你使用的是win系统或都没有使有和perfork,那么下面可以选择不看或抱着学习的态度看看咯。

以下内容均属于博主自己的见解,实际测试请根据你的服务器,程序及其他因素按需处理。

一般情况下,我们需要优化apache就是因为apache占用大量的内存,导致vps当机,因为perfork是多进程处理的,每个进程都会点用一定的内存数量。所以限制httpd进程的数量,从而达到优化apache的作用。影响单个httpd进程的内存大小,主要都是加载模块,至少什么模块是合适的,我也很难说,因为这个是按由你的需要而定的。网上有些人说,绝大部分都会用不上的模块列出来,我认为这个是有很大的误导作用,因为绝大部分人中,也许你就是其中一个。将有用的模块屏蔽掉,最坏的情况,就是重启apache出错,或部分功能无法使用。所以我也不会列出什么最少模块加载方案什么的。所以,我只会说出一些参考。

apache(perfork)下的模块加载,并不是模块加载列表,没有的模块并不是屏蔽掉了,只是我也不清楚它的实际作用。

(一)、对于apache2.2,模块名有cache的一般都是有用的,因为有不少的这类模板都是2.1以上的apache才支持的,所以这类的模块不会是无缘无缘而存在的。

(二)、很有可能或必用到的模块有:

复制代码 代码如下:

loadmodule auth_basic_module modules/mod_auth_basic.so
  loadmodule authn_file_module modules/mod_authn_file.so
  loadmodule include_module modules/mod_include.so
  loadmodule log_config_module modules/mod_log_config.so
  loadmodule expires_module modules/mod_expires.so
  loadmodule deflate_module modules/mod_deflate.so
  loadmodule headers_module modules/mod_headers.so
  loadmodule setenvif_module modules/mod_setenvif.so
  loadmodule mime_module modules/mod_mime.so
  loadmodule autoindex_module modules/mod_autoindex.so
  loadmodule negotiation_module modules/mod_negotiation.so
  loadmodule dir_module modules/mod_dir.so
  loadmodule alias_module modules/mod_alias.so
  loadmodule rewrite_module modules/mod_rewrite.so

(三)、我粗略点了一下apache里面的模块约在50+以,要从中选择人人都适用的模块加载列表是不可能的,至少cgi模块我是不会用,但不排除你不会用。

模块加载这一块就说到这里,这个大家多百度,多用自然会识别出一些有用模块并渐渐屏蔽不使用的模块。

接下来,就是最为重要的perfork配置,也是困扰了我很久的问题,尽管参数就那么6个,那是却足以让你的vps当机。先列出需要修改的参数,修改位于httpd.conf的文件里面

复制代码 代码如下:

timeout 30
keepalive on
maxkeepaliverequests 80
keepalivetimeout 15
<ifmodule prefork.c>
serverlimit 150
startservers      5
minspareservers   5
maxspareservers   10
maxclients       150
maxrequestsperchild 4000
</ifmodule>

上面的代码就是要修改的,实际上我们是要修改perfork里在的参数,之所以将timeout,keepalive等也写出来,是因为这个也是影响apache性能的。

timeout是一个连接多少时间后断开,这个参数设置在30-60是一般的php程序都是适用的,至少要运行一些要占用大量时间的php程序,那么适当调高也是可以的,但请不要太高,否则会影响apache性能,本次优化我们使用30就很足够了。

maxkeepaliverequests 是一个连接最大的请求量,对于页面有较多的图片等元素,可以适当调高一点,对于一般的网页设置在80-120是足够的,我们就设置为100,如果设置太高会导致httpd长时间不能退出释放内存的。

keepalivetimeout 是当用户处理一次连接时,如果在该参数的时间内还有请求则会继续执行,不需要重新创建新的连接,直到达到maxkeepaliverequests的最大值才会退出。对于perfork模式下的,有人认为是将keepalive off会比较好,但是对于绝大多数的网站都会不多不少有些图片元素,所以将该项打开,并将keeptimeout设置在2-5秒,不但有效提高服务器性能,也能加快页面打开速度。

接下来,就是正式进入perfork的参数设置了,不想服务器运行一会就内存占满的得看看哦。

首先是参数serverlimit就是服务器最大支持同时连接的客户端,该值将决定下面参数maxclient可以设定的值的范围。serverlimit实际上只是起到一个限制的作用,并没有实际有作用,也许有,我就不知道了。实际上起到作用的是,maxclient参数,但这个值又受serverlimit的限制,等下会讲。

另三个参数startservers,minspareservers,maxspareservers,为什么将这三个参数一起说呢,因为这三个数是联系在一起的。这三个数都是决定空闲进程数量,startservers应该范围就是minspareservers和maxspareservers之间。否则,apache会自动将该值还原到两都之间,所以不要浪费不必要的资源。按照perfork默认的配置,这三个参数分别为:5,5,10。但是对于只有512m内存的vps来说,我认为还是有过大的负载。因此,我认为在这里应该退一步,将这三个参数设置为4,4,10,看起来和上面5,5,10并没有什么不同,最大值还是10,但在实际使用中4,4,10释放的内存速度会明显比5,5,10快很多。

接下来就是maxclient最大支持多少客户端在同一时间连接服务器,简单说就是最大并发数支持,这个没有特别需要说的。对于512m的vps你也别想你的站能承受百万pv,使用默认的150已是超出负载的了。一般将serverlimit和maxclient设为一样值即可。

最后就是maxrequestsperchild参数,一个进程在处理多少次之后退出,设置为0则是无限次,也就是说不会退出,那么httpd进程也不会退出。那么,你就等着你的vps当机重启去吧。对于这个参数,我粗略地搜索了一下,不少人推荐在1000次,也有100次的。据我的测试,对于内存只有512m的vps来说,该值设置在500以上都会很快占满内存,但不至少于当机。而观察得知,一但内存占满,cpu的使用率几乎变为0了。由此可知,当机了那什么都干不了了,还不如消耗多一点cpu资源避免,提高稳定性。所以,我最后的决定是将该值定义在30-40之间。这样设定后,可以看出,内存释放速度得到很大的提升,但也可以看到cpu也在频繁上下跳动。这样设置,即使内存占满,也能在最短时间恢复正常。

所以对于512mb的vps,apache(perfork模式)最后的优方配置为:

复制代码 代码如下:

timeout 30
keepalive on
maxkeepaliverequests 100
keepalivetimeout 2
<ifmodule prefork.c>
serverlimit 150
startservers      4
minspareservers   4
maxspareservers   10
maxclients       150
maxrequestsperchild 40
</ifmodule>

这样,我们的配置基本完成,进行负载测试即可。负载测试,我们使用ab测试,先声明一点,是用你本地的虚拟机去测试服务器上的一个静态页面,而不是在服务器上测试。之前,我就是这样做,因为网速一样,效果都是比较好的,但别人都是不同网速的,所以服务器上测试是不准确的。

3、现在看看需要怎么优化:
      连接数理论上是越大越好,但是得根据硬件,服务器的cpu,内存,带宽等因素,查看当前的apache连接数:
     

ps aux | grep httpd | wc -l

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

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

      这个只是做个参考。计算后要减去服务器系统本身所需要的资源。
      比如内存2g,减去500m留给服务器,还有1.5g,那么可得到最大连接数:在8000左右。
      根据情况修改后的httpd.conf的prefork的配置后为:
   

复制代码 代码如下:

<ifmodule prefork.c>
     startservers          5
     minspareservers       5
     maxspareservers      10
     serverlimit         5500
     maxclients          5000
     maxrequestsperchild   100
</ifmodule>

这里重点介绍下serverlimit,必须放到maxclients前,值要大于maxclients。

4 重启apache,再打开网站看看是否还会有慢的问题了。

附注:可以使用以下命令找到httpd.conf文件

find / -name httpd.conf