三种工作模式
-
prefork:多进程I/O模型,每个进程响应一个请求。主进程,生成和回收多个子进程,创建套接字,不响应请求。子进程,工作work进程,每个子进程处理一个请求,系统初始时,预先生成多个空闲进程,等待请求。
Prefork MPM:预派生模式,有一个主控进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存 ,但比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定,适用于访问量不是很大的场景。
优点:稳定
缺点:慢,占用资源,不适用于高并发场景
-
worker:复用多进程I/O模型,多进程多线程,IIS使用此模型。一个主进程,生成多个子进程,每个子进程负责生成若干个线程,每个线程响应一个请求,并发响应请求。
worker PMP : 是一种多进程和多线程混合的模型,一个主控进程,启动多个子进程,每个子进程包含固定的线程,使用线程来处理请求,当线程不够用时会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于使用了线程处理请求,因此可以承受高并发。
优点:相比prefork 占用的内存较少,可以同时处理更多请求。
缺点:使用keep-alive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才被释放。如果过多的线程,被占据,也会导致在高并发场景下的无服务线程可用。prefork同样也会。
-
event:事件驱动模型(worker型的升级版)。一个主进程生成m个子进程,每个子进程生成n个线程,每个线程响应一个请求,并发响应m*m个请求。有专门的监控线程来管理这些keep-alive类型的线程,当真实有请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。
uevent MPM:属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理 keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许 它释放 缺点:没有线程安全控制
#!/bin/bash #安装相关包 yum -y install wget gcc make pcre-devel openssl-devel expat-devel # 下载源代码并解压缩 wget -P /usr/local/src/ https://mirror.bit.edu.cn/apache//apr/apr-1.7.0.tar.gz wget -P /usr/local/src/ https://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz wget -P /usr/local/src/ https://mirrors.bfsu.edu.cn/apache//httpd/httpd-2.4.46.tar.gz cd /usr/local/src/ tar xf apr-1.7.0.tar.gz tar xf apr-util-1.6.1.tar.gz tar xf httpd-2.4.46.tar.gz # 将apr和apr-util源码与httpd源码合并,三者共同编译安装 mv apr-1.7.0 httpd-2.4.46/srclib/apr mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util cd httpd-2.4.46/ ./configure --prefix=/apps/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-included-apr --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork make && make install # 创建apache账户 useradd -r -s /sbin/nologin apache # 修改配置文件 sed -i 's/^User.*/User apache/' /apps/httpd/conf/httpd.conf sed -i 's/^Group.*/Group apache/' /apps/httpd/conf/httpd.conf # 配置环境变量 echo 'PATH="/apps/httpd/bin:$PATH"' > /etc/profile.d/httpd.sh . /etc/profile.d/httpd.sh # 配置man帮助 echo 'MANDATORY_MANPATH /apps/httpd/man' >> /etc/man_db.conf # 创建service unit文件,设置开机启动 cat > /lib/systemd/system/httpd.service << EOF [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=forking ExecStart=/apps/httpd/bin/apachectl start ExecReload=/apps/httpd/bin/apachectl graceful ExecStop=/apps/httpd/bin/apachectl stop # We want systemd to give httpd some time to finish gracefully, but still want # it to kill httpd after TimeoutStopSec if something went wrong during the # graceful stop. Normally, Systemd sends SIGTERM signal right after the # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give # httpd time to finish. KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now httpd.service
!/bin/bash WP="wordpress-5.4.2-zh_CN.zip" COLOR="echo -e 33[01;31m" END='