Apache工作模式介绍

  • Apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件

  • 其工作模式有许多种,源码包安装httpd时可查看httpd-mpm.conf文件,该文件位于extra/conf目录中

目前主要有三种模式:

  • event模式

  • prefork模式

  • worker模式

event工作模式介绍

  • event是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线
    程资源被浪费的问题

  • event工作模式在遇到某些不兼容的模块时,会失效,将会回退到worker模式

  • event工作模式需要Linux系统(Linux 2.6+)对epoll的支持,才能启用。需要补充的是HTTPS的连接(SSL)

event 工作方式

  • 在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程

  • 当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放

  • 这样,一个线程就能处理几个请求了,实现了异步非阻塞。这增强了在高并发场景下的请求处理

event参数讲解

在httpd-mpm.conf配置文件中,以下是event模块的定义:


StartServers              3
MinSpareThreads              75
MaxSpareThreads             250
ThreadsPerChild              25
MaxRequestWorkers           400
MaxConnectionsPerChild       0
参数 说明
StartServers 服务启动时初始的进程数,默认3
MinSpareThreads 最小的空闲子进程数,默认75
MaxSpareThreads 最大的空闲子进程数,默认250
ThreadsPerChild 每个子进程产生的线程数量,默认是25
MaxRequestWorkers 限定同一时间内客户端最大接入的请求数量,默认是400
MaxConnectionsPerChild 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露

prefork工作模式介绍

  • prefork是一般个多路处理模块(MPM),实现了一个进程型的、预派生的web服务器,适合于没有线程安全库、需要避免线程兼容性问题的系统

  • 在要求每个请求相互独立的情况下具有很好的特性,若一个请求出现问题不会影响到其他请求

  • 具有很强的自我调节能力,只需要很少的配置指令进行调整就可以适合于企业应用要求

  • 最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰同时又不能太大,以避免所需的内存超出物理内存的大小

prefork工作模方式

  • 一个单独的控制进程(父进程)负责产生子进程,子进程用于监听请求并作出应答,因此在内存中会一直存在一些备用的(spare)或是空闲的子进程用于响应新的请求,可加快响应速度

  • 父进程通常以root身份运行,以便绑定80端口,子进程通常以一个低特权的用户运行,可通过配置项的User和Group配置

  • 运行子进程的用户必须要对网站内容有读取权限,但是对其他资源必须拥有尽可能少的权限,以保证系统安全

  • 编译安装时没有指定工作模式,默认会使用prefork模式,可用httpd -l查看

prefork参数讲解

在httpd-mpm.conf配置文件中,以下是prefork模块的定义


StartServers              20
MinSpareServers          10
MaxSpareServers         50
MaxClients              150
MaxRequestsPerChild  0
参数 说明
ServerLimit 最大进程数
StartServers 启动的时候创建的进程数量
MinSpareServers 最少空闲进程
MaxSpareServers 最多空闲进程
MaxClients 最多创建多少个子进程用来处理请求
MaxRequestsPerChild 每个进程处理的最大请求数,达到请求数,进程即被销毁,如果设置为0,子进程永远不会结束

worker工作模式介绍

  • worker也是多路处理模块(MPM),使网络服务器支持混合的多线程多进程

  • 由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM

  • 但是也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性

  • 控制该MPM的最重要的指令是:控制每个子进程允许建立的线程数ThreadsPerChild指令和控制允许建立的总线程数的MaxClients指令

worker工作方式

  • 每个进程能够拥有的线程数量是固定的,服务器会根据负载情况增加或减少进程数量

  • 一个单独的控制进程(父进程)负责子进程的建立。每个子进程能够建立ThreadsPerChild数量的服务线程和一个监听线程,监听线程监听接入请求并将其传递给服务线程处理和应答

  • Apache总是会维持一个备用(spare)或是空闲的服务线程池, 客户端无须等待新线程或新进程的建立即可得到服务

  • 父进程一般都是以root身份启动,以绑定80端口,随后,Apache以较低权限的用户建立子进程和线程

  • User和Group指令用于配置Apache子进程的运行用户。子进程要对网页内容拥有读权限,但应该尽可能限制权限

worker参数讲解

在httpd-mpm.conf配置文件中,以下是worker模块的定义


ServerLimit             40
ThreadLimit             200
StartServers              20
MaxClients             1000
MinSpareThreads        25
MaxSpareThreads       100
ThreadsPerChild       200
MaxRequestsPerChild   1000
参数 说明
ServerLimit 最大进程数,默认值是"16"
ThreadLimit 每个子进程的最大线程数,默认值是“64”
StartServers 服务器启动时建立的子进程数,默认值是"3"
MaxClients 允许同时接受的最大接入请求数量(最大线程数量)
MinSpareThreads 最小空闲线程数,默认值是"75"
MaxSpareThreads 设置最大空闲线程数。默认值是"250"
ThreadsPerChild 每个子进程建立的常驻的执行线程数。默认值是25
MaxRequestsPerChild 设置每个子进程在其生存期内允许伺服的最大请求数量。 设置为"0",子进程将永远不会结束

Apache目录属性

参数 作用
Options 设置在特定目录使用哪些特性
AllowOverride 允许存在于.htaccess文件中的指令类型
Require 设置目录的访问控制
Indexes 当用户访问该目录时,但没有指定要访问哪个文件,而且目录下不存在默认网页时,返回目录中的文件和子目录列表
MultiViews 内容协商的多重视图,Apache的一 个智能特性。当访问目录中不存在的对象时
ExecCGl 允许在该目录下执行CGI脚本
FollowSymLinks 在该目录下允许文件系统使用符号连接
Includes 允许服务器端包含功能
IncludesNoExec 允许服务器端包含功能,但禁止执行CGI脚本
All 包含除了MultiViews之外所有特性,如果没有Options语句,默认为All

手工编译安装Apache服务:

(1)安装DNS服务的软件包bind。

[root@localhost ~]# yum install bind -y
......//省略安装过程
[root@localhost ~]#

(2)对DNS服务的主配置文件进行修改。

[root@localhost ~]# vim /etc/named.conf

options {
        listen-on port 53 { any; };                   //127.0.0.1改为any
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };               //localhost改为any

(3)对DNS服务的区域配置文件进行修改。

[root@localhost ~]# vim /etc/named.rfc1912.zones

zone "abc.com" IN {                                 //添加一个域名信息
        type master;
        file "abc.com.zone";
        allow-update { none; };
};

(4)查看一下IP地址。

[root@localhost named]# ifconfig 
ens33: flags=4163  mtu 1500
        inet 192.168.52.133  netmask 255.255.255.0  broadcast 192.168.52.255
        inet6 fe80::3e1d:31ba:f66a:6f80  prefixlen 64  scopeid 0x20
        ether 00:0c:29:27:1c:3f  txqueuelen 1000  (Ethernet)
        RX packets 14532  bytes 20210558 (19.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6054  bytes 399142 (389.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(5)保留权限复制一份DNS服务的区域数据配置文件,进行修改。

[root@localhost ~]# cd /var/named/          //切换目录
[root@localhost named]# ls                        //查看
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@localhost named]# cp -p named.localhost abc.com.zone    //复制
[root@localhost named]# vim abc.com.zone 

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
www IN  A       192.168.52.133             //添加IPv4的域名解析

(6)开启named服务。

[root@localhost named]# systemctl start named      //开启服务
[root@localhost named]# systemctl stop firewalld.service      //关闭防火墙
[root@localhost named]# setenforce 0         //关闭增强性安全功能
[root@localhost named]# 

(7)在宿主机将我们所需的工具包共享出去。

Apache服务的工作模式_第1张图片

(8)通过Samba服务将工具包挂载到Linux系统。

[root@localhost ~]# smbclient -L //192.168.100.50/   //查看共享
Enter SAMBA\root's password:      //匿名共享,没有密码,直接回车
OS=[Windows 10 Enterprise LTSC 2019 17763] Server=[Windows 10 Enterprise LTSC 2019 6.3]

    Sharename       Type      Comment
    ---------       ----      -------
    IPC$            IPC       远程 IPC
    share           Disk      
    tools           Disk      
    Users           Disk      
Connection to 192.168.100.50 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
NetBIOS over TCP disabled -- no workgroup available
[root@localhost ~]# mkdir /mnt/tools    //创建挂载目录
[root@localhost ~]# mount.cifs //192.168.100.50/tools /mnt/tools/     //挂载
Password for root@//192.168.100.50/tools:  
[root@localhost ~]# cd /mnt/tools/    //进入挂载目录
[root@localhost tools]# ls     //查看
awstats-7.6.tar.gz                extundelete-0.2.4.tar.bz2  forbid.png                 jdk-8u191-windows-x64.zip  LAMP-C7
cronolog-1.6.2-14.el7.x86_64.rpm  fiddler.exe                intellijideahahau2018.rar  john-1.8.0.tar.gz          picture.jpg
[root@localhost tools]# 

(9)将源码编译安装Apache服务的压缩包解压到“/opt/”目录。

[root@localhost tools]# cd LAMP-C7/       //切换目录
[root@localhost LAMP-C7]# ls
apr-1.6.2.tar.gz       Discuz_X2.5_SC_UTF8.zip  LAMP-php5.6.txt      php-5.6.11.tar.bz2
apr-util-1.6.0.tar.gz  httpd-2.4.29.tar.bz2     mysql-5.6.26.tar.gz
[root@localhost LAMP-C7]# tar jxvf httpd-2.4.29.tar.bz2 -C /opt/     //解压
......//省略解压详情
[root@localhost LAMP-C7]# tar zxvf apr-1.6.2.tar.gz -C /opt/           //解压
......//省略解压详情
[root@localhost LAMP-C7]# tar zxvf apr-util-1.6.0.tar.gz -C /opt/     //解压
......//省略解压详情

(10)进入“/opt/”目录,将两个apr包移动到“httpd-2.4.29/srclib/”目录,并重命名。

[root@localhost LAMP-C7]# cd /opt/    
[root@localhost opt]# ls
apr-1.6.2  apr-util-1.6.0  httpd-2.4.29  rh
[root@localhost opt]# mv apr-1.6.2/ httpd-2.4.29/srclib/apr
[root@localhost opt]# mv apr-util-1.6.0/ httpd-2.4.29/srclib/apr-util

(11)进入“httpd-2.4.29/”目录,然后安装编译所需环境包。

[root@localhost opt]# ls
httpd-2.4.29  rh
[root@localhost opt]# cd httpd-2.4.29/
[root@localhost httpd-2.4.29]# ls
ABOUT_APACHE     ap.d          CHANGES         docs         httpd.spec      libhttpd.dep  Makefile.win   README            srclib
acinclude.m4     build         CMakeLists.txt  emacs-style  include         libhttpd.dsp  modules        README.cmake      support
Apache-apr2.dsw  BuildAll.dsp  config.layout   httpd.dep    INSTALL         libhttpd.mak  NOTICE         README.platforms  test
Apache.dsw       BuildBin.dsp  configure       httpd.dsp    InstallBin.dsp  LICENSE       NWGNUmakefile  ROADMAP           VERSIONING
apache_probes.d  buildconf     configure.in    httpd.mak    LAYOUT          Makefile.in   os             server
[root@localhost httpd-2.4.29]# 
[root@localhost httpd-2.4.29]# yum -y install \
> gcc \
> gcc-c++ \
> make \
> pcre \
> pcre-devel \
> expat-devel \
> zlib-devel \
> perl
......//省略安装过程

(12)进行对Apache服务器的配置。

[root@localhost httpd-2.4.29]# ./configure \
> --prefix=/usr/local/httpd \    //安装路径
> --enable-so \     //启用动态加载模块支持
> --enable-rewrite \     //启用网页地址重写功能
> --enable-charset-lite \    //启用字符集支持
> --enable-cgi    //启用CGI脚本程序支持

(13)编译安装Apache服务。

[root@localhost httpd-2.4.29]# make && make install
......//省略编译安装过程
[root@localhost httpd-2.4.29]#

(14)对Apache服务配置文件进行修改

[root@localhost httpd-2.4.29]# ln -s /usr/local/httpd/conf/httpd.conf /etc/httpd.conf     //创建软链接,方便使用
[root@localhost httpd-2.4.29]# 

Listen 192.168.50.133:80    //开启IPv4监听
#Listen 80      //注释IPv6监听
#
ServerName www.abc.com:80      //设置域名

Apache工作模式实验

(1)开启工作模式的子配置文件。

[root@localhost httpd-2.4.29]#  vim /etc/httpd.conf

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf              //删除“#”

(2)查看当前的工作模式,为event模式(默认)。

[root@localhost httpd-2.4.29]# httpd -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c
[root@localhost httpd-2.4.29]#

(3)查看当前工作模式,开启的进程数。

[root@localhost httpd-2.4.29]# service httpd stop     //关闭服务
[root@localhost httpd-2.4.29]# service httpd start     //开启服务
[root@localhost httpd-2.4.29]# lsof -i :80    //查看端口进程
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   91399   root    3u  IPv4 266957      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   91401 daemon    3u  IPv4 266957      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   91402 daemon    3u  IPv4 266957      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   91403 daemon    3u  IPv4 266957      0t0  TCP localhost.localdomain:http (LISTEN)
[root@localhost httpd-2.4.29]#

(4)修改一下event工作模式的配置,将StartServers从“3”改为“5”,对其它各项进行相应优化。

[root@localhost httpd-2.4.29]# cd /usr/local/httpd/conf/extra/
[root@localhost extra]# ls
httpd-autoindex.conf  httpd-default.conf  httpd-languages.conf  httpd-mpm.conf                 httpd-ssl.conf      httpd-vhosts.conf
httpd-dav.conf        httpd-info.conf     httpd-manual.conf     httpd-multilang-errordoc.conf  httpd-userdir.conf  proxy-html.conf
[root@localhost extra]# vim httpd-mpm.conf 


    StartServers             5
    MinSpareThreads         150
    MaxSpareThreads        400
    ThreadsPerChild         30
    MaxRequestWorkers      390
    MaxConnectionsPerChild   0

(5)重启服务,再次查看端口进程数,子进程从3个,变成5个了。

[root@localhost extra]# service httpd stop 
[root@localhost extra]# service httpd start 
[root@localhost extra]# lsof -i :80
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   92896   root    3u  IPv4 270648      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   92898 daemon    3u  IPv4 270648      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   92899 daemon    3u  IPv4 270648      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   92900 daemon    3u  IPv4 270648      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   92901 daemon    3u  IPv4 270648      0t0  TCP localhost.localdomain:http (LISTEN)
httpd   92902 daemon    3u  IPv4 270648      0t0  TCP localhost.localdomain:http (LISTEN)
[root@localhost extra]#