diff --git a/02.企业服务/04.Apache.md b/02.企业服务/04.Apache.md index 4d8a17d..89b3165 100644 --- a/02.企业服务/04.Apache.md +++ b/02.企业服务/04.Apache.md @@ -235,14 +235,6 @@ LoadModule access_compat_module modules/mod_access_compat.so ``` -## 2.7 案例分析1 - -修改默认网址目录为:`/data/www/html` - -## 2.8 案例分析2 - -修改 ServerName 为:`test.mysite.com`;修改 Listen 为:`8090` - # 3. 持久连接 @@ -256,6 +248,9 @@ Persistent Connection:连接建立,每个资源获取完成后不会断开 开启/关闭 Keepalive 进行测试验证 - 观察客户端TCP连接是否复用? + - **开启 KeepAlive**:多个请求共享同一个 TCP 连接。 + - **关闭 KeepAlive**:每个请求都要重新建立和关闭 TCP 连接。 + - [扩展] 使用压测工具进行测试观察响应延时? ```shell @@ -273,6 +268,14 @@ TIME-WAIT 0 0 [::ffff:127.0.0.1]:80 [::ffff:127.0.0.1]:33330 ``` +- 使用ab进行压力测试,在虚拟机环境中效果不明显 + +```bash +[root@localhost ~]# ab -c 1000 -n 10000 http://127.0.0.1/ +# -c 即concurrency,用于指定的并发数 +# -n 即requests,用于指定压力测试总共的执行次数 +``` + # 4. 虚拟主机 Httpd 支持在一台物理主机上实现多个网站,即多虚拟主机 @@ -1307,27 +1310,164 @@ httpd 支持三种 MPM 工作模式:prefork, worker, event LoadModule mpm_event_module modules/mod_mpm_event.so ``` -## 13.1 prefork 模式 +## 13.1 prefork模式 -Prefork MPM,这种模式采用的是预派生子进程方式,用单独的子进程来处理请求,子进程间互相独立,互不影响,大大的提高了稳定性,但每个进程都会占用内存,所以消耗系统资源过高。 +![img](04.Apache/ufMfjKXkNnF9j3YI.png!thumbnail) -![img](04.Apache/prefork模式.png) +默认的工作模式是Prefork MPM,这种模式采用的是预派生子进程方式,用单独的子进程来处理请求,子进程间互相独立,互不影响,大大的提高了稳定性,但每个进程都会占用内存,所以消耗系统资源过高。 -## 13.2 worker 模式 +Prefork MPM 工作原理:控制进程Master首先会生成“StartServers”个进程,“StartServers”可以在Apache主配置文件里配置,然后为了满足“MinSpareServers”设置的最小空闲进程个数,会建立一个空闲进程,等待一秒钟,继续创建两个空闲进程,再等待一秒钟,继续创建四个空闲进程,以此类推,会不断的递归增长创建进程,最大同时创建32个空闲进程,直到满足“MinSpareServers”设置的空闲进程个数为止。Apache的预派生模式不必在请求到来的时候创建进程,这样会减小系统开销以增加性能,不过Prefork MPM是基于多进程的模式工作的,每个进程都会占用内存,这样资源消耗也较高。 -Worker MPM 是Apche 2.0 版本中全新的支持多进程多线程混合模型的 MPM,由于使用线程来处理 HTTP 请求,所以效率非常高,而对系统的开销也相对较低,Worker MPM 也是基于多进程的,但是每个进程会生成多个线程,由线程来处理请求,这样可以保证多线程可以获得进程的稳定性。 +* 将apache切换到prefork的模式下,可以通过`httpd -V`来查看 -![img](04.Apache/worker工作模式.png) +```shell +[root@localhost ~]# httpd -V +Server version: Apache/2.4.6 (CentOS) +Server built:   Nov 16 2020 16:18:20 +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 +  threaded:     no +    forked:     yes (variable process count) +``` -## 13.3 event 模式 +* 通过调整配置文件,可以修改prefork的参数 -这个是 Apache 中最新的模式,在现在版本里的已经是稳定可用的模式。它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)。 +```shell +[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf +StartServers 5              #开始访问进程 +MinSpareServers 5           #最小空闲进程 +MaxSpareServers 10           #无人访问时,留下空闲的进程 +ServerLimit 256               #最多进程数,最大值 20000 +MaxRequestWorkers 256         #最大的并发连接数,默认256 +MaxConnectionsPerChild 4000    +#子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放) +MaxRequestsPerChild 4000 +#从 httpd.2.3.9开始被MaxConnectionsPerChild代替 +[root@localhost ~]# systemctl restart httpd +``` -event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理多个请求,实现了异步非阻塞。 +* 查看进程数 -event MPM 在遇到某些不兼容的模块时会失效,将会回退到 worker 模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。 +```shell +[root@localhost ~]# pstree -p 7606 +httpd(7606)─┬─httpd(7607) +            ├─httpd(7608) +            ├─httpd(7609) +            ├─httpd(7610) +            └─httpd(7611) +``` -![img](04.Apache/event工作模式.png) +* 修改prefork参数 + +```shell +[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf +StartServers 10 +MaxSpareServers 15 +MinSpareServers 10 +MaxRequestWorkers 256 +MaxRequestsPerChild 4000 +[root@localhost ~]# systemctl restart httpd +``` + +* 查看是否生效 + +```shell +[root@localhost ~]# pstree -p 7628 +httpd(7628)─┬─httpd(7629) +            ├─httpd(7630) +            ├─httpd(7631) +            ├─httpd(7632) +            ├─httpd(7633) +            ├─httpd(7634) +            ├─httpd(7635) +            ├─httpd(7636) +            ├─httpd(7637) +            └─httpd(7638) +``` + +* 使用ab进行压力测试 + +```shell +[root@localhost ~]# ab -c 1000 -n 1000000 http://127.0.0.1/ +# -c 即concurrency,用于指定的并发数 +# -n 即requests,用于指定压力测试总共的执行次数 +``` + +* 测试过程中,可以看到最大进程数 + +```shell +[root@localhost ~]# ps aux |grep httpd |wc -l +258 +``` + +* 结束ab的压力测试,等待一段时间,可以看到进程数慢慢减少 + +```shell +[root@localhost ~]# ps aux |grep httpd |wc -l +12 +``` + +## 13.2 worker模式 + +![img](04.Apache/gDX7shgp3adFozBR.png!thumbnail) + +Worker MPM是Apche 2.0版本中全新的支持多进程多线程混合模型的MPM,由于使用线程来处理HTTP请求,所以效率非常高,而对系统的开销也相对较低,Worker MPM也是基于多进程的,但是每个进程会生成多个线程,由线程来处理请求,这样可以保证多线程可以获得进程的稳定性; + +Worker MPM工作原理: 控制进程Master在最初会建立“StartServers”个进程,然后每个进程会创建“ThreadPerChild”个线程,多线程共享该进程内的资源,同时每个线程独立的处理HTTP请求,为了不在请求到来的时候创建线程,Worker MPM也可以设置最大最小空闲线程,Worker MPM模式下同时处理的请求=ThreadPerChild*进程数,也就是MaxClients,如果服务负载较高,当前进程数不满足需求,Master控制进程会fork新的进程,最大进程数不能超过ServerLimit数,如果需要,可以调整这些对应的参数,比如,如果要调整StartServers的数量,则也要调整 ServerLimit的值 + +* 修改mpm文件为官方提供的默认数值,然后切换模式到worker模式 + +```shell +[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf +ServerLimit 16 +StartServers 2 +MaxRequestWorkers 150 +MinSpareThreads 25 +MaxSpareThreads 75 +ThreadsPerChild 25 +[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf |grep mpm +#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so +LoadModule mpm_worker_module modules/mod_mpm_worker.so +#LoadModule mpm_event_module modules/mod_mpm_event.so +[root@localhost ~]# systemctl restart httpd +[root@localhost ~]# httpd -V +Server version: Apache/2.4.6 (CentOS) +Server built:   Nov 16 2020 16:18:20 +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:     worker +  threaded:     yes (fixed thread count) +    forked:     yes (variable process count) +``` + +* 查看压力测试前后的进程数,查看线程数 + +```shell +[root@localhost ~]# ps aux |grep httpd |wc -l +5 +[root@localhost ~]# pstree -p 8615 | wc -l +53 +[root@localhost ~]# ab -c 1000 -n 1000000 http://127.0.0.1/ +[root@localhost ~]# ps aux |grep httpd |wc -l +9 +[root@localhost ~]# pstree -p 8393 | wc -l +157 +``` + +## 13.3 event模式 + +![img](04.Apache/1SeoH3T4vBKGbIn6.png!thumbnail) + +这个是 Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)。 + +event MPM中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。 + +event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。 # 14. LAMP架构 diff --git a/02.企业服务/04.Apache/1SeoH3T4vBKGbIn6.png!thumbnail b/02.企业服务/04.Apache/1SeoH3T4vBKGbIn6.png!thumbnail new file mode 100644 index 0000000..b70b836 Binary files /dev/null and b/02.企业服务/04.Apache/1SeoH3T4vBKGbIn6.png!thumbnail differ diff --git a/02.企业服务/04.Apache/gDX7shgp3adFozBR.png!thumbnail b/02.企业服务/04.Apache/gDX7shgp3adFozBR.png!thumbnail new file mode 100644 index 0000000..495e6b2 Binary files /dev/null and b/02.企业服务/04.Apache/gDX7shgp3adFozBR.png!thumbnail differ diff --git a/02.企业服务/04.Apache/ufMfjKXkNnF9j3YI.png!thumbnail b/02.企业服务/04.Apache/ufMfjKXkNnF9j3YI.png!thumbnail new file mode 100644 index 0000000..d417fa1 Binary files /dev/null and b/02.企业服务/04.Apache/ufMfjKXkNnF9j3YI.png!thumbnail differ