apache中MPM 模块介绍

前言,需要了解进程和线程(底层实现原理)

进程(Process)是指正在运行的一个程序实例。

它是操作系统分配资源的基本单位,包括内存空间、文件句柄、设备状态等。每个进程都有独立的内存空间,相互之间不会直接访问对方的内存。进程之间通过进程间通信(IPC)来交换数据和通信。

线程(Thread)是进程内的执行单元。

一个进程可以包含多个线程,共享进程的资源。线程与进程共享相同的内存空间,可以直接访问进程内的全局变量和堆内存。线程之间可以通过共享内存来交换数据,而不需要像进程间通信那样显式地进行数据传输。

区别:

资源占用:进程拥有独立的内存空间和资源,而线程共享进程的资源。
调度和切换:进程切换需要保存和恢复整个进程的上下文,开销较大,而线程切换只需要保存和恢复线程的上下文,开销较小。
并发性:多个进程可以并发执行,每个进程都有自己的执行状态和堆栈,互不干扰。线程是进程内的执行单元,多个线程共享相同的进程资源,可以同时执行。

联系:

线程是进程的一部分,线程必须依托于进程的存在。
进程和线程都能够实现并发执行,提高系统资源利用率。
进程间通信和线程间通信都是为了实现数据共享和协作。

总结:

进程是资源分配和调度的基本单位,线程是执行和调度的基本单位。进程是独立的实体,拥有自己的资源,线程是进程内的执行单元,共享进程的资源。线程可以提高程序的并发性和响应性,但需要注意线程之间的同步和互斥问题。

MPM(Multi-Processing Module)

是指在 Apache HTTP Server 中用于处理并发连接和请求的模块。Apache HTTP Server 是一个常用的开源 Web 服务器软件,它采用模块化架构,其中 MPM 是其中一个核心模块。下面是3种MPM的详细介绍

Prefork MPM:

这是默认的 MPM 模式,它使用多个独立的进程来处理客户端请求。每个进程都会预先创建一个子进程池,并从中选取一个子进程来处理每个请求。这种模式比较适合于处理低负载的静态网站,因为每个进程都会占用一定的内存和资源。每个请求都由独立的进程处理,适用于多进程模型,每个进程只处理一个连接,相对稳定但资源占用较高。

Worker MPM:

这种 MPM 模式使用多个并发线程来处理客户端请求。与 Prefork MPM 模式不同的是,Worker MPM 模式中的每个进程会创建多个线程来处理请求。这种模式比 Prefork 更加适合于高负载的动态网站,因为线程可以更快地处理请求,并且对系统资源的利用更加高效。每个请求都由独立的线程处理,适用于多线程模型,多个线程可以共享同一进程的资源,性能较高但稳定性相对较差。

Event MPM:

这种 MPM 模式是基于 Worker MPM 的改进版本,它引入了一种事件驱动的架构来提高性能和稳定性。Event MPM 模式中,每个线程不再阻塞等待请求,而是通过监听套接字来等待请求。当有请求到来时,线程会立即处理请求,并将结果返回给客户端。这种模式也适合于高流量的动态网站。基于 Worker MPM,使用异步 I/O 模型来处理连接和请求,提高并发性能和资源利用率。

除了上述几种 MPM 模式外,Apache HTTP 服务器还支持其他一些 MPM 模式,例如 Worker MPM 的多监听器版本、WinNT MPM(用于 Windows 系统)等等。选择合适的 MPM 模式需要考虑很多因素,如应用程序的负载情况、硬件环境和操作系统的特性等等。

查看自己服务器用的是哪一种mpm

下面是代码加图片解释怎么查看
注意下面加()的是我的注释是

(首先查看apache服务器状态)
[root@iZrj98mzg10cz2147bly2wZ ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-06-14 09:17:59 CST; 1h 41min ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1458 (httpd) (找到这个pid)
   Status: "Total requests: 4627; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1458 /usr/sbin/httpd -DFOREGROUND
           ├─2223 /usr/sbin/httpd -DFOREGROUND
           ├─2241 /usr/sbin/httpd -DFOREGROUND
           ├─2267 /usr/sbin/httpd -DFOREGROUND
           ├─2269 /usr/sbin/httpd -DFOREGROUND
           ├─2279 /usr/sbin/httpd -DFOREGROUND
           ├─2283 /usr/sbin/httpd -DFOREGROUND
           ├─2307 /usr/sbin/httpd -DFOREGROUND
           ├─2310 /usr/sbin/httpd -DFOREGROUND
           ├─2311 /usr/sbin/httpd -DFOREGROUND
           └─2314 /usr/sbin/httpd -DFOREGROUND

Jun 14 09:17:59 iZrj98mzg10cz2147bly2wZ systemd[1]: Starting The Apache HTTP Server...
Jun 14 09:17:59 iZrj98mzg10cz2147bly2wZ systemd[1]: Started The Apache HTTP Server.
[root@iZrj98mzg10cz2147bly2wZ ~]# cat /proc/1458/cmdline (将这里的pid替换上去)
/usr/sbin/httpd-DFOREGROUND[root@iZrj98mzg10cz2147bly2wZ ~]# httpd -V (查看apache的版本号)
Server version: Apache/2.4.6 (CentOS)
Server built:   Mar 24 2022 14:57:57
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 (这个就是默认的mpm)
  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"
[root@iZrj98mzg10cz2147bly2wZ ~]# 

在这里插入图片描述

将Prefork MPM换成Worker MPM

在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


然后从新启动服务器就可以了

systemctl restart httpd 从新启动的命令

其他命令

systemctl reload httpd 从新加载配置文件
httpd -v 小v是查看apache的版本号等
httpd -V 大v是查看MPM使用的是哪个
top 命令查看apache每个进程占用的资源kb为单位
ps aux | grep httpd 查看apache的进程

注意事项如果你是wordpress或者php这类型的网站

mod_php只在Prefork下来使用,如果你换成Worker 或者是Event 那么你的服务器需要支持PHP-FPM 用他来处理 PHP 请求

查看是否安装了 PHP-FPM
php-fpm -v
或者看下/etc/
这个目录下面有没有php-fpm.conf这个配置文件

下面是安装PHP-FPM 一些命令

yum update 更新yum源
yum install php-fpm 下载这个东西 
php-fpm -v 查看下载的版本检查是否安装成功
systemctl start php-fpm 启动命令
systemctl status php-fpm 查看状态是否启动成功
systemctl restart php-fpm 从新启动

在这里插入图片描述
修改httpd下面的php配置文件

#
# The following lines prevent .user.ini files from being viewed by Web clients.
#
<Files ".user.ini">
    Require all denied
</Files>

#
# Allow php to handle Multiviews
#
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Redirect to local php-fpm (no mod_php in default configuration)
#
这个标签里面的东西必须有不然你的php网站就是一片白板
<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    # Enable http authorization headers
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
  </IfModule>
</IfModule>

#
# mod_php is deprecated as FPM is now used by default with httpd in event mode
# mod_php is only used when explicitly enabled or httpd switch to prefork mode
#
# mod_php options
#
<IfModule  mod_php7.c>
    #
    # Cause the PHP interpreter to handle files with a .php extension.
    #
    <FilesMatch \.(php|phar)$>
        SetHandler application/x-httpd-php
    </FilesMatch>

    #
    # Uncomment the following lines to allow PHP to pretty-print .phps
    # files as PHP source code:
    #
    #<FilesMatch \.phps$>
    #    SetHandler application/x-httpd-php-source
    #</FilesMatch>

    #
    # Apache specific PHP configuration options
    # those can be override in each configured vhost
    #
    php_value session.save_handler "files"
    php_value session.save_path    "/var/lib/php/session"
    php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"

    #php_value opcache.file_cache   "/var/lib/php/opcache"
</IfModule>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值