【问题标题】:Apache Prefork vs Worker MPMApache Prefork 与 Worker MPM
【发布时间】:2012-12-02 17:56:42
【问题描述】:

查看 Apache 配置文件,我看到定义了 Prefork 和 Worker MPM。有什么区别,Apache 使用的是哪一个?

【问题讨论】:

    标签: apache


    【解决方案1】:

    Prefork 和 worker 是 apache 提供的两种 MPM。两者各有优缺点。

    默认情况下,mpm 是线程安全的 prefork。

    Prefork MPM 使用多个子进程,每个子进程都有一个线程,每个进程一次处理一个连接。

    Worker MPM 使用多个子进程,每个子进程有很多线程。每个线程一次处理一个连接。

    更多详情您可以访问https://httpd.apache.org/docs/2.4/mpm.htmlhttps://httpd.apache.org/docs/2.4/mod/prefork.html

    【讨论】:

    • 另请参阅“如何选择要使用的 Apache MPM?” serverfault.com/a/383634
    • @arvind //每个线程一次处理一个连接//这里的连接是指单个用户还是单个请求?请解释
    【解决方案2】:

    Apache 的多处理模块 (MPM) 负责绑定到机器上的网络端口、接受请求并调度子进程来处理请求 (http://httpd.apache.org/docs/2.2/mpm.html)。

    它们与任何其他 Apache 模块一样,只是任何时候都必须将一个且只有一个 MPM 加载到服务器中。在配置过程中选择 MPM,并编译到服务器中,方法是使用参数 --with-mpm=NAME 和配置脚本,其中 NAME 是所需 MPM 的名称。

    Apache 将为每个操作系统使用默认 MPM,除非在编译时选择了不同的 MPM(例如在 Windows 上默认使用 mpm_winnt)。以下是操作系统及其默认 MPM 的列表:

    • BeOS beos
    • 网件mpm_netware
    • OS/2 mpmt_os2
    • Unix/Linux preforkupdate for Apache version ≥ 2.4: preforkworkerevent,取决于平台功能)
    • 视窗mpm_winnt

    要检查哪些模块被编译到服务器中,请使用命令行选项-lhere 是文档)。例如,在 Windows 安装中,您可能会得到如下信息:

    > httpd -l
    Compiled in modules:
      core.c
      mod_win32.c
      mpm_winnt.c
      http_core.c
      mod_so.c
    

    从 2.2 版开始,这是list of available core features and MPM modules

    • core - 始终可用的核心 Apache HTTP Server 功能
    • mpm_common - 由多个多处理模块 (MPM) 实现的指令集合
    • beos - 这个多处理模块针对 BeOS 进行了优化。
    • event - 标准工作者 MPM 的实验变体
    • mpm_netware 多处理模块实现专为 Novell NetWare 优化的线程化 Web 服务器
    • mpmt_os2 适用于 OS/2 的混合多进程、多线程 MPM
    • prefork 实现一个非线程的预分叉网络服务器
    • mpm_winnt - 这个多处理模块针对 Windows NT 进行了优化。
    • worker - 实现混合多线程多进程 Web 服务器的多处理模块

    现在,preforkworker 之间的区别。

    prefork MPM

    实现了一个非线程的、预分叉的网络服务器来处理 以类似于 Apache 1.3 的方式请求。它适用于 需要避免线程以兼容的站点 非线程安全的库。它也是隔离每个的最佳 MPM 请求,因此单个请求的问题不会影响任何 其他。

    worker MPM 实现了一个混合多进程多线程服务器并提供了更好的性能,因此除非使用包含非线程安全库的其他模块(另请参阅 this discussion 或 @987654328 @ on Serverfault)。

    【讨论】:

    • apache 2.4.7 的 ubuntu-trusty-64 的默认安装是使用事件 MPM
    【解决方案3】:

    查看this 了解更多详情。它指的是 Apache 如何处理多个请求。 Preforking 是默认设置,它启动了许多 Apache 进程(这里默认为 2 个,尽管我相信可以通过 httpd.conf 配置它)。 Worker MPM 将为每个请求启动一个新线程,我猜这会更节省内存。从历史上看,Apache 使用过 prefork,因此它是一个经过更好测试的模型。线程仅在 2.0 中添加。

    【讨论】:

    • Event MPM 怎么样?
    【解决方案4】:

    对于 CentOS 6.x 和 7.x(包括 Amazon Linux)使用:

    sudo httpd -V
    

    这将显示哪些 MPM 已配置。 prefork、worker 或事件。 Prefork 是较早的线程安全模型。 Worker 是多线程的,并且 event 支持 php-mpm,这应该是一个更好的处理线程和请求的系统。

    但是,您的结果可能会因配置而异。我在 php-mpm 中看到了很多不稳定性,并且没有任何速度改进。一个激进的蜘蛛可以很容易地耗尽 php-mpm 中的最大子进程。

    prefork、worker 或 event 的设置在 sudo nano /etc/httpd/conf.modules.d/00-mpm.conf 中设置(对于 CentOS 6.x/7.x/Apache 2.4)。

    # Select the MPM module which should be used by uncommenting exactly
    # one of the following LoadModule lines:
    
    # prefork MPM: Implements a non-threaded, pre-forking web server
    # See: http://httpd.apache.org/docs/2.4/mod/prefork.html
    #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
    
    # worker MPM: Multi-Processing Module implementing a hybrid
    # multi-threaded multi-process web server
    # See: http://httpd.apache.org/docs/2.4/mod/worker.html
    #LoadModule mpm_worker_module modules/mod_mpm_worker.so
    
    # event MPM: A variant of the worker MPM with the goal of consuming
    # threads only for connections with active processing
    # See: http://httpd.apache.org/docs/2.4/mod/event.html
    #LoadModule mpm_event_module modules/mod_mpm_event.so
    

    【讨论】:

      【解决方案5】:

      您可以通过发出以下命令来判断 Apache 使用的是 preform 还是 worker

      apache2ctl -l
      

      在结果输出中,查找提及 prefork.c 或 worker.c

      【讨论】:

      • Apache 可以使用两个 MPM 模块进行编译,因此这并不总是可靠的。如果它列出了两个 MPM 模块,请尝试 apachectl -V 并查看 Server MPM 旁边的输出。也可以查看ps aux 并查找httpdhttpd.worker
      • 就我而言,apache2ctl -l 不起作用;必须使用apachectl -l
      • 没有一个为我列出,但 apache 工作正常,Apache/2.4.7 (Ubuntu)
      • 在运行 apache 2.4.6 的 centos 7.x 中,httpd -V 将给出类似:Server MPM: worker
      【解决方案6】:

      在 RHEL7 上的 Apache 2.4 中,可以轻松地在 prefork 或 worker mpm 之间切换

      通过执行检查MPM类型

      sudo httpd -V
      
      Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
      Server built:   Jul 26 2017 04:45:44
      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)
      Server compiled with....
       -D APR_HAS_SENDFILE
       -D APR_HAS_MMAP
       -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
       -D APR_USE_SYSVSEM_SERIALIZE
       -D APR_USE_PTHREAD_SERIALIZE
       -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
       -D APR_HAS_OTHER_CHILD
       -D AP_HAVE_RELIABLE_PIPED_LOGS
       -D DYNAMIC_MODULE_LIMIT=256
       -D HTTPD_ROOT="/etc/httpd"
       -D SUEXEC_BIN="/usr/sbin/suexec"
       -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
       -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
       -D DEFAULT_ERRORLOG="logs/error_log"
       -D AP_TYPES_CONFIG_FILE="conf/mime.types"
       -D SERVER_CONFIG_FILE="conf/httpd.conf"
      

      现在更改 MPM 编辑以下文件并取消注释所需的 MPM

       /etc/httpd/conf.modules.d/00-mpm.conf 
      
      # Select the MPM module which should be used by uncommenting exactly
      # one of the following LoadModule lines:
      
      # prefork MPM: Implements a non-threaded, pre-forking web server
      # See: http://httpd.apache.org/docs/2.4/mod/prefork.html
      LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
      
      # worker MPM: Multi-Processing Module implementing a hybrid
      # multi-threaded multi-process web server
      # See: http://httpd.apache.org/docs/2.4/mod/worker.html
      #
      #LoadModule mpm_worker_module modules/mod_mpm_worker.so
      
      # event MPM: A variant of the worker MPM with the goal of consuming
      # threads only for connections with active processing
      # See: http://httpd.apache.org/docs/2.4/mod/event.html
      #
      #LoadModule mpm_event_module modules/mod_mpm_event.so
      

      【讨论】:

      • 为什么当我尝试使用 mpm_worker 或 mpm_event 时,我的页面不起作用
      【解决方案7】:

      Apache 定义了 2 种类型的 MPM(多处理模块):

      1:前叉 2:工人

      默认情况下,Apacke 配置为预分叉模式,即非线程预分叉 Web 服务器。这意味着每个 Apache 子进程都包含一个线程并一次处理一个请求。因此,它会消耗更多资源。

      Apache 还具有将 Apache 转变为多进程、多线程 Web 服务器的 worker MPM。 Worker MPM 使用多个子进程,每个子进程有很多线程。

      【讨论】:

        猜你喜欢
        • 2012-01-11
        • 2018-02-25
        • 2013-04-08
        • 2011-12-30
        • 2013-06-21
        • 2017-02-22
        • 2013-11-16
        • 2011-09-07
        • 2013-09-07
        相关资源
        最近更新 更多