注释:2.2版本的默认工作模式是worker, 2.4版本的默认工作模式是event;
1、Apache的工作模式MPM=(perfork wroker event winnt),常用的有 perfork workerevent三种:
2、调整某种模式的所在配置文件:/usr/local/apache2.4/conf/extra/httpd-mpm.conf
注释:在2.3.13之前,MaxRequestWorkers 被称为是Maxclient;
1: 查看apache有的几种工作模式:在httpd的目录下运行./configure --help
[root@localhost_02 httpd-2.4.34]# ./configure --help
--with-mpm=MPM Choose the process model for Apache to use by
default. MPM={event|worker|prefork|winnt} This will
be statically linked as the only available MPM
unless --enable-mpms-shared is also specified.
2:查看当前apache处于那种工作模式: /usr/local/apapche2.4/bin/apache -l
[root@localhost_02 httpd-2.4.34]# /usr/local/apapche2.4/bin/apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
event.c
注释:当前处于event.c工作模式: /usr/local/apapche2.4/bin/apache -l
注释:查看apached的编译参数:/usr/local/apapche2.4/build/config.nice
注释:工作模式所在的配置文件: /usr/local/apapche2.4/conf/extra/httpd-mpm.conf
3:修改apache工作模式有两种方式:
1:通过开始编译apache时,通过./configure --with-mpm=perfork|worker|event|来指定:
./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-mpm=perork|worker|event --enable-so --enable-mods-shared=most
[root@localhost_04 httpd-2.4.37]# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-mpm=prefix --enable-so --enable-mods=most
2:通过开始编译时把三个模块都编译进去,都编译成动态文件,然后就可以在modules目录下看到perfork.so worker.so event.so三个文件,默认用的event(2.4版本);
[root@localhost_04 httpd-2.4.37]# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-included-apr --enable-so --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event
[root@localhost_04 httpd-2.4.37]# make && make install
[root@localhost_04 httpd-2.4.37]# cp /usr/local/apache2.4/bin/apachectl /etc/init.d/httpd
[root@localhost_04 httpd-2.4.37]# vim /etc/init.d/httpd
#!/bin/sh
#chkconfig:345 85 15
#description:Start and stop the Apache HTTP Server
[root@localhost_04 httpd-2.4.37]# chkconfig --add httpd
3:查看其编译参数及工作模式;
[root@localhost_04 httpd-2.4.37]# cat /usr/local/apache2.4/build/config.nice
工作模式:发现变成了动态的:mpm_event-module(shared)
[root@localhost_04 httpd-2.4.37]# /usr/local/apache2.4/bin/httpd -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.149.132. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_event_module (shared)
4:然后来查看下apache的配置文件httpd.conf,通过其来修改工作模式;
[root@localhost_04 httpd-2.4.37]# cat /usr/local/apache2.4/conf/httpd.conf |grep -B3 mpm
# Example:
# LoadModule foo_module modules/mod_foo.so
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
注释:通过如上图例发现目前使用的模式mpm_event_modules模式,如需更改,则去掉对应的"#"号,然后重启服务即可;如下;
[root@localhost_04 httpd-2.4.37]# service httpd restart
[root@localhost_04 httpd-2.4.37]# /usr/local/apache2.4/bin/httpd -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_prefork_module (shared)
注释:如上图例,此时则变成了mpm_perfork_module(shared)模式;
那三种模式有什么区别了呢; perork worker event
1:perfork mpm 多进程
这是一种很古老但是非常稳定的模式原理,非线程的,apache在刚启动的时候,就会profork的一些子进程(属主是daemon)也会保持一些备用的进程,然后等待请求进来,并且呢,每个子进程只有一个线程,也就是说只能处理一个请求,一直到这个请求被释放了;
注释:在linux系统中,httpd的父进程以root用户身份运行并绑定80端口,而apache的子进程是以一个很低权限的用户(daemon)在运行,只让它读要服务的内容有读取权限,对服务器以外的资源尽可能少的权限;
[root@localhost_04 httpd-2.4.37]# ps aux |grep httpd
root 54617 0.0 0.2 97388 2380 ? Ss 11:21 0:00 /usr/local/apache2.4/bin/httpd -k restart
daemon 54634 0.0 0.1 97388 1624 ? S 11:21 0:00 /usr/local/apache2.4/bin/httpd -k restart
daemon 54635 0.0 0.1 97388 1624 ? S 11:21 0:00 /usr/local/apache2.4/bin/httpd -k restart
daemon 54636 0.0 0.1 97388 1624 ? S 11:21 0:00 /usr/local/apache2.4/bin/httpd -k restart
daemon 54637 0.0 0.1 97388 1624 ? S 11:21 0:00 /usr/local/apache2.4/bin/httpd -k restart
daemon 54638 0.0 0.1 97388 1624 ? S 11:21 0:00 /usr/local/apache2.4/bin/httpd -k restart
root 54640 0.0 0.0 112720 968 pts/0 R+ 11:21 0:00 grep --color=auto httpd
[root@localhost_04 httpd-2.4.37]# id daemon
uid=2(daemon) gid=2(daemon) 组=2(daemon)
2:修改perfork的参数(配置文件目录:/usr/local/apache2.4/conf/extra/httpd-mpm.conf)
[root@localhost_04 extra]# vim httpd-mpm.conf
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of connections a server process serves
StartServers 5 #服务启动时子进程的数量;默认是5个;
MinSpareServers 5 #空闲时子进程的最小数量; 默认是5个;不够则自动创建新的子进程;
MaxSpareServers 10 #空闲时子进程的最大数量; 默认是10个;多了则杀死多的字进程;
MaxRequestWorkers 250 #默认150,同一时间内客户端接入最大的请求数量,超过后这等待进程释放后再接入;
MaxConnectionsPerChild 0 #每个子进程处理多少个连接后,自动销毁,0表示一直不结束;
StartServers 5 #服务启动时子进程的数量;默认是5个;
MinSpareServers 5 #空闲时子进程的最小数量; 默认是5个;不够则自动创建新的子进程;
MaxSpareServers 10 #空闲时子进程的最大数量; 默认是10个;多了则杀死多的字进程;
MaxRequestWorkers 250 #默认150,同一时间内客户端接入最大的请求数量,超过后这等待进程释放后再接入; MaxConnectionsPerChild 0 #每个子进程生命周期内最大请求数量,如果到达这个数量,子进程会结束;0表示一直不结束;
注释:在2.3.13之前,MaxRequestWorkers 被称为是Maxclient;
注释:如果需要加大MaxRequestWorkers这个参数,则需要同时增加serverlimit; 一般设置为20000;
注释:当网站负载量过大时,可以适当加大MinSpareServers和MaxSpareServers这两个参数;
perfork模式的优势:比较成熟稳定,兼容所有新老模块,并且进程之间是相互独立,同时不需要担心线程的安全问题(php_mod不支持线程安全)
perfork莫得的缺点:每一个进程占用的系统资源比较多(cpu 内存等),不擅长于处理高并发,当请求量大的时候,它会将后面的请求放进队列,一直要等到有可用的进程,才会去处理;
2:worker模式: 多线程+多进程
worker模式使用多进程和多线程的模式,服务启动时预先生出一些子进程(数量少),然后每个子进程生出一些服务线程和一个监听线程;监听线程负责监听web请求并将其传递给服务线程去处理;
注释:apache服务会维持一个空闲的服务线程池,这样可以保证客户端的请求过来时无需等待,等到及时的处理和响应;
那怎么是线程,什么是进程呢;
线程是进程的子单元,同一个父进程下的线程共享父进程的内存,线程比进程更轻量;
所有在高并发场景下的worker使用要优于perfork;
注释:那么为什么不直接使用多线程了,那岂不是很方便省事,为什么要引入多进程的概念;
保证稳定性和安全性,如果直接使用多线程来启动,那所有的线程都都在root这个父进程下,那么一旦其中一个线程挂了,会导致其它线程和父进程都挂了;
而在多进程+多线程模式下,每个进程之间是相互隔离,如果某个线程出现异常,影响的也只是一个父进程和其子进程,而不是整个服务,其它线程可以正常工作;
配置文件: /usr/local/apache2.4/conf/extra/httpd-mpm.conf
[root@localhost_04 extra]# vim httpd-mpm.conf
# worker MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of connections a server process serves
StartServers 3 #服务启动时建立的子进程数量; 默认是3;
MinSpareThreads 75 #空闲子线程的最小数量; 默认是75;
MaxSpareThreads 250 #空闲子线程的最大数量; 默认是250;
ThreadsPerChild 25
MaxRequestWorkers 400 #每个子线程处理的最大连接数;超过后则再队列内等待;
MaxConnectionsPerChild 0 #每个子线程生命周期内处理的请求数量,到达这个数量,子线程会结束,0表示不结束;
注释:在2.3.13之前,MaxRequestWorkers 被称为是Maxclient;
StartServers 3 #服务启动时建立的子进程数量; 默认是3;
MinSpareThreads 75 #空闲子线程的最小数量; 默认是75;
MaxSpareThreads 250 #空闲子线程的最大数量; 默认是250;
ThreadsPerChild 25 #每个子线程的最大连接数;
MaxRequestWorkers 400 #每个子线程处理的最大连接数;超过后则再队列内等待;
MaxConnectionsPerChild 0 #每个子线程生命周期内处理的请求数量,到达这个数量,子线程会结束,0表示不结束;
[root@localhost_04 conf]# ps aux |grep httpd
root 54703 0.0 0.1 97304 1904 ? Ss 12:41 0:00 /usr/local/apache2.4/bin/httpd -k start
root 54705 0.0 0.0 112720 972 pts/0 R+ 12:41 0:00 grep --color=auto httpd
[root@localhost_04 conf]# /usr/local/apache2.4/bin/apachectl -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_worker_module (shared)
worker模式的优势:占据更少的内存,高并发小表现的更加优秀;
worker模式的缺点:必须要考虑线程的安全问题,因为多个线程 是共享父进程的内存的,如果是keep-alive的长连接,中间没有请求,这个线程就会被挂起,会发生阻塞;需要一直等到超时后才被释放,如果过多的线程被这样占据,会导致高并发场景下无服务线程可用;(该问题在perfork模式下,也同样存在)
注释:http的keep-alive长连接方式,是为了让下一次通信的时候还可以用之前的连接,这样可以减少创建连接产生的开销,而如果保持连接了会让某个进程或线程一直处理等待状态,即使没有请求过来;
注释:由于perfork和worker在高并发下有些不足,尽管keep-alive能较少TCP连接的网络开销,但是需要和进程或者线程相互绑定到一起,即使没有请求也会等待直到超时;
3、event 多进程+多线程+epoll
这是apache的最新的工作模式,基本是很稳定了,它和worker模式很像,最大的差别在于它解决了keep-alive长连接问题(被keep-alive的线程即使没有请求,也会被挂在哪里一直到超时才结束);
在event模式中,会有一个专门的线程来管理这些keep-alive的线程,当请求过来时,将请求转发给服务线程,处理完成后,又允许它释放,这样,一个线程就可以处理多个请求了,实现了异步非阻塞;
注释:event工作模式遇到某些不兼容的模块,会自动回退到worker模式(一个线程处理一个请求),不过官方自带模块,都是支持event工作模式的;
注释:event工作模式下,服务器处理的速度非常快,能承受每秒好几万次的访问量,可以处理高负载;
event工作模式不能再安全http(https)的访问下工作;
配置文件: /usr/local/apache2.4/conf/extra/httpd-mpm.conf
[root@localhost_04 extra]# vim httpd-mpm.conf
# event MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of connections a server process serves
StartServers 3 #服务后建立的子进程数量;默认3个:
MinSpareThreads 75 #空闲时最少子线程数量;默认75个;
MaxSpareThreads 250 #空闲时最打字进程数量;默认250个;
ThreadsPerChild 25 #每个子线程的最大连接数;
MaxRequestWorkers 400 #子线程的处理请求,超过后则再队列等待;
MaxConnectionsPerChild 0 #每个子线程处理最多连接请求,超过这个值后,子线程结束,0表示不结束;
StartServers 3 #服务后建立的子进程数量;默认3个:
MinSpareThreads 75 #空闲时最少子线程数量;默认75个;
MaxSpareThreads 250 #空闲时最打字进程数量;默认250个;
ThreadsPerChild 25 #每个子线程的最大连接数;
MaxRequestWorkers 400 #子线程的处理请求,超过后则再队列等待;
MaxConnectionsPerChild 0 #每个子线程处理最多连接请求,超过这个值后,子线程结束,0表示不结束;
[root@localhost_04 conf]# ps aux |grep httpd
root 54818 0.0 0.1 97320 1912 ? Ss 12:58 0:00 /usr/local/apache2.4/bin/httpd -k start
root 54820 0.0 0.0 112720 968 pts/0 S+ 12:58 0:00 grep --color=auto httpd
[root@localhost_04 conf]# /usr/local/apache2.4/bin/apachectl -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_event_module (shared)
流程图如下;
那么如何查询当前是那种工作模式:如下两种方法;
如果是静态编译工作模式的一种;如下命令;会显示 perfork.c | worker.c |event.c
[root@localhost_04 conf]# /usr/local/apache2.4/bin/apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
如果是动态编译三种工作模式;如下命令;
[root@localhost_04 conf]# /usr/local/apache2.4/bin/apachectl -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_event_module (shared)
authn_file_module (shared)
authn_core_module (shared)