apache和nginx工作模式

apache的MPM模块
不同的操作系统默认使用不同的MPM

 

Netware

mpm_netware

OS/2

mpmt_os2

Unix      

prefork,worker 或 event,取决于平台特性

Windows    

mpm_winnt

这里只讨论一下linux相关的 prefork,worker和event
要求 更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧软件兼容的站点可以使用 prefork。

prefork模块
apache会在启动的时候预先维护几个空闲或备用的进程,这些进程已经随时可以提供服务,通过这种方式
客户端不需要因为等待子进程被fork而降低用户体验
相关的调节性能参数

# prefork MPM
# StartServers: 服务开启时默认启动的工作进程数,不包括主进程
# MinSpareServers: 最小空闲进程数,如果少于设置的数量,父进程会创建新的子进程,并且产生的速度是
                   第一秒1个 第二秒2个,第三秒4个 以指数形势增长,直到每秒产生32个子进程,
                   只有满足设置的数量才会停止创建子进程
# MaxSpareServers: 最大空闲进程数,空闲的进程是不处理请求的进程,如果存在多余设置的值,父进程
                   会主动终止多余的子进程
# MaxRequestWorkers: 并发请求的最大数,一条进程最多能处理多少个请求
# MaxConnectionsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数
默认的设置

    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0

worker模块
这是一个多进程多线程的混合的模式,她也会预先fork一些子进程,然后每个子进程创建一些线程,当请求过来的时候,
会分配线程来提供服务,因为线程会更轻量所以在高并发的场景这个模式会用的比较多
相关的调节参数

# worker MPM
# StartServers: apache启动时候创建的子进程数量
# MinSpareThreads: 最小空闲线程数,如果服务
                   器中没有足够的空闲线程,则会创建子进程,直到空闲线程数量大于设定值
# MaxSpareThreads: 最大空闲线程数
# ThreadsPerChild: 该指令设置每个子进程创建的线程数
# MaxRequestWorkers: 每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定
# MaxConnectionsPerChild:一个子进程最大处理的连接数
默认的设置
   
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250 
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
       

event模块

event是基于worker的一个模块,一个父进程启动子进程,每个子进程根据ThreadsPerChild的值创建固定数量的线程,尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,他可以将keepalive的连接转移到监听的线程,如果有新的请求过来,将会转发到第一个可用的线程,这样就可以缓解由于keepalive服务器繁忙而线程耗尽的问题,注意一点,event MPM需要Linux系统(Linux 2.6+)对EPoll的支持,才能启用。还有,需要补充的是HTTPS的连接(SSL),它的运行模式仍然是类似worker的方式,线程会被一直占用,直到连接关闭。

# event MPM
# StartServers: apache启动时候创建的子进程数量
# MinSpareThreads: 最小空闲线程数,如果服务器中没有足够的
                   空闲线程,则会创建子进程,直到空闲线程数量大于设定值
# MaxSpareThreads: 最大空闲线程数
# ThreadsPerChild: 该指令设置每个子进程创建的线程数
# MaxRequestWorkers: 每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定
# MaxConnectionsPerChild:一个子进程最大处理的连接数

    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0

 

Nginx的工作原理

 

 

NGINX有一个主进程和一个或多个工作进程。如果缓存被启用,缓存加载器和缓存管理器进程也启动时运行。主进程的主要目的是读取和评估配置文件,并维护工作进程。工作进程执行请求的实际处理。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、 cache loader和cache manager均应以非特权用户身份运行。NGINX依靠依赖操作系统的机制来有效地在工作进程中分配请求。工作进程的数量由nginx.conf配置文件中的worker_processes指令定义,可以设置为固定值,也可以配置为自动调整为可用CPU核心数。

Nginx支持多种连接处理方法select,poll,epoll,kqueue,/dev/poll,eventport

 

参考:unix网络编程

你可能感兴趣的:(apache工作模式,MPM,nginx工作模式)