Apache 性能配置优化

###httpd 相关查看命令了解
查看当前安装模块mpm(多路处理器)
[root@localhost ~]# httpd -l
查看httpd进程数(即各个mpm模式下Apache能够处理的并发请求数)
[root@localhost ~]# ps -ef | grep httpd | wc -l
得到的结果数字就是表示可以同时并发的进程数据,一个父进程,5个子进程。apache默认是开启5个子进程
查看Apache的并发请求数及其TCP连接状态
[root@localhost ~]# netstat -n | awk '/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}'
    ESTABLISHED
---
-        CLOSED:无连接是活动的或正在进行
-        LISTEN:服务器在等待进入呼叫
-        SYN_RECV:一个连接请求已经到达,等待确认
-        SYN_SENT:应用已经开始,打开一个连接
-        ESTABLISHED:正常数据传输状态
-        FIN_WAIT1:应用说它已经完成
-        FIN_WAIT2:另一边已同意释放
-        ITMED_WAIT:等待所有分组死掉
-        CLOSING:两边同时尝试关闭
-        TIME_WAIT:另一边已初始化一个释放
-        LAST_ACK:等待所有分组死掉
查看请求80服务的client ip按照连接数排序。
[root@localhost ~]# netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
查看apache详细链接情况
[root@localhost ~]# netstat -aptol
检测某一台服务器的端口是否开启状态
[root@localhost ~]# nc -v -w 10 -z 172.20.206.147 25801
验证apache2配置是否正确
[root@localhost ~]# httpd -t
###apache模块启用
模块介绍:Apache 各个模块功能 基本(B)模块默认包含,必须明确禁用;扩展(E)/实验(X)模块默认不包含,必须明确启用。
        模块名称    状态    简要描述
        mod_actions (B) 基于媒体类型或请求方法,为执行CGI脚本而提供
        mod_alias (B) 提供从文件系统的不同部分到文档树的映射和URL重定向
        mod_asis (B) 发送自己包含HTTP头内容的文件
        mod_auth_basic (B) 使用基本认证
        mod_authn_default (B) 在未正确配置认证模块的情况下简单拒绝一切认证信息
        mod_authn_file (B) 使用纯文本文件为认证提供支持
        mod_authz_default (B) 在未正确配置授权支持模块的情况下简单拒绝一切授权请求
        mod_authz_groupfile (B) 使用纯文本文件为组提供授权支持
        mod_authz_host (B) 供基于主机名、IP地址、请求特征的访问控制
        mod_authz_user (B) 基于每个用户提供授权支持
        mod_autoindex (B) 自动对目录中的内容生成列表,类似于"ls"或"dir"命令
        mod_cgi (B) 在非线程型MPM(prefork)上提供对CGI脚本执行的支持
        mod_cgid (B) 在线程型MPM(worker)上用一个外部CGI守护进程执行CGI脚本
        mod_dir (B) 指定目录索引文件以及为目录提供"尾斜杠"重定向
        mod_env (B) 允许Apache修改或清除传送到CGI脚本和SSI页面的环境变量
        mod_filter (B) 根据上下文实际情况对输出过滤器进行动态配置
        mod_imagemap (B) 处理服务器端图像映射
        mod_include (B) 实现服务端包含文档(SSI)处理
        mod_isapi (B) 仅限于在Windows平台上实现ISAPI扩展
        mod_log_config (B) 允许记录日志和定制日志文件格式
        mod_mime (B) 根据文件扩展名决定应答的行为(处理器/过滤器)和内容(MIME类型/语言/字符集/编码)
        mod_negotiation (B) 提供内容协商支持
        mod_nw_ssl (B) 仅限于在NetWare平台上实现SSL加密支持
        mod_setenvif (B) 根据客户端请求头字段设置环境变量
        mod_status (B) 生成描述服务器状态的Web页面
        mod_userdir (B) 允许用户从自己的主目录中提供页面(使用"/~username")
        mod_auth_digest (X) 使用MD5摘要认证(更安全,但是只有最新的浏览器才支持)
        mod_authn_alias (E) 基于实际认证支持者创建扩展的认证支持者,并为它起一个别名以便于引用
        mod_authn_anon (E) 提供匿名用户认证支持
        mod_authn_dbd (E) 使用SQL数据库为认证提供支持
        mod_authn_dbm (E) 使用DBM数据库为认证提供支持
        mod_authnz_ldap (E) 允许使用一个LDAP目录存储用户名和密码数据库来执行基本认证和授权
        mod_authz_dbm (E) 使用DBM数据库文件为组提供授权支持
        mod_authz_owner (E) 基于文件的所有者进行授权
        mod_cache (E) 基于URI键的内容动态缓冲(内存或磁盘)
        mod_cern_meta (E) 允许Apache使用CERN httpd元文件,从而可以在发送文件时对头进行修改
        mod_charset_lite (X) 允许对页面进行字符集转换
        mod_dav (E) 允许Apache提供DAV协议支持
        mod_dav_fs (E) 为mod_dav访问服务器上的文件系统提供支持
        mod_dav_lock (E) 为mod_dav锁定服务器上的文件提供支持
        mod_dbd (E) 管理SQL数据库连接,为需要数据库功能的模块提供支持
        mod_deflate (E) 压缩发送给客户端的内容
        mod_disk_cache (E) 基于磁盘的缓冲管理器
        mod_dumpio (E) 将所有I/O操作转储到错误日志中
        mod_echo (X) 一个很简单的协议演示模块
        mod_example (X) 一个很简单的Apache模块API演示模块
        mod_expires (E) 允许通过配置文件控制HTTP的"Expires:"和"Cache-Control:"头内容
        mod_ext_filter (E) 使用外部程序作为过滤器
        mod_file_cache (X) 提供文件描述符缓存支持,从而提高Apache性能
        mod_headers (E) 允许通过配置文件控制任意的HTTP请求和应答头信息
        mod_ident (E) 实现RFC1413规定的ident查找
        mod_info (E) 生成Apache配置情况的Web页面
        mod_ldap (E) 为其它LDAP模块提供LDAP连接池和结果缓冲服务
        mod_log_forensic (E) 实现"对比日志",即在请求被处理之前和处理完成之后进行两次记录
        mod_logio (E) 对每个请求的输入/输出字节数以及HTTP头进行日志记录
        mod_mem_cache (E) 基于内存的缓冲管理器
        mod_mime_magic (E) 通过读取部分文件内容自动猜测文件的MIME类型
        mod_proxy (E) 提供HTTP/1.1的代理/网关功能支持
        mod_proxy_ajp (E) mod_proxy的扩展,提供Apache JServ Protocol支持
        mod_proxy_balancer (E) mod_proxy的扩展,提供负载平衡支持
        mod_proxy_connect (E) mod_proxy的扩展,提供对处理HTTP CONNECT方法的支持
        mod_proxy_ftp (E) mod_proxy的FTP支持模块
        mod_proxy_http (E) mod_proxy的HTTP支持模块
        mod_rewrite (E) 一个基于一定规则的实时重写URL请求的引擎
        mod_so (E) 允许运行时加载DSO模块
        mod_speling (E) 自动纠正URL中的拼写错误
        mod_ssl (E) 使用安全套接字层(SSL)和传输层安全(TLS)协议实现高强度加密传输
        mod_suexec (E) 使用与调用web服务器的用户不同的用户身份来运行CGI和SSI程序
        mod_unique_id (E) 为每个请求生成唯一的标识以便跟踪
        mod_usertrack (E) 使用Session跟踪用户(会发送很多Cookie),以记录用户的点击流
        mod_version (E) 提供基于版本的配置段支持
        mod_vhost_alias (E) 提供大批量虚拟主机的动态配置支持
###性能调优,模块启用/关闭
    (1)启用压缩
        LoadModule deflate_module modules/mod_deflate.so
    (2)启用重写
        LoadModule rewrite_module modules/mod_rewrite.so  
    (3)启用默认扩展,支持在这里进行修改httpd主要配置
        Include conf/extra/httpd-default.conf  
    (4)提供文件描述符缓存支持,从而提高Apache性能
        LoadModule file_cache_module modules/mod_file_cache.so
    (5)启用基于URI键的内容动态缓冲(内存或磁盘)  
        LoadModule cache_module modules/mod_cache.so  
    (6)启用基于磁盘的缓冲管理器
        LoadModule cache_disk_module modules/mod_cache_disk.so  
    (7)基于内存的缓冲管理器
        LoadModule socache_memcache_module modules/mod_socache_memcache.so 
    (8)屏蔽所有不必要的模块
        #LoadModule authn_file_module modules/mod_authn_file.so  
        #LoadModule authn_dbm_module modules/mod_authn_dbm.so  
        #LoadModule authn_anon_module modules/mod_authn_anon.so  
        #LoadModule authn_dbd_module modules/mod_authn_dbd.so  
        #LoadModule authn_socache_module modules/mod_authn_socache.so  
        #LoadModule authn_core_module modules/mod_authn_core.so  
        #LoadModule authz_host_module modules/mod_authz_host.so  
        #LoadModule authz_groupfile_module modules/mod_authz_groupfile.so  
        #LoadModule authz_user_module modules/mod_authz_user.so  
        #LoadModule authz_dbm_module modules/mod_authz_dbm.so  
        #LoadModule authz_owner_module modules/mod_authz_owner.so  
        #LoadModule authz_dbd_module modules/mod_authz_dbd.so  
        LoadModule authz_core_module modules/mod_authz_core.so  
        LoadModule access_compat_module modules/mod_access_compat.so  
        #LoadModule auth_basic_module modules/mod_auth_basic.so  
        #LoadModule auth_form_module modules/mod_auth_form.so  
        #LoadModule auth_digest_module modules/mod_auth_digest.so 
    (9)已经过时屏蔽
        #LoadModule autoindex_module modules/mod_autoindex.so
    (10)用于定义缺省文档index.php、index.jsp等
        LoadModule dir_module modules/mod_dir.so
    (11)用于定义记录文件格式
        LoadModule log_config_module modules/mod_log_config.so
    (12)定义文件类型的关联
        LoadModule mime_module modules/mod_mime.so
    (13)减少10%左右的重复请求
        LoadModule expires_module modules/mod_expires.so  
    (14)允许apache修改或清除传递到cgi或ssi页面的环境变量
        LoadModule env_module modules/mod_env.so
    (15)根据客户端请求头字段设置环境变量,如果不需要则屏蔽掉
        #LoadModule setenvif_module modules/mod_setenvif.so
    (16)生成描述服务器状态的页面
        #LoadModule status_module modules/mod_status.so
    (17)别名
        LoadModule alias_module modules/mod_alias.so
    (18)url地址重写模块
        LoadModule rewrite_module modules/mod_rewrite.so
    (19)jk_mod 负载均衡调度模块
        LoadModule    jk_module modules/mod_jk.so 
    (20)过滤模块,使用缓存必须启用过滤模块
        LoadModule filter_module modules/mod_filter.so 
    (21)关闭服务器版本信息
        LoadModule version_module modules/mod_version.so
    (22)自动修正用户输入的url错误 
        LoadModule speling_module modules/mod_speling.so
###apache2 扩展配置文件说明
httpd-autoindex.conf            自动索引配置
httpd-dav.conf                  WebDAV配置
httpd-default.conf              Apache的默认配置
httpd-info.conf                 mod_status, mod_info模块配置
httpd-languages.conf            Apache多语言配置支持
httpd-manual.conf               在网站上提供Apache手册
httpd-mpm.conf                  多路处理模块配置文件
httpd-multilang-errordoc.conf   实现多语言的错误信息
httpd-ssl.conf                  SSL配置
httpd-userdir.conf              配置用户目录
httpd-vhosts.conf               虚拟主机配置
###性能指标计算方法
提供下面这个公式,以供大家在平时或者日常需要进行的性能测试中作为一个参考。
(1) 计算平均的并发用户数:C = nL/T

公式(1)中,C是平均的并发用户数;n是login session的数量;L是login session的平均长度;T指考察的时间段长度。

(2) 并发用户数峰值:C’ ≈ C+3根号C

公式(2)则给出了并发用户数峰值的计算方式中,其中,C’指并发用户数的峰值,C就是公式(1)中得到的平均的并发用户数。该公式的得出是假设用户的loginsession产生符合泊松分布而估算得到的。

实例:
假设有一个OA系统,该系统有3000个用户,平均每天大约有400个用户要访问该系统,对一个典型用户来说,一天之内用户从登录到退出该系统的平均时间为4小时,在一天的时间内,用户只在8小时内使用该系统。
则根据公式(1)和公式(2),可以得到:

C = 400*4/8 = 200

C’≈200+3*根号200 = 242

F=VU * R / T

其中F为吞吐量,VU表示虚拟用户个数,R表示每个虚拟用户发出的请求数,T表示性能测试所用的时间

R = T / TS。
影响和评估性能的几个关键指标
从上面的公式一节中我们还得到了一个名词“吐吞量”。和吞吐量相关的有下面这些概念,记录下来以供参考。

吞吐量:
指在一次性能测试过程中网络上传输的数据量的总和。
对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,在容量规划的测试中,吞吐量是一个重点关注的指标,因为它能够说明系统级别的负载能力,另外,在性能调优过程中,吞吐量指标也有重要的价值。

吞吐率:
单位时间内网络上传输的数据量,也可以指单位时间内处理客户请求数量。它是衡量网络性能的重要指标,通常情况下,吞吐率用“字节数/秒”来衡量,当然,你可以用“请求数/秒”和“页面数/秒”来衡量。
其实,不管是一个请求还是一个页面,它的本质都是在网络上传输的数据,那么来表示数据的单位就是字节数。

事务:
就是用户某一步或几步操作的集合。不过,我们要保证它有一个完整意义。比如用户对某一个页面的一次请求,用户对某系统的一次登录,淘宝用户对商品的一次确认支付过程。这些我们都可以看作一个事务。
那么如何衡量服务器对事务的处理能力。又引出一个概念—-TPS

TPS (Transaction Per second):
每秒钟系统能够处理事务或交易的数量,它是衡量系统处理能力的重要指标。

点击率(Hit Per Second):
点击率可以看做是TPS的一种特定情况。点击率更能体现用户端对服务器的压力。TPS更能体现服务器对客户请求的处理能力。

每秒钟用户向web服务器提交的HTTP请求数。这个指标是web 应用特有的一个指标;web应用是“请求-响应”模式,用户发一个申请,服务器就要处理一次,所以点击是web应用能够处理的交易的最小单位。
如果把每次点击定义为一个交易,点击率和TPS就是一个概念。容易看出,点击率越大。对服务器的压力也越大,点击率只是一个性能参考指标,重要的是分析点击时产生的影响。

需要注意的是,这里的点击不是指鼠标的一次“单击”操作,因为一次“单击”操作中,客户端可能向服务器发现多个HTTP请求。

吞吐量指标的作用:
用户协助设计性能测试场景,以及衡量性能测试场景是否达到了预期的设计目标:在设计性能测试场景时,吞吐量可被用户协助设计性能测试场景,根据估算的吞吐量数据,可以对应到测试场景的事务发生频率,事务发生次数等;
另外,在测试完成后,根据实际的吞吐量可以衡量测试是否达到了预期的目标。
用于协助分析性能瓶颈:吞吐量的限制是性能瓶颈的一种重要表现形式,因此,有针对性地对吞吐量设计测试,可以协助尽快定位到性能冰晶所在位置。

平均相应时间:
也称为系统响应时间,它一般指在指定数量的VU情况下,每笔交易从mouse 的click到IE的数据刷新与展示之间的间隔,比如说:250个VU下每笔交易的响应时间不超过2秒。
当然,响应时间也不能一概而论,对于实时交易如果银行柜台操作、超市收银员(邪恶的笑。。。)的操作、证交所交易员的操作来说这些操作的响应时间当然是越快越好,而对于一些企业级的如:
与银行T+1交易间的数据跑批、延时交易、T+1报表等,你要求它在2秒内响应,它也做不到啊。就好比你有个1MB的带宽,你传的东西是超过4MB,你要它在2秒内跑完理论速度也做不到啊,对吧,所以有些报表或者数据,
光前面传输时间就不止两秒了。

###apache2自带的压力测试工具ab
 ab最常用的语法格式是这样的
[root@localhost ~]# ab -n XXX -c YYY -k http://hostname.port/path/filename
    -n XXX:表示最多进行XXX次测试。也就是下载filename文件XXX次。
    -c YYY:客户端并发连接个数。
    -k:启用HTTP KeepAlive功能。默认不启用KeepAlive功能。
ab必须安装在客户端上,并且客户端机器配置性能要高些。
比如我们要对http://hostname:port/file.com下载10000次进行测试,并发访问为60个,启用HTTP KeepAlive功能,则访问指令为
[root@localhost ~]# ab -n 10000 -c 60 -k http://hostname:port/file.htm
Java的压力测试工具Jmeter
Jmeter 是apache开发的基于Java的压力测试工具。

###apache多路处理器MPM
目前apache2.4版本已经event MPM纳入正式版,不再是实验状态。安装时,apache已经自动将event MPM一起安装进去,通过apachectl -l可以查看到event.c模块。由此可以看到,event MPM已经成为apache默认的MPM工作模式。
vim /etc/httpd/conf/httpd.conf

Include conf.modules.d/*.conf

(1)启用MPM
vim /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

(2)配置MPM参数
1、选择合适的MPM(Multi -Processing Modules, 多处理模块)
Unix/Linux平台,有3中PMP:event,prefork及worker。在全部平台中,MPM 都可以构建为静态模块。在构建时选择一种 MPM,链接到服务器中。如果要改变 MPM,必须重新构建。要求更高伸缩性的站点可以选择使用线程的 MPM,即worker 或 event;
要求可靠性或者与旧软件兼容的站点可以使用prefork。

查看当前服务器使用的是哪种MPM
# httpd -l
Compiled in modules:

core.c
  prefork.c
  http_core.c
  mod_so.c

如上,根据带背景色内容可推断出来使用的prefork MPM
####prefork:
实现非线程、预派生的web服务器。每个服务器进程响应进入的请求,父进程处理服务器池大小。适合需要兼容非线程安全的类库的站点。因为使用的是进程,所以,如果某个请求出现故障,不会影响其它请求,用于隔离每个请求的最好的MPM。
该MPM自我调节性强,极少需要调整其配置指令。最重要的是,MaxRequestWorkers要足够大,以处理尽可能多的请求,但同时也不能太大,确保有足够的物理内存来处理请求。
####工作原理:
单个控制进程负责启动子进程,子进程负责监听连接请求并在请求到达时进行除处理。Apache httpd总是尽量保持空闲,为处理进入的请求做好准备。按这种方式,客户端请求被处理之前,客户端无需等待服务器派生一个新的子进程。
为了绑定到80端口,Unix下父进程通常以root身份启动,子进程则以更少权限的用户身份,由Apache httpd启动。User 和 Group 指令用于设置Apache httpd子进程的权限。
当遇到极大的并发问题时,该MPM使用mpm-accept mutex 来序列化即将到达连接的访问。可通过Mutex进行配置该mutext的配置。
参考连接:https://httpd.apache.org/docs/2.4/en/mod/prefork.html

####worker:
实现多进程,多线程混合服务器。相比基于进程的服务器,worker使用线程服务器请求,可处理大量请求,同时消耗更少的内存。同时,拥有多进程处理方式,让其仍拥有有基于进程服务器的稳定性。
用于控制MPM最重要的指令为ThreadsPerChild和MaxRequestWorkers,其中,ThreadsPerChild控制每个子进程使用的线程数量,MaxRequestWorkers控制线程的最大总数
####工作原理:
同prefork,单个控制进程负责启动子进程,每个子进程创建由ThreadsPerChild指定的固定数量的线程,以及用于负责监听连接请求,并在请求到达时将其传递给服务器线程的监听线程。
参考连接:https://httpd.apache.org/docs/2.4/en/mod/worker.html

####event:
基于worker,利用主线程来处理新请求,以便允许更多的并发请求。单个控制进程(父进程)负责启动子进程。每个子进程创建一个由ThreadsPerChild指定的固定数量的服务器线程和一个监听线程,监听连接,当请求到达时,传递给worker线程进行处理。可在编译脚本时,使用--with-mpm=event选项来使用event MPM:./configure --with-mpm=event,其它MPM以此类推,不再赘述。
工作原理:
该MPM尽力弥补HTTP中的“keep alvie”问题。客户端完成第一次请求后,保持连接为open,再次发送请求时,使用相同的socket,这样在建立TCP连接时节约了极大的开销。然而,Apache HTTP 服务器通常保持整个子进程、线程等待来子客户端的数据,这给服务器自身带来了不利。为了解决这个问题,针对每个进程,MPM使用一个专用的监听线程来处理监听socket。
这种模式下,不再需要mpm-accept Mutex,单个进程或线程可处理的总的连接数由AsyncRequestWorkerFactor指定
参考连接:https://httpd.apache.org/docs/2.4/en/mod/event.html

2、优化prefork
Apache httpd自我调节性强,所以大多数站点不需要调整其默认值。如果有需要可以调整其配置如下:

# vim /etc/httpd/conf.modules.d/00-mpm.conf

<IfModule mpm_prefork_module>
    StartServers                5                          #apache启动时候默认开始的进程数

MinSpareServers             5                          #最小的闲置进程数

MaxSpareServers             10                         #最大的闲置进程数

ServerLimit                 256                        #最大的进程总数(参考,实际看MaxClients)

MaxClients                  256                        #同时处理的进程总数,即最大并发数

MaxRequestsPerChild        4000                        #每个进程处理的最大请求数
</IfModule>

说明:

StartServers: Apache服务器启动时建立的初始服务器子进程数,由于进程数量根据负载动态控制的,所以很少需要调整该参数的值。

MinSpareServers:空闲服务器子进程的最小数,所谓空闲服务器子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将创建新的子进程:创建一个,等待1s,然后创建2个,等待1秒,接着创建4个……,直到每秒创建32个子进程。当满足MinSpareServers设置时停止创建。只有在非常繁忙的机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

MaxSpareServers: 空闲服务器子进程的最大数,如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将会杀死多余的子进程。只有在非常繁忙的机器上才需要调整这个参数,将此参数设的太大通常是一个坏主意,如果将该指令的值设置为同 MinSpareServers相等或者比其小,Apache将会自动将其修改成”MinSpareServers+1″。

MaxRequestWorkers: 可同时处理的最大请求数,超过MaxRequestWorkers限制的连接将要排队,排队的数量可达到基于ListenBacklog指令的某个数,一旦某个请求结束后,子进程变获得自由,开始处理下一个连接。针对非线程服务器,比如prefork,MaxRequestWorkers同时也是同一时刻,允许的最大子进程数。针对线程服务器,比如event或wroker,该参数限制了服务器可获得的最大线程总数,默认值为ServerLimit x ThreadsPerChild。如果要增加它的值,则都必须提升ServerLimit。

如果服务器内存较小,可能需要减少 MaxRequestWorkers 防止抖动(反复交换内存到磁盘)。关于更多进程调优信息参考performance hints 文档。

附:查看Apache进程数
# ps -ef|grep httpd|wc -l
21

MaxConnectionsPerChild: 每个服务器子进程被终止前可处理的最大连接数(每个进程在处理了指定次数的连接,子进程将会被父进程终止,这时候子进程占用的内存就会释放),设置为0表示无限制,即不终止进程。内存较大的服务器可以设置为0(不推荐)或较大的数字。内存较小的服务器可以设置比较小的值,以防内存溢出,还可以在服务器负载下降的时侯会自动减少子进程数。一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试
注:original文件夹是配置文件的源文件备份,而真正要配置的是conf目录下的httpd.conf文件以及extra目录的额外扩展配置。
https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html

3、优化worker
生产环境中,建议大家选择worker模式
# vim /etc/httpd/conf.modules.d/00-mpm.conf

<IFModule mpm_worker_module>
    StartServers             3     //创建子进程的初始数量
    
    MaxClients               2000  //最大并发数

ServerLimit              25    //服务器允许配置的进程数上限
    
    MinSpareThreads          75    //最小空闲线程的数量

MaxSpareThreads          250     //最大空闲线程的数量
    
    ThreadLimit              200     //进程生命周期内,为ThreadsPerChild设置最大配置值
    
    ThreadsPerChild          25      //每个子进程创建的线程数量

MaxRequestWorkers        400     //最大工作线程的数量

MaxConnectionsPerChild   1000    //每个子进程的最大连接数,0是不限制
</IfModule>

ServerLimit:对活动子进程数的硬限制(hard limit),值必须大于等于MaxConnectionsPerChild  
MaxRequestWorkers:对于prefork MPM, ServerLimit设置整个Apache httpd生命周期内,MaxRequestWorker的最大可配置值。对于worker和event MPM,结合ThreadLimit设置MaxRequestWorkers的最大可配置
需要注意的是,如果ServerLimit设置的值远高于实际需要的值,将分配额外的共享内存。如果ServerLimit和MaxRequestWorkers设置的值大于服务器处理能力,那么可能会导致服务器无法启动或者不稳定。
针对prefork MPM,如果需要设置MaxRequestWorkers值高于256,那么需要用到该指令,不要设置该参数的值大于MaxRequestWorkers
针对worker和event MPM,如果MaxRequestWorkers和ThreadsPerChild设置要求多余16个服务器进程(默认)时使用该选项。不要设置该参数的值大于MaxRequestWorkers 和ThreadsPerChild设置要求的服务器进程数(MaxRequestWorkers = ServerLimit x ThreadsPerChild)。
注意:Apache编译时,内部有一个硬限制 ServerLimit 20000(针对prefork MPM 200000)。如果需要增加超过硬限制的值,需要修改源文件中的MAX_SERVER_LIMIT并重新构建服务器
ThreadLimit:在整个Apache httpd进程生命周期内,为ThreadsPerChild设置最大配置值,对服务器线程数量的硬限制,必须大于等于ThreadsPerChild,如果比ThreadsPerChild设置的值高很多,将会分配额外未使用的内存;如果ThreadLimit 和ThreadsPerChild设置的值大于服务器处理能力,那么可能会导致服务器无法启动或者不稳定。
针对mpm_winnt,默认值为1920,其它 64
注意:Apache在编译时,内部有一个硬限制ThreadLimit 20000(对于event,ThreadLimit 100000,对于mpm_winnt,15000),如果想增加超过该硬限制,则需在源文件中修改MAX_THREAD_LIMIT,并重新构建服务器。
注意:要使上述两个参数配置(ThreadLimit和ServerLimit),生效需要完全停止服务器,然后重启服务器

StartServers:     同prefork,Apache服务器启动时建立的初始服务器子进程数,由于进程数量根据负载动态控制的,所以很少需要调整该参数的值。
MinSpareThreads: 空闲服务器线程的最小数。如果当前服务器空闲线程数少于MinSpareThreads,那么Apache将创建新的子进程,直到线程数大于该数值。
MaxSpareThreads: 空闲服务器线程的最大数,如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将会杀死多余的子进程,直到空闲线程数小于该值。
ThreadsPerChild:每个子进程创建的线程数。子进程在启动时创建这些线程,且不再创建新的线程。
MaxRequestWorkers: 可同时处理的最大请求数,超过MaxRequestWorkers限制的连接将要排队,数量可达到基于ListenBacklog指令的某个数,一旦某个请求结束后,子进程变获得自由,开始处理下一个连接。针对线程服务器,比如event或wroker,该参数限制了服务器可获得的最大线程总数,默认值为ServerLimit x ThreadsPerChild。如果要增加它的值,则都必须提升ServerLimit。

测试时,可以通过查看日志文件/var/log/apache2/error.log,如果发现如下内容,就应该增大MaxClients了:
[error] server reached MaxClients setting,consider raising the MaxClients setting
MaxConnectionsPerChild:同prefork,每个服务器子进程自动终止前可处理的最大连接数(每个进程在处理了指定次数的连接,子进程将会被父进程终止,这时候子进程占用的内存就会释放),设置为0表示无限制,即不终止进程。
内存较大的服务器可以设置为0(不推荐)或较大的数字。内存较小的服务器可以设置比较小的值,以防内存溢出,还可以在服务器负载下降的时侯会自动减少子进程数。一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试

https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html

4、优化event

vim /etc/httpd/conf.modules.d/00-mpm.conf

StartServers             3

MinSpareThreads         75

MaxSpareThreads        250

ThreadsPerChild         25

MaxRequestWorkers      400

MaxConnectionsPerChild 10000  
</IfModule>

参考连接:https://httpd.apache.org/docs/2.4/en/mod/mpm_common.html

###计算event的相关参数
(1):计算服务器进程的平均内存
[root@localhost ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'

(2):计算正在通讯传输过程中的进程的平均内存,最好在一天之内不同的时间段内运行以下代码
[root@localhost ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'

通过上面两个指令计算出平均进程所使用的内存大小 ,再通过以下公式计算
MaxRequestWorkers(MaxClients) =  (Total RAM - RAM used for Linux, MySQL, etc.) / Average httpd process size.
      1、StartServers 30% of MaxRequestWorkers
      2、MinSpareThreads 5% of MaxRequestWorkers
      3、MaxSpareThreads10% of MaxRequestWorkers
      4、ServerLimit == MaxRequestWorkers
      5、MaxConnectionsPerChild 10000 (as conservative alternative to address possible problem with memory leaky apps)
###event MPM 与worker MPM区别
可以支持比worker更高的并发数,主要安装在类unix/linux上的工作模式。event mpm是worker mpm的变种,但是具有比worker MPM更好的并发性能。在event mpm模式下,ssl是不被支持的,他会被切换到worker mpm下处理。event mpm在apache2.4版本时才被从实验状态转化成标准应用。

###apache 缓存设置
apache涉及的缓存模块有mod_cache、mod_disk_cache、mod_file_cache、mod_mem_cache。如果要使用缓存必须启用这四个缓存模块。
同时修改缓存设置后,必须重启apache,刷新缓存,否则用户访问页面不是最新页面。

mod_cache、mod_disk_cache、mod_mem_cache、mod_file_cache关系
- apache缓存分为硬盘缓存和内存缓存
- mod_disk_cache mod_mem_cache 都依赖于mod_cache
- mod_file_cache是结合mod_cache使用,可以用于指定几个频繁访问,但是变化不大的文件
配置硬盘缓存和内存缓存的缓存配置
<IfModule mod_cache.c>  
   #设置缓存过期时间,默认一小时  
   CacheDefaultExpire 3600  
   #设置缓存最大失效时间,默认最大一天  
   CacheMaxExpire 86400 CacheLastModifiedFactor 0.1 CacheIgnoreHeaders Set-Cookie CacheIgnoreCacheControl Off <IfModule mod_disk_cache.c>  
   #启用缓存,并设定硬盘缓存目录(url路径)  
   CacheEnable disk /  
   #设定apache访问用户的缓存路径,需要进行授权配置,如linux设置为777  
   CacheRoot /home/apache/cache  
   #缓存目录深度  
   CacheDirLevels 5  
   #缓存目录名称字符串长度  
   CacheDirLength 5  
   #缓存文件最大值  
    CacheMaxFileSize 1048576  
   #缓存文件最小值   
   CacheMinFileSize 10 </IfModule> <IfModule mod_mem_cache.c>

#缓存路径  
   CacheEnable mem /

#缓存对象最大个数  
   MCacheMaxObjectCount 20000

#单个缓存对象最大大小  
   MCacheMaxObjectSize 1048576

#单个缓存对象最小大小   
   MCacheMinObjectSize 10

#在缓冲区最多能够放置多少的将要被缓存对象的尺寸  
   MCacheMaxStreamingBuffer 65536

#清除缓存所使用的算法,默认是 GDSF,还有一个是LRU  
   MCacheRemovalAlgorithm GDSF

#缓存数据最多能使用的内存  
   MCacheSize 131072 </IfModule> </IfModule>
###文件缓存的应用
1、缓存文件:如果你的网站有几个文件的访问非常频繁而又不经常变动,则可以在 Apache 启动的时候就把它们的内容缓存到内存中(当然要启用内存缓存系统),使用的是 mod_file_cache 模块,有多个文件可以用空格格开,具体如下:
<IfModule mod_file_cache.c>  
     MMapFile /var/html/js/jquery.js  
</IfModule>

2、缓存句柄:
<IfModule mod_file_cache.c>  
  CacheFile /usr/local/apache2/htdocs/index.html  
</IfModule>

###apache启用服务端图片压缩
对于静态的html 文件,在apache 可加载mod_deflate.so 模块,把内容压缩后输出,可节约大量的传输带宽。
打开httpd.conf文件,找到:
#LoadModule deflate_module modules/mod_deflate.so
将前面的“#”去掉,变成:

LoadModule deflate_module modules/mod_deflate.so
然后在最后一行的LoadModule处,加入如下的几行:
<IfModule mod_deflate.c>
 
DeflateCompressionLevel 7
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
AddOutputFilter DEFLATE css js
 
</IfModule>

####设定压缩率,压缩率1 -9, 6是建议值,不能太高,消耗过多的内存,影响服务器性能  
DeflateCompressionLevel 6

AddOutputFilterByType DEFLATE text/plain  
AddOutputFilterByType DEFLATE text/html  
AddOutputFilterByType DEFLATE text/php  
AddOutputFilterByType DEFLATE text/xml  
AddOutputFilterByType DEFLATE text/css  
AddOutputFilterByType DEFLATE text/javascript  
AddOutputFilterByType DEFLATE application/xhtml+xml  
AddOutputFilterByType DEFLATE application/xml  
AddOutputFilterByType DEFLATE application/rss+xml  
AddOutputFilterByType DEFLATE application/atom_xml  
AddOutputFilterByType DEFLATE application/x-javascript  
AddOutputFilterByType DEFLATE application/x-httpd-php  
AddOutputFilterByType DEFLATE application/x-httpd-fastphp  
AddOutputFilterByType DEFLATE application/x-httpd-eruby  
AddOutputFilterByType DEFLATE image/svg+xml  
AddOutputFilterByType DEFLATE application/javascript

####插入过滤器  
SetOutputFilter DEFLATE

####排除不需要压缩的文件  
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip don’t-vary  
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary  
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary  
</ifmodule>

###Apache超时与持久连接设置
在HTTP 1.0中和Apache服务器的一次连接只能发出一次HTTP请求,而KeepAlive参数支持HTTP 1.1版本的一次连接,多次传输功能,这样就可以在一次连接中发出多个HTTP请求。从而避免对于同一个客户端需要打开不同的连接。很多请求通过同一个 TCP连接来发送,可以节约网络和系统资源。
/usr/share/doc/httpd-2.4.6/httpd-default.conf
cp -r /usr/share/doc/httpd-2.4.6/httpd-default.conf /etc/httpd/conf.modules.d/

(1)keepAlive启用场景
    如果有较多的js,css,图片访问,则需要开启长链接
    如果内存较少,大量的动态页面请求,文件访问,则关闭长链接,节省内存,提高apache访问的稳定性
    如果内存充足,cpu较好,服务器性能优越,则是否开启长链接对访问性能都不会产生影响
(2)keepAlive配置
    在Apache的配置文件httpd.conf中,设置:
    1、Timeout  60                默认为60s修改为30s
    2、KeepAlive on               设置为on状态,该参数为是否保持活连接,目前网站中一个页面一般会包含多个文件,所以相应用户访问时会有多个请求,因此开启可以提高服务器性能。
    4、KeepAliveTimeout   5       默认为5s,该参数为活连接的超时时间,一般只要设置成小于Timeout即可。
    5、MaxKeepAliveRequests 100   如果设置为0表示无限制,把MaxKeepAliveRequests设置的尽量大,可以在一次连接中进行更多的HTTP请求。但在我们的测试中还发现,把 MaxKeepAliveRequests设置成1000,则评测的客户端容易出现“Send requesttimed out”的错误,所以具体数值还要根据自己的情形来设置。

###问题集锦
1、加载
LoadModule authz_core_module modules/mod_authz_core.so  
Invalid command 'Require', perhaps misspelled or defined by a module not included in the server configuration`

2、配置信息后面不能跟随注释,注释必须另起一行
CacheDefaultExpire takes one argument, The default time in seconds to cache a document

3、关键字错误 AddOutputFileByType 应该是
AddOutputFitlerByType  
Invalid command 'AddOutputFileByType', perhaps misspelled or defined by a module not included in the server configuration

4、启用
LoadModule setenvif_module modules/mod_setenvif.so  
Invalid command 'SetEnvIfNoCase', perhaps misspelled or defined by a module not included in the server configuration

5、ifModule注释不能跟在配置参数后面,否则会导致配置解析失败
AH00526: Syntax error on line 558 of /usr/local/cp-httpd-2.4.18/conf/httpd.conf:
CacheDefaultExpire takes one argument, The default time in seconds to cache a document

Linux下apache性能配置调优相关推荐

  1. (活动)MySQL DBA之路 | 性能配置调优篇

    导读 译者:田帅萌 云和恩墨东区MySQL交付,擅长MySQL优化. 原文作者:Severalnines 原文:https://severalnines.com/blog/become-mysql-d ...

  2. linux下apache+openssl配置记录

    软件环境 Apache Httpd 2.2.29 (http://httpd.apache.org ) OpenSSL 1.0.1h (http://www.openssl.org/source ) ...

  3. linux下apache+php配置

    用了一天的时间总算配置出来了,呵呵,是不是太笨了!好了 下面我就把配置步骤和需要注意的地方写下来: 首先下载apache_1.3.20.tar.gz和php-4.4.6.tar.gz(听说老版本比较稳 ...

  4. Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案

    Linux下的jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案 问题 linux的jetty下发布程序后再启动jetty服 ...

  5. linux下apache服务器的配置和管理(启动、重启、中断服务)

    2019独角兽企业重金招聘Python工程师标准>>> linux下apache服务器的配置和管理 一.两个重要目录: Apache有两个重要的目录: 1.配置目录/etc/http ...

  6. Linux下Apache虚拟主机配置

    说明: Apache版本:httpd-2.2.31 Apache安装目录:/usr/local/apache 目的: 配置Apache虚拟主机 具体操作: 1.修改Apache主配置文件 cp /us ...

  7. linux apache部署php,Linux下apache虚拟主机配置多版本php同时运行 | 系统运维

    学习本教程须掌握: 1.Linux下指定版本编译安装LAMP 2.Linux下Apache虚拟主机配置 3.CentOS 7.x编译安装Nginx1.10.3+MySQL5.7.16+PHP5.2 5 ...

  8. apache性能配置优化

    最近在进行apache性能优化设置.在修改apache配置文件之前需要备份原有的配置文件夹conf,这是网站架设的好习惯.以下的apache配置调优均是在red had的环境下进行的. httpd相关 ...

  9. weblogic java虚拟机_weblogic server 性能及调优-调优 java 虚拟机.doc

    weblogic server 性能及调优-调优 java 虚拟机.doc 还剩 8页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: Sun 已针对 W ...

最新文章

  1. redis配置文件redis.conf参数说明
  2. python安装在什么系统下最好-windows系统下Python环境的搭建
  3. mysql学习之旅-数据库自动备份-测试环境搭建
  4. UOJ#419. 【集训队作业2018】圆形(格林公式)
  5. postfilter中文什么意思_使用过滤器解决(Post/Get)中文乱码问题
  6. Atheros QCA8337交换芯片驱动开发
  7. 新广告法涉及的敏感词列表
  8. Termux-API 使用教程,很多坑,电量,设备信息
  9. bp神经网络的训练过程,一文搞定bp神经网络
  10. 服务器装系统报0x0000005d,Win8系统安装过程中提示ErrorCode:0x0000005D怎么办
  11. 如何将QQ群文件快速下载,怎么快速下载QQ中的文件,QQ群文件下载
  12. 编写jQuery插件
  13. java校园二手书交易管理系统springboot+Vue
  14. 尚硅谷_2019互联网大厂高频重点面试题(第二季)思维导图脑图笔记完整版
  15. win10+vs2017配置MPI和OpenMP
  16. 无线路由传输速率的秘密
  17. Android 集成google map,Markers ,定位,聚合
  18. vue移动端实现聊天功能
  19. 什么是 ACK (Acknowledeg character) 确认字符?
  20. win桌面软件图标显示白板【快速解决】

热门文章

  1. 子网掩码、IP地址数、掩码长度对照表
  2. 【进程】进程间通信----消息队列
  3. 在Junit调试中,出现警告: Method 'public void classname' could not be resolved.并报initializationError错误
  4. 传说中的RNN到底是何方神圣?
  5. Pinia的简单使用
  6. 11.9 leetcode打卡
  7. Codeforces Round # 555 (Div3)
  8. 汽车各部位名称及故障处理
  9. 多元线性回归分析示例
  10. Yield Guild Games 和 MOBLAND 达成合作