百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

你真的了解 apache httpd 得多路复用吗

off999 2025-03-26 15:52 29 浏览 0 评论

目前的web服务器,apachehttpdnginx可以说是绝代双骄,一个是江湖老大哥,一个是后起之秀。虽然现在大家的首选是nginx,很多项目因为各种原因还是会选择使用apachehttpd作为web服务器。

随着最新版httpd 2.4的发布,event模块也变成了稳定版本,与nginx的性能差距再次缩小。

Apache httpd 服务器有三种MPM(多路处理模块),分别是prefork,workerevent。这三种模块性格迥异,不同的模块对httpd的性能及使用场景会产生比较大的影响。

查看httpd服务器使用的哪个模块可以通过如下指令 httpd -l。从输出可以看出使用的是worker模式。

Compiled in modules:
    core.c
    mod_so.c
    http_core.c
    worker.c

MPM介绍

prefork

进程模式。每个请求都由一个子进程来处理。线程安全。不太适合高并发服务器。

  • 工作原理如图:

worker

进程线程混合模式。父进程会创建子进程,每个子进程会创建多个工作线程以及一个监听线程。每一个线程负责处理一个http请求。

  • 工作原理,如图:

event

进程线程混合模式。跟worker模式很像,不同的是采用epoll模式,在2.4之前的版本是实验版本,现在已经稳定了。性能比worker要好很多。并在keepalive方面做了优化。

  • 工作原理 与worker基本相同,这里就不放图了。

这三种模式,在启动的时候都会启动固定数量的子进程。同时三种模式都会创建一定数量的空闲子进程,以便新的请求进来时,可以直接使用。

通用配置

三种模式都有一些通用的参数指令,个别指令在不同模式下面含义有些许不同:

StartServers :服务器启动时建立的子进程数。

MinSpareServers:空闲子进程的最小数量。当空闲子进程小于这个值时,父进程将会创建子进程。

MaxSpareServers:空闲子进程的最大数量。当空闲子进程大于这个值时,父进程会杀死多余的子进程。

MaxRequestWorkders:允许同时接受的最大接入请求数量;如果提升该值,也需要同时提高ServerLimit。任何超过了该值的请求数都要进入等待队列。在之前的版本被称为MaxClients。现在的版本也支持该参数。

注意: 在workerevent 模式下MaxRequestWorks = ServerLimit * ThreadsPerChild

ListenBacklog :半链接(pending connection)队列的最大长度。

ServerLimit: 服务器允许配置的进程数上限。

MaxConnectionsPerChild:每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在之前的版本称之为MaxRequestsPerChild

建议设置为非零,原因:

  1. 能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
  2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。

配置样例 prefork模式


    StartServers      5
    MinSpareServers   10
    MaxSpareServers   20
    ServerLimit      1024
    MaxRequestWorkders  1024
    MaxRequestsPerChild  160

worker 与 event 特有的配置参数

ThreadsPerChild:每个子进程,产生多少线程。不能超过ThreadLimit

ThreadLimit:每个子进程可配置的线程数。

AsyncRequestWorkerFactor:该参数event模式独有。默认值为2。可设置为小数,例如1.5。

该参数用来调整每个进程允许的连接数。只有当前连接数(不包括正处于closing状态的连接)小于下面的表达式的值时,子进程才允许接收新连接。最好不要调整该值,除非你经过大量测试。 ThreadsPerChild +(AsyncRequestWorkerFactor * number of idle workers)

配置样例 worker模式


    StartServers        5
    ServerLimit         40
    MaxRequestWorkders  2560
    MinSpareThreads     10
    MaxSpareThreads     20
    ThreadsPerChild     64
    MaxRequestsPerChild  160

web服务器常用运维指令

我把我常用的一些网络运维脚本送给各位吧,有凑字数嫌疑(偷笑)。

查看状态为established 的TCP连接:netstat -na|grep ESTABLISHED|wc -l

统计哪个IP地址连接最多: netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r

统计TCP连接状态: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

结束

关于apache httpd 的配置及MPM简介,上面的内容基本就说完了。稍微了解TCP及网络编程知识的同学可能会好奇,TCP连接对外提供服务的是一个固定端口,比如httpd默认是80端口,那apache httpd是如何做到同时支持多个请求的呢,也就是高并发。还有worker模式和event模式都是进程线程混合模式,为什么event模式就比worker模式优秀呢,也就是大家经常开玩笑说的,同样是九年义务教育你为什么如此优秀。我将在下篇文章中给大家详细说一说,下一篇文章才是硬核干货知识。

相关推荐

python入门到脱坑经典案例—清空列表

在Python中,清空列表是一个基础但重要的操作。clear()方法是最直接的方式,但还有其他方法也可以实现相同效果。以下是详细说明:1.使用clear()方法(Python3.3+推荐)...

python中元组,列表,字典,集合删除项目方式的归纳

九三,君子终日乾乾,夕惕若,厉无咎。在使用python过程中会经常遇到这四种集合数据类型,今天就对这四种集合数据类型中删除项目的操作做个总结性的归纳。列表(List)是一种有序和可更改的集合。允许重复...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

数据结构与算法——链式存储(链表)的插入及删除,

持续分享嵌入式技术,操作系统,算法,c语言/python等,欢迎小友关注支持上篇文章我们讲述了链表的基本概念及一些查找遍历的方法,本篇我们主要将一下链表的插入删除操作,以及采用堆栈方式如何创建链表。链...

Python自动化:openpyxl写入数据,插入删除行列等基础操作

importopenpyxlwb=openpyxl.load_workbook("example1.xlsx")sh=wb['Sheet1']写入数据#...

在Linux下软件的安装与卸载(linux里的程序的安装与卸载命令)

通过apt安装/协助软件apt是AdvancedPackagingTool,是Linux下的一款安装包管理工具可以在终端中方便的安装/卸载/更新软件包命令使用格式:安装软件:sudoapt...

Python 批量卸载关联包 pip-autoremove

pip工具在安装扩展包的时候会自动安装依赖的关联包,但是卸载时只删除单个包,无法卸载关联的包。pip-autoremove就是为了解决卸载关联包的问题。安装方法通过下面的命令安装:pipinsta...

用Python在Word文档中插入和删除文本框

在当今自动化办公需求日益增长的背景下,通过编程手段动态管理Word文档中的文本框元素已成为提升工作效率的关键技术路径。文本框作为文档排版中灵活的内容容器,既能承载多模态信息(如文字、图像),又可实现独...

Python 从列表中删除值的多种实用方法详解

#Python从列表中删除值的多种实用方法详解在Python编程中,列表(List)是一种常用的数据结构,具有动态可变的特性。当我们需要从列表中删除元素时,根据不同的场景(如按值删除、按索引删除、...

Python 中的前缀删除操作全指南(python删除前导0)

1.字符串前缀删除1.1使用内置方法Python提供了几种内置方法来处理字符串前缀的删除:#1.使用removeprefix()方法(Python3.9+)text="...

每天学点Python知识:如何删除空白

在Python中,删除空白可以分为几种不同的情况,常见的是针对字符串或列表中空白字符的处理。一、删除字符串中的空白1.删除字符串两端的空白(空格、\t、\n等)使用.strip()方法:s...

Linux系统自带Python2&yum的卸载及重装

写在前面事情的起因是我昨天在测试Linux安装Python3的shell脚本时,需要卸载Python3重新安装一遍。但是通过如下命令卸载python3时,少写了个3,不小心将系统自带的python2也...

如何使用Python将多个excel文件数据快速汇总?

在数据分析和处理的过程中,Excel文件是我们经常会遇到的数据格式之一。本文将通过一个具体的示例,展示如何使用Python和Pandas库来读取、合并和处理多个Excel文件的数据,并最终生成一个包含...

【第三弹】用Python实现Excel的vlookup功能

今天继续用pandas实现Excel的vlookup功能,假设我们的2个表长成这样:我们希望把Sheet2的部门匹在Sheet1的最后一列。话不多说,先上代码:importpandasaspd...

python中pandas读取excel单列及连续多列数据

案例:想获取test.xls中C列、H列以后(当H列后列数未知时)的所有数据。importpandasaspdfile_name=r'D:\test.xls'#表格绝对...

取消回复欢迎 发表评论: