文章目录
apache 是什么?
20世纪90年代初,国家超级计算机应用中心NCSA开发,1995年开源社区发布apache(a patchyserver)
-
ASF: apache software foundation
-
FSF:Free Software Foundation
-
Apache 是使用最广泛的 Web 服务器软件。Apache 是由 Apache Software Foundation 开发和维护的,它是一个免费提供的开源软件。它占全球所有网络服务器的 67%。它快速,可靠,安全。它可以通过使用扩展和模块进行高度定制,以满足许多不同环境的需求。大多数 WordPress 托管服务提供商使用 Apache 作为其 Web 服务器软件。但是,WordPress 也可以在其他 Web 服务器软件上运行。
-
Apache Web Server 旨在创建能够托管一个或多个基于 HTTP 的网站的 Web 服务器。值得注意的功能包括支持多种编程语言,服务器端脚本,身份验证机制和数据库支持。可以通过操纵代码库或添加多个扩展/附加组件来增强 Apache Web Server。
-
它也被 Web 托管公司广泛用于提供共享/虚拟主机,因为默认情况下,Apache Web Server 支持并区分驻留在同一台机器上的不同主机。
apache 特性
- 高度模块化:core + modules
- DSO:Dynamic Shared Object 动态加/卸载
- MPM:multi-processing module 多路处理模块
apache 功能
- 虚拟主机:IP、Port、FQDN
- CGI:Common Gateway Interface,通用网关接口
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:basic,digest
- 支持第三方模块
httpd-2.4特性
- MPM支持运行为DSO机制;以模块形式按需加载
- event MPM生产环境可用
- 异步读写机制
- 支持每模块及每目录的单独日志级别定义
- 每请求相关的专用配置
- 增强版的表达式分析式
- 毫秒级持久连接时长定义
- 基于FQDN的虚拟主机不需要NameVirutalHost指令
- 新指令
- 支持用户自定义变量
- 更低的内存消耗
MPM multi-processing module 工作模式
- prefork:多进程I/O模型,每个进程响应一个请求,CentOS7 默认模型
- 一个主进程:生成和回收n个子进程,创建套接字,不响应请求
- 多个子进程:工作work进程,每个子进程处理一个请求;
- 系统初始时,预先生成多个空闲进程,等待请求
-
Prefork MPM: 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
- 优点:稳定
- 缺点:慢,占用资源,不适用于高并发场景
-
worker: 复用的多进程I/O模型,多进程多线程,IIS使用此模型
- 一个主进程:生成m个子进程
- 每个子进程负责生成n个线程,每个线程响应一个请求,故能够并发响应请求:m*n
- 比prefork模式节约资源,但一个线程出错会影响所在进程的其他线程
-
worker MPM:是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
-
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
-
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
-
event: 事件驱动模型(worker模型的变种),CentOS8 默认模型
-
-
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
-
event MPM:Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。
-
event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
-
event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)
-
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
-
缺点:没有线程安全控制
-
httpd-2.4 相关文件
- 配置文件
- /etc/httpd/conf/httpd.conf 主配置文件
- /etc/httpd/conf.d/*.conf 子配置文件
- /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件
- 检查配置语法:httpd –t
- 查看静态编译的模块:httpd -l
- 查看静态编译及动态装载的模块:httpd –M
- 服务单元文件:
- /usr/lib/systemd/system/httpd.service
- 配置文件:/etc/sysconfig/httpd
- 服务控制和启动
- systemctl enable|disable httpd.service
- systemctl {start|stop|restart|status|reload} httpd.service
- 站点网页文档根目录:/var/www/html
- 模块文件路径:
- /etc/httpd/modules
- usr/lib64/httpd/modules
- 主服务器程序文件: /usr/sbin/httpd
- 主进程文件: /etc/httpd/run/httpd.pid
- 日志文件目录:/var/log/httpd
- access_log: 访问日志
- error_log:错误日志
- 帮助文档包:httpd-manual
httpd配置文件的组成
主要组成:
- 全局配置:Global Environment
- 主服务器配置:Main server configuration
- 虚拟主机配置:virtual host
配置文件格式:directive value (指令 值)
- directive:不区分字符大小写
- value:当为路径时,是否区分大小写取决于文件系统
httpd 常见配置
显示服务器版本信息
[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2
MyMod/1.2
建议使用:ServerTokens Prod
//在远程主机开启相关服务,查看显示如下
[root@node-17 ~]# curl -I 192.168.26.37
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 09 Dec 2019 08:44:32 GMT
Content-Type: text/html
Content-Length: 246
Last-Modified: Sat, 07 Dec 2019 10:41:35 GMT
Connection: keep-alive
ETag: "5deb81df-f6"
Accept-Ranges: bytes
//准备修改文件,主配置文件最好别动,手动创建一个被服务包含的子配置文件
[root@node-17 ~]# ansible 192.168.26.37 -a "/bin/echo 'servertokens prod' > /etc/httpd/conf.d/son_conf.conf"
-------------------------------------------------
//重启httpd服务
[root@node-17 ~]# ansible 192.168.26.37 -m service -a "name=httpd state=restarted"
--------------------------------------------------
//查看显示如下
[root@node-17 ~]# curl -I 192.168.26.37
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Mon, 09 Dec 2019 08:59:24 GMT
Content-Type: text/html
Content-Length: 246
Last-Modified: Sat, 07 Dec 2019 10:41:35 GMT
Connection: keep-alive
ETag: "5deb81df-f6"
Accept-Ranges: bytes
修改监听的IP和Port
- 设置格式:Listen [IP:]PORT
- 省略IP表示为0.0.0.0
- Listen指令至少一个,可重复出现多次
- Listen 80
- Listen 8080
- 修改监听socket,重载服务进程方可生效
注意:必须有端口号设置,否则服务启动失败
//修改服务器端口192.168.26.37只能通过8080端口访问
[root@node-37 ~]# vim /etc/httpd/conf/httpd.conf
//配置文件修改或添加下列内容
Listen 192.168.26.37:8080
------------------------------------------------
//测试
[root@node-17 ~]# curl -I 192.168.26.37
curl: (7) Failed connect to 192.168.26.37:80; Connection refused
------------------------------------------------
//必须使用8080端口才能连接词IP
[root@node-17 ~]# curl -I 192.168.26.37:8080
HTTP/1.1 200 OK
Date: Mon, 09 Dec 2019 09:39:35 GMT
Server: Apache
Last-Modified: Sat, 07 Dec 2019 07:39:53 GMT
ETag: "f6-5991844a8a4fe"
Accept-Ranges: bytes
Content-Length: 246
Content-Type: text/html; charset=UTF-8
持久连接
- 定义:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完
成,默认关闭持久连接 - 断开条件:时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
- 副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
- 折衷:使用较短的持久连接时间
- 设置格式
- KeepAlive On|Off
- KeepAliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
- MaxKeepAliveRequests 500 #持久连接最大接收的请求数,默认值100
- 测试方法
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
- 测试实例
//编辑之前创建的子配置文件
[root@node-37 ~]# vim /etc/httpd/conf.d/son_conf.conf
servertokens prod
//开启持久连接
keepalive on
//设置连接为60秒,默认为5秒
keepalivetimeout 100
-----------------------------------------------
telnet 192.168.26.37:8080
date
MPM (Multi-Processing Module) 多路处理模块
httpd 支持三种MPM工作模式:prefork、worker、event
- httpd-2.4不支持同时编译多个模块,所以只能编译时选定一个
- 查询当前MPM模式
[root@node-37 ~]# httpd -M | grep mpm
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe63:1feb. Set the 'ServerName' directive globally to suppress this message
mpm_prefork_module (shared)
-
切换正在使用的MPM模式
-
注意不要同时启用多个模块,否则会报错
AH00534: httpd: Configuration error: More than one MPM loaded. -
范例:查看各个版本默认的MPM模式
/ Centos6 默认的模式
[root@Centos6 ~]#httpd -v
Server version: Apache/2.2.15 (Unix) / 默认使用的版本
Server built: Jun 19 2018 15:45:13
[root@Centos6 ~]#httpd -M |grep mpm
httpd: apr_sockaddr_info_get() failed for Centos6.localdomain
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
mpm_prefork_module (static)
/ Centos7 默认模式
[root@Centos7 ~]# httpd -v / 默认使用的版本
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
[root@Centos7 ~]# httpd -M | grep mpm
mpm_prefork_module (shared)
/ Centos8 默认模式
[root@Centos8 ~]#httpd -v
Server version: Apache/2.4.37 (centos) / 默认使用的版本
Server built: Oct 7 2019 21:42:02
[root@Centos8 ~]#httpd -M | grep mpm
mpm_event_module (shared)
- 示例:修改Centos7模式
//编辑修改文件启用prefork模式,如下图
[root@node-37 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
查看模块
- 查看静态编译的模块 httpd -l
- 查看静态编译及动态装载的模块 httpd -M
- 动态模块加载:不需重启即生效
- 动态模块路径:/usr/lib64/httpd/modules/
切换正在使用的httpd模式
centos6 httpd-2.2 MPM设置
修改文件
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.event
默认为prefork模式
配置后重启httpd server生效
------------------------------------
centos7 httpd-2.4 MPM设置
修改文件 /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
prefork默认设置
vim /etc/httpd/conf/httpd.conf / Centos6 httpd-2.2版本
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf / Centos7 httpd-2.4版本
<IfModule prefork.c>
StartServers 8 / 启动开启的进程数
MinSpareServers 5 / 最少空闲进程数
MaxSpareServers 20 / 最大空闲进程数
ServerLimit 256 / 最多进程数,不能超过MaxClient,最大能设置为20000
MaxClients 256 / 最大并发数
MaxRequestsPerChild 4000 / 子进程最多能处理的请求,达到设置值子进程被父进程终止,释放内存
/ 从 httpd.2.3.9开始被MaxConnectionsPerChild代替
</IfModule>
worker和event 模式相关的配置
vim /etc/httpd/conf/httpd.conf / Centos6 httpd-2.2版本
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf / Centos7 httpd-2.4版本
<IfModule mpm_worker_module>
StartServers 3 #服务开启时默认进程数
MinSpareThreads 75 #最小线程数
MaxSpareThreads 220 #最大线程数
ThreadsPerChild 25 #
MaxRequestWorkers 400 #最大并发数
MaxConnectionsPerChild 0 #无限制永不释放
</IfModule>
-
启动时开启3个进程,每个进程开启75个线程,共225个线程,但最多空闲220个线程,需要结束1个进程共75个线程,故开启服务后实际只能开到2个进程共150个线程
-
示例修改启动进程以及线程数量
/ MPM各个模块相关设置文件在httpd-mpm.conf文件里面
locate httpd-mpm.conf
//编辑修改MPM模块配置文件
vim /usr/share/doc/httpd-2.4.6/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 100
MinSpareServers 50
MaxSpareServers 60
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
-----------------------------------------
//需在主配置文件加载这个httpd-mpm.conf配置文件,因为服务默认不加载这个文件
vim /etc/httpd/conf/httpd.conf
//在主配置文件中添加文件路径
Include /usr/share/doc/httpd-2.4.6/httpd-mpm.conf
//重启服务
systemctl restart httpd
//查看得,生效
[root@Centos7 httpd]# pstree
systemd─┬─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon
├─httpd───98*[httpd]
DSO(Dynamic Shared Object):动态加载模块
- 加载动态模块配置文件
//编辑配置文件查看得
vim /etc/http/conf/httpd.conf
ServerRoot "/etc/httpd" //动态加载模块默认地址
Include conf.modules.d/*.conf
- 配置指定模块加载格式:
LoadModule <mod_name> <mod_path> - 模块文件路径使用相对路径:
相对于ServerRoot(默认/etc/httpd) - 范例:取消加载模块auth_basic_module
[root@Centos7 httpd]# vim /etc/httpd/conf.modules.d/00-base.conf
#LoadModule auth_basic_module modules/mod_auth_basic.so / 注释即可
[root@Centos7 httpd]# httpd -t
Syntax OK
[root@Centos7 httpd]# systemctl restart httpd
[root@Centos7 httpd]# httpd -M | grep auth_basic
来源:CSDN
作者:Nanjing_bokebi
链接:https://blog.csdn.net/Nanjing_bokebi/article/details/103488102