一文读懂 php httpd的特性
httpd简介
Apache HTTP Server(简称Apache或httpd)是Apache软件基金会的一个开放源代码的网页服务器软件,旨在为unix,windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性,被广泛使用,自1996年4月以来,Apache一直是Internet上最流行的HTTP服务器。在这里我们只用作一个可支持文件上传下载的http文件服务器使用。(工作要求临时搭建一个文件服务器来下载对应业务文件)
httpd的特性
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态共享对象
- MPM:Multipath Processing Modules 多路处理模块,非一个模块,而是对一种特性的称谓
httpd的功能特性
路径别名:alias
丰富的用户认证机制:authentication、basic、digest
虚拟主机:virtual host IP,Port,FQDN
反向代理:负载均衡
用户站点:当前系统上每个用户,都可以自行创建一个自己的网站
原生支持CGI:Common Gateway Interface,通用网关接口 动态网站
httpd工作模式
- 单进程阻塞模型
在有多个请求到达web服务器时,第一个进入的请求被接受后,在web进行发起系统调用期间,web进程始终是被阻塞(不可中断睡眠)的。只有在第一个请求被响应完成后,才会接受第二个请求。效率极其低下。
- prefork模型
多进程模型,web服务启动后会有一个以root身份启动的主进程,然后生成多个空闲的以Apache身份(RHEL的RPM包安装版本)启动的工作子进程。
当多个请求达到web服务器后,主进程只是负责派发某个空闲工作进程去响应。
这种模型使用select机制(I/O复用器的一种,替代linux内核去监控进程I/O的完成情况)。
但正是由于使用select机制,默认在超过1024个请求后,CPU就会将大量时间用于切换进程,这就大大浪费了CPU资源,且由于进程间的内存是不共享的,所以会非常占用内存。

- worker模型
多进程多线程模型,web服务启动后,生成一个root身份启动的主进程和多个以apache身份的启动的工作进程。在请求到达时,主进程同样负责派发工作进程去响应请求。工作进程接受请求后,会生成多个线程去实际的相应请求。
- event多线程模型
web服务启动后,生成一个root身份启动的主进程,和多个apache身份的工作进程。
请求到达时,主进程负责接收请求,并将请求派发给后面的工作进程。工作进程直接向内核发起系统调用后,不会等待I/O的完成(也就是不会被阻塞),而是继续去响应后面的请求。
这种模型才采用的是AIO异步模型,所以性能最好。如果主机有多个CPU核心,可以将工作进程绑定在固定的cpu核心上,这样可以大量减少上下文的切换。
- 优缺点
- prefork 中没有线程的概念,是多进程模型,一个进程处理一个连接;稳定;响应快。其缺点是在连接数比较大时就非常消耗内存。
- worker 是多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。与prefork相比,worker模式更节省系统的内存资源。不过,需要注意worker模式下的Apache与php等程序模块的兼容性。
- event 是worker模式的变种,它把服务进程从连接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的并发负载。event模式不能很好的支持https的访问(HTTP认证相关的问题)。
httpd的工作模式, 默认为prefork模式,主要是考虑到稳定性的原因。
总结
今天访问在部门内部署的文件服务器,感觉很慢,于是登录服务器查看一番;
先查看CPU和可用内存,都比较正常;然后又查看磁盘IO,发现大量写操作,每秒高达70M,磁盘使用率99%,根据这个现象可以推断是有多人同时再下载文件;
接着查询httpd进程,发现子进程有24个之多;开始还以为是多次重启导致,于是查询了一下httpd工作模式,是因为多进程模型所导致,当机器空闲时,子进程又恢复至10个,一切又变得正常起来。对于httpd工作模式,重新学习一番,也算解了心头之惑!

相关推荐
-
第18问:MySQL CPU 高了,怎么办?2025-02-24 10:27:18
-
mysql索引类型 normal, unique, full text
mysql索引类型 normal, unique, full text2025-02-24 10:05:05 -
uwsgi+django+nginx 搭建部分总结2025-02-24 10:03:33
-
使用Docker配置Nginx环境部署Nextcloud2025-02-24 10:02:03
-
Nginx安装和怎么使用2025-02-24 10:00:45