Apache2 相关优化专题

标签: 

  • 该话题包含 3个回复,1 人参与,最后由okass - WirelessLink社区okass 更新于 2年前
正在查看 3 条回复
  • 作者
    帖子
    • okass - WirelessLink社区okass
      参与者
      #1340
      Up
      2
      Down
      ::

      P1. 查看ubuntu apache2 运行模式

      1. 各工作模式的区别

      • prefork (apache2 默认的模式)中没有线程的概念,是多进程模型,一个进程处理一个连接;稳定;响应快。其缺点是在连接数比较大时就非常消耗内存。
      • worker 是多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。与prefork相比,worker模式更节省系统的内存资源。不过,需要注意worker模式下的Apache与php等程序模块的兼容性。
      • event 是worker模式的变种,它把服务进程从连接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的并发负载。

       

      2. 各种模式优劣对比

      prefork和worker模式的比较prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。

      prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。

      但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”.由于线程共享内存空间,所以一个程序在运行时必须被系统识别为”每个线程都是安全的”。

      总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

       

      3. ubuntu 下查看apache2 工作模式

      # apachectl -V

      …..

      Server version: Apache/2.4.52 (Ubuntu)

      Server built:   2022-03-25T00:35:40

      Server’s Module Magic Number: 20120211:121

      Server loaded:  APR 1.7.0, APR-UTIL 1.6.1

      Compiled using: APR 1.7.0, APR-UTIL 1.6.1

      Architecture:   64-bit

      Server MPM:     prefork

      threaded:     no

      forked:     yes (variable process count)

      Server compiled with….

      -D APR_HAS_SENDFILE

      访问ChatGPT的可用VPS机房IP推荐 Lisahost美国原生IP搬瓦工美西DMITTripodcloudFrantech
    • okass - WirelessLink社区okass
      参与者
      #1341
      Up
      0
      Down
      ::

      P2. Apache2 各种模式的参数优化配置

       

      1. prefork 模式优化

      路径:  /etc/apache2/mods-available/mpm_prefork.conf

      # 默认配置如下
      <IfModule mpm_prefork_module>
      #ServerLimit 256
      StartServers 5 #推荐设置:小=默认 中=20~50 大=50~100
      MinSpareServers 5 #推荐设置:与StartServers保持一致
      MaxSpareServers 10 #推荐设置:小=20 中=30~80 大=80~120
      MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000
      MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~500000
      </IfModule>

      # ServerLimit: 服务器最大进程限制数(Apache默认256),该数值应大于等于MaxRequestWorkers,否则MaxRequestWorkers无法设置
      # StartServers:  默认开始的服务器进程数
      # MinSpareServers:  最小的空闲进程数
      # MaxSpareServers:  最大的空闲进程数
      # MaxRequestWorkers:  最大数量的服务器进程数,2.3.13之前叫MaxClients ,最重要的一个参数
      # MaxConnectionsPerChild:  最大连接数的一个服务器进程服务

       

      • ServerLimit,取决于你系统的资源,每个apache进程默认占用20M内存,基本可以按照这个公式来计算:最大内存*80%/2M=ServerLimit
      • MaxRequestWorkers,一般apache线程数不会超过100,为什么?内存为2G的,100个线程就近2G了。
      • MinSpareServers,如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。在一台压力大(并发访问2800)的服务器上,MaxSpareServers这个值设置的是200
      • MaxRequestsPerChild,指令设置每个子进程在其生存期内允许伺服的最大请求数量。完成了指定的请求数后,会自动结束。好处:可防止偶然的内存泄露。若为0,可服务无限次。另外,kepalive连接,只计一个数
      • Keep-Alive 默认:ON
      • MaxKeepAliveRequests 默认:100,到该请求数后,将关闭该keepalive
      • KeepAliveTimeout 默认:5 ,到达该时间后,将关闭keepalive
      • TimeOut 默认:300 ,

       

      如果网站的pv值 百万

      • ServerLimit 2500 *# 用于修改apache编程参数
      • MaxClients 2000 *# 最大并发数

      注:调到这就是极限了,要是网站访问还是大,哪就要增加apache服务器了

       

      ====Apache2  小内存1G 优化案例

      针对apache2 默认的prefork工作模式,而且内存1G左右的小内存优化

      # 查看apache2 工作模式

      #apachectl -V

       

      # vim /etc/apache2/mods-available/mpm_prefork.conf

      <IfModule mpm_prefork_module>

      #StartServers     5

      #MinSpareServers          5

      #MaxSpareServers          10

      #MaxRequestWorkers 150

      #MaxConnectionsPerChild   0

       

      # 小内存1g 优化 20220420

      # 每个apache2 进程占用内存大概为20M

      StartServers      1

      MinSpareServers   1

      MaxSpareServers   10

      MaxRequestWorkers 40

      MaxConnectionsPerChild   0

      </IfModule>

      访问ChatGPT的可用VPS机房IP推荐 Lisahost美国原生IP搬瓦工美西DMITTripodcloudFrantech
    • okass - WirelessLink社区okass
      参与者
      #1342
      Up
      2
      Down
      ::

      2. worker模式

       

      Worker MPM支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

       

      <IfModule mpm_worker_module>
      StartServers 2 #推荐设置:小=默认 中=3~5 大=5~10
      MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000
      MinSpareThreads 25 #推荐设置:小=默认 中=50~100 大=100~200
      MaxSpareThreads 75 #推荐设置:小=默认 中=80~160 大=200~400
      ThreadsPerChild 25 #推荐设置:小=默认 中=50~100 大型=100~200
      MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~50000
      (此外,如果MaxClients/ThreadsPerChild大于16,还需额外设置ServerLimit参数,ServerLimit必须大于等于 MaxClients/ThreadsPerChild 的值。)
      </IfModule>

       

      StartServers       3    //apache已启动马上创建3个httpd进程(ps aux可以看到)
      MaxClients       2000 //同一时间最大接受2000个请求(其实就是2000个线程)
      ServerLimit       25    //apache最大能启动25个进程。
      MinSpareThreads    50    //apache至少要有50个空闲线程,用来等待接下来的请求,不满则由进程创建线程
      MaxSpareThreads    200   //apache最多能有200个线程,超出了200个线程,则杀死多余的线程
      ThreadLimit       200   //限制一个进程最多只能创建200个线程
      ThreadsPerChild     100   //设定一个进程固定创建100个线程
      MaxRequestsPerChild  10000 //设定当一个进程一共接受过10000此请求之后被杀死。以释放内存。

       

      将apache设为worker模式是需要在编译apache时配置参数

      监控当前apache线程总数: watch -n 1 -d “pgrep apache|wc -l”

      计算当前apahce平均内存占用大小 ps aux|grep -v grep|awk ‘/apache2/{sum+=$6;n++};END{print sum/n}'(注意:可通过调整$6,$4,$3查看内存\CPU使用百分比,或修改输出公式为num,查看总量)

      自带测试工具 ab -n 1000 -c 10 127.0.0.1/index.php

      访问ChatGPT的可用VPS机房IP推荐 Lisahost美国原生IP搬瓦工美西DMITTripodcloudFrantech
    • okass - WirelessLink社区okass
      参与者
      #1343
      Up
      2
      Down
      ::

      注意事项:

       

      • 升级 Apache 到最新版本,新版本往往包含性能提升和安全更新。
      • 在 httpd.conf 中设置 “HostNameLookups off” 能避免针对每个访问者的 DNS 域名的反向查询。
      • 对于繁忙的网站,在 httpd.conf 中设置 “MaxClients 230” 或者更高。这项设置让更多的 httpd 进程同时响应请求,并避免了处理器排队的情况发生。
      • 采用另外一台服务器处理图片文件。
      • 缺保您的 Web 页面和 CGI 页面采用了浏览器缓冲技术。具体的文章可以参考本站:采用 mod_gzip 加速 Zope 和 Apache
      • 保持您的 Apache 苗条,编译那些仅仅需要的模块,在编译之前,修改 src/Configuration 文件,在那些不需要的模块之前用 # 号注释掉。
      • 如果不需要流量日志,那么把 httpd.conf 中的 TransferLog 指向到 /dev/null/
      • 除非你确定使用 .htaccess 文件来控制一些目录的权限,否则设置 “AllowOverride None” ,这样就免去 Apache 在每个目录搜索 .htaccess 文件的劳役之苦。
      • 不要让不需要的后台进程运行。
      • 千万不要把页面或者日志文件写到网络磁盘上,例如 NFS。
      • 不要让 Apache (httpd) 运行于 inetd 模式。
      • 不要让 X Windows 运行在你的 Web 服务器上,用 Ctrl-Alt-Backspace 关闭 X 。
      • 避免使用 SSI tag。
      • 在 CGI 脚本中:     ** 文件 I/O:打开的文件数目越少越好。     ** Shell 命令:采用全路径来调用 shell 命令。     ** 如果你的网站主要以 CGI 来驱动,那么请使用 mod_perl。     ** 在你的 Web 页面目录中,不要让文件数超过 1000 个,文件越多花费在定位上的时间也越多。
      • 在 Web 服务器上的图片越少越好,保证每个图片都经由图片压缩器运行。
      • 对你的网站做压力测试,建议采用 Apache 自带的 ab 命令来测试。
      • 为了最好的性能,最好把网线拔掉,这样你的 Web 服务器就十分安全,而且负载马上降为 0。
      访问ChatGPT的可用VPS机房IP推荐 Lisahost美国原生IP搬瓦工美西DMITTripodcloudFrantech
正在查看 3 条回复
  • 哎呀,回复话题必需登录。
WirelessLink社区
Logo