1.Apache的三种模式

1.1.Apache prefork模型:

apache的默认的模型
预派 生模式,有 一个主控制进程,然后 生成多个 子进程,使 用select模型,最 大并发1024,每个 子进程有 一个独 立的线程响应 用户请求,相对 比较占 用内存,但是 比较稳定,可以设置最 大和最 小进程数,是最古 老 的 一种模式,也是最稳定的模式,适 用于访问量 不 是很 大的场景。
优点:稳定
缺点: 大量  用户访问慢,占 用资源,1024个进程不 适 用于 高并发场景

1.2.Apache woker模型:

一种多进程和多线程混合的模型,有 一个控制进程,启动多个 子进程,每个 子进程 里  面包含固定的线程,使 用线程程来处理 请求,当线程不 够使 用的时候会再启动 一个新的 子进程,然后在进程 里  面再启动线程处理 请求,由于其使 用了 线程处理 请求,因此可以承受更  高的并发。
优点:相 比prefork 占 用的内存较少,可以同时处理 更多的请求
缺点:使用keepalive的长连接方式(会话保持状态),某个线程会 一直被占据,即使没有传输数据,也需要 一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在 高并发场景下的 无服务线程可 用。(该问题在prefork模式下,同样会发 生)

1.3. Apache event模型:

比worker多了一个监听进程
Apache中最新的模式,2012年 发布的apache 2.4.X系列 正式 支持event 模型,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本 里 的已经是稳定可 用的模式。它和worker模式很像,最 大的区别在于,它解决了 keepalive场景下, 长期被占 用的线程的资源浪费问题(某些线程因为被keepalive,空挂在哪 里 等待,中间 几乎没有请求过来,甚 至等到超时)。event MPM中,会有 一个专 门的线程来管理 这些keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执 行 完毕后, 又允许它释放。这样增强了  高并发场景下的请求处理 能 力 。

优点:单线程响应多请求,占据更 少的内存, 高并发下表现更 优秀,会有 一个专 门的线程来管理 keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执 行 完毕后, 又允许它释放
缺点:没有线程安全控制

2.1 CentOS7的Apache的安装

#安装
[root@localhost ~]# rpm -q httpd
httpd-2.4.6-97.el7.centos.2.x86_64
[root@localhost ~]# ps -ef |grep httpd
root       2578      1  0 14:54 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2579   2578  0 14:54 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2580   2578  0 14:54 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2581   2578  0 14:54 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2582   2578  0 14:54 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2583   2578  0 14:54 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root       2601   2490  0 14:55 pts/0    00:00:00 grep --color=auto httpd
[root@localhost ~]# cat /proc/2579/status 
Name:	httpd
State:	S (sleeping)
Tgid:	2579
Ngid:	0
Pid:	2579
PPid:	2578
TracerPid:	0
Uid:	48	48	48	48
Gid:	48	48	48	48
FDSize:	64
Groups:	48 
VmPeak:	  224160 kB
VmSize:	  224084 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    2928 kB
VmRSS:	    2928 kB
VmData:	    1212 kB
VmStk:	     136 kB
VmExe:	     488 kB
VmLib:	    8556 kB
VmPTE:	     448 kB
VmSwap:	       0 kB
Threads:	1    #表示单进程,所以centos安装的Apache是Profork模型
SigQ:	0/3829
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000001001002
SigCgt:	00000001880046e9
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	0000001fffffffff
Seccomp:	0
Cpus_allowed:	ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:	0-127
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	1
nonvoluntary_ctxt_switches:	0
[root@localhost ~]# httpd -V
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 10 2021 14:26:31
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork  #显示profork模型
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

2.2 Ubuntu 安装的httpd

[root02:50 PMubuntu ~]#apt  update
[root03:04 PMubuntu ~]#apt install apache2 -y
[root03:05 PMubuntu ~]#systemctl start apache
[root03:07 PMubuntu ~]#apachectl -V
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2021-09-28T22:27:27
Server's Module Magic Number: 20120211:68
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event    #event 模型
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"
[root03:07 PMubuntu ~]#ps -ef |grep apache2
root       1256      1  0 14:49 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   1257   1256  0 14:49 ?        00:00:00 /usr/sbin/apache2 -k start
www-data   1258   1256  0 14:49 ?        00:00:00 /usr/sbin/apache2 -k start
root       3116   2567  0 15:07 pts/0    00:00:00 grep --color=auto apache2
[root03:09 PMubuntu ~]#cat /proc/1257/status 
Name:	apache2
Umask:	0022
State:	S (sleeping)
Tgid:	1257
Ngid:	0
Pid:	1257
PPid:	1256
TracerPid:	0
Uid:	33	33	33	33
Gid:	33	33	33	33
FDSize:	64
Groups:	33 
NStgid:	1257
NSpid:	1257
NSpgid:	1256
NSsid:	1256
VmPeak:	 1285032 kB
VmSize:	 1285008 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    4600 kB
VmRSS:	    4400 kB
RssAnon:	    1564 kB
RssFile:	    2772 kB
RssShmem:	      64 kB
VmData:	  224684 kB
VmStk:	     132 kB
VmExe:	     632 kB
VmLib:	    4300 kB
VmPTE:	     372 kB
VmSwap:	       0 kB
HugetlbPages:	       0 kB
CoreDumping:	0
Threads:	27  #一个子进程下面有多个子线程
SigQ:	0/3591
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	fffffffe3ffba207
SigIgn:	0000000001001000
SigCgt:	00000001880046eb
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	0000003fffffffff
CapAmb:	0000000000000000
NoNewPrivs:	0
Seccomp:	0
Speculation_Store_Bypass:	thread vulnerable
Cpus_allowed:	ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:	0-127
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	1
nonvoluntary_ctxt_switches:	1