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