什么是Apache?
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
Apache的使用版本
version:2.4(Current)
version:2.2(Historical)
version:2.0(Historical)
version:1.3(Historical)
这里我们主要介绍一下最新版本2.4的学习
Apache2.4介绍
官方文档:Apache HTTP Server 2.4 中的新功能概述 - Apache HTTP Server 版本 2.4
一,核心增强功能
运行时可加载的 MPM
现在可以构建多个 MPM 作为编译时的可加载模块。 所选的 MPM 可以在运行时通过指令进行配置。LoadModule
事件MPM
MPM事件不再是实验性的 但现在完全受支持。
异步支持
更好地支持异步读/写以支持 MPM 和 平台。
每个模块和每个目录的日志级别配置
现在可以 按模块和目录配置。日志上方添加了新级别 水平。LogLevel
trace1
trace8
debug
每个请求的配置部分
<If>
,, 和部分可用于根据每个请求设置配置 标准。<ElseIf>
<Else>
通用表达式解析器
新的表达式解析器允许使用通用语法指定复杂条件 在指令中,例如,,,, 等。SetEnvIfExpr
RewriteCond
Header
<If>
保持活动超时(以毫秒为单位)
现在可以以毫秒为单位指定。KeepAliveTimeout
名称虚拟主机指令
不再需要,现已弃用。
覆盖配置
new指令允许更细粒度地控制哪些指令是 允许的文件中。AllowOverrideList
.htaccess
配置文件变量
现在可以在配置中对变量进行变量,从而可以更清晰地表示 如果在配置中的许多位置使用相同的值。Define
减少内存使用
尽管有许多新功能,但 2.4.x 使用的内存往往比 2.2.x.
二,新模块
mod_proxy_fcgi 快速CGI协议后端mod_proxy mod_proxy_scgi SCGI 协议后端mod_proxy mod_proxy_express 提供动态配置的批量反向代理mod_proxy mod_remoteip 替换请求的明显客户端远程 IP 地址和主机名 IP 地址列表由代理或负载均衡器通过以下方式提供 请求标头。 mod_heartmonitor, mod_lbmethod_heartbeat 允许基于负载平衡决策 后端服务器上的活动连接数。mod_proxy_balancer mod_proxy_html 以前是第三方模块,它支持修复 HTML 反向代理情况下的链接,其中后端生成 对代理客户端无效的 URL。 mod_sed 高级替换,允许 以编辑具有 SED 全部功能的响应正文。mod_substitute mod_auth_form 启用基于表单的身份验证。 mod_session 允许使用cookie或 数据库存储。 mod_allowmethods 新模块限制某些 HTTP 方法而不干扰 身份验证或授权。 mod_lua 将Lua语言嵌入到httpd中, 用于配置和小型企业逻辑功能。(实验性) mod_log_debug 允许在 请求处理。 mod_buffer 用于缓冲输入和输出滤波器堆栈 mod_data 将响应正文转换为 RFC2397 数据 URL mod_ratelimit 为客户端提供带宽速率限制 mod_request 提供筛选器来处理和提供 HTTP 请求正文 mod_reflector 通过输出筛选器堆栈提供请求正文的反射作为响应。 mod_slotmem_shm 提供基于插槽的共享内存提供程序(即记分板)。 mod_xml2enc 以前是第三方模块,支持国际化 在基于 libxml2(标记感知)过滤器模块中。 mod_macro(自 2.4.5 起可用) 在配置文件中提供宏。 mod_proxy_wstunnel(自 2.4.5 起可用) 支持网络套接字隧道。 mod_authnz_fcgi(自 2.4.10 起可用) 使 FastCGI 授权方应用程序能够进行身份验证和/或 授权客户端。 mod_http2(自 2.4.17 起可用) 支持 HTTP/2 传输层。 mod_proxy_http2(自 2.4.19 起可用) HTTP/2 协议后端mod_proxy mod_proxy_hcheck(自 2.4.21 起可用) 支持对远程代理后端服务器进行独立的动态健康检查。 mod_brotli(自 2.4.26 起可用) 支持 Brotli 压缩算法。 mod_md(自 2.4.30 起可用) 支持 ACME 协议以自动执行证书预配。 mod_proxy_uwsgi(自 2.4.30 起可用) UWSGI网关模块。mod_proxy mod_socache_redis(自 2.4.39 起可用) 支持基于Redis的共享对象缓存提供程序。 mod_systemd(自 2.4.42 起可用) 系统集成。它允许在与systemd一起使用httpd的服务中。Type=notify
三,模块增强功能
mod_ssl mod_ssl现在可以配置为使用 用于检查客户端验证状态的 OCSP 服务器 证书。默认响应程序是可配置的,以及 关于是否选择中指定的响应者的决定 客户端证书本身。 mod_ssl现在还支持 OCSP 装订,其中 服务器主动获取其证书的 OCSP 验证,并且 在握手期间将其传输到客户端。 mod_ssl现在可以配置为共享 SSL 会话 通过 memcached 在服务器之间传输数据 除了 RSA 和 DSA 之外,现在还支持 EC 密钥。 支持 TLS-SRP(在 2.4.4 及更高版本中可用)。 mod_proxy 该指令 现在在 AorBlock 中配置最优化,与传统的相比具有显著的性能优势 大量存在的双参数语法。ProxyPassLocationLocationMatch 用于代理请求的源地址现在可以配置。 支持后端的 Unix 域套接字(在 2.4.7 中可用 以及后来)。 mod_proxy_balancer 通过平衡器管理器对平衡器成员进行更多运行时配置更改 可以在运行时通过平衡器管理器添加其他平衡器成员 平衡器参数子集的运行时配置 平衡器成员可以设置为“排出”,以便它们仅响应现有的粘性 会话,允许它们正常脱机。 重启后,平衡器设置可以保留。 mod_cache 可以选择插入缓存过滤器 在筛选器链中的给定点,以提供对缓存的精细控制。mod_cache mod_cache现在可以缓存 HEAD 请求。 在可能的情况下,现在可以设置指令 按目录,而不是按服务器。mod_cache 可以自定义缓存 URL 的基本 URL,以便将 缓存可以共享相同的终结点 URL 前缀。 mod_cache现在能够提供过时的缓存 后端不可用时的数据(错误 5xx)。 mod_cache现在可以将命中/未命中/重新验证插入 X 缓存标头。 mod_include 支持“include”元素中的“onerror”属性, 允许在错误时提供错误文档,而不是默认文档 错误字符串。 mod_cgi, , , ...mod_includemod_isapi 将标头转换为环境变量比 之前通过标头缓解一些可能的跨站点脚本攻击 注射。包含无效字符(包括下划线)的标题名称 不再转换为环境变量。环境变量 在 Apache 中有一些关于如何解决破碎遗产的指示 需要此类标头的客户端。(这会影响所有模块 使用这些环境变量。 mod_authz_core授权逻辑容器 现在可以使用指令指定高级授权逻辑 以及相关的容器指令,例如。Require<RequireAll> mod_rewrite mod_rewrite添加(查询字符串丢弃)和标志 简化常见的重写方案。[QSD][END]RewriteRule 添加了使用复杂布尔表达式的可能性。RewriteCond 允许将 SQL 查询用作函数。RewriteMap mod_ldap, mod_authnz_ldap mod_authnz_ldap添加对嵌套组的支持。 mod_ldap添加,和 处理超时的其他改进。 这对于以下设置特别有用: 有状态防火墙会断开与 LDAP 服务器的空闲连接。LDAPConnectionPoolTTLLDAPTimeout mod_ldap添加到日志 使用的 LDAP 工具包提供的调试信息。LDAPLibraryDebug mod_info mod_info现在可以转储预解析的配置 在服务器启动期间到标准输出。 mod_auth_basic 伪造基本身份验证的新通用机制(在 2.4.5 及更高版本)。
四,程序功能增强
fcgistarter 新的快速CGI守护程序启动器实用程序 htcacheclean 现在可以列出当前缓存的 URL,以及可选的元数据 包括。 允许从 缓存。 文件大小现在可以四舍五入到给定的块大小,使 大小限制更接近磁盘上的实际大小。 缓存大小现在可以由索引节点的数量限制,而不是 或除了受文件大小的限制之外 磁盘。 rotatelogs 现在可以创建指向当前日志文件的链接。 现在可以调用自定义轮换后脚本。 htpasswd, htdbm 支持 bcrypt 算法(在 2.4.4 及更高版本中可用)。
五,文档
mod_rewrite 文档已 重新排列并几乎完全重写,重点是 示例和常见用法,以及向您展示其他时 解决方案更合适。重写 指南现在是一个顶级部分,其中包含更多详细信息和 更好的组织。mod_rewrite mod_ssl 文档已经很大 增强,在入门级别提供了更多示例,在 除了之前对技术细节的关注。mod_ssl 缓存指南 缓存指南已被重写 正确区分 RFC2616 HTTP/1.1 缓存 提供的功能和通用 SOCACHE接口提供的键/值缓存,以及涵盖 机制,如。mod_cachemod_file_cache
六,模块开发人员更改
检查配置挂钩已添加 添加了一个新的钩子,,它运行 在和钩之间。它也在钩子之前运行 当选项传递到时。钩子 允许模块查看相互依赖的配置指令 值并调整它们,同时消息仍然可以记录到 安慰。因此,用户可以收到配置错误问题的警报 在 corehook 函数重定向之前 控制台输出到错误日志。check_configpre_configopen_logstest_config-thttpdcheck_configopen_logs 添加了表达式解析器 我们现在有一个通用表达式解析器,其 API 是 暴露在。这是改编自 表达式解析器以前在中实现。 ap_expr.hmod_ssl 授权逻辑容器 授权模块现在通过以下方式注册为提供程序 ap_register_auth_provider(),以支持高级授权逻辑, 如。<RequireAll> 小对象缓存接口 标头公开基于提供程序 用于缓存小型数据对象的接口,基于前面的 会话缓存的实现。 使用共享内存循环缓冲区、基于磁盘的 dbm 的提供程序 文件和 memcache 分布式缓存当前是 支持。ap_socache.hmod_ssl 添加了缓存状态挂钩 该模块现在包含一个 newhook,在缓存时调用 决定变得众所周知。提供默认实现 这会向响应添加一个可选标头。mod_cachecache_statusX-CacheX-Cache-Detail 开发人员文档包含API 更改的详细列表。
apache的主配置文件参数说明
ServerRoot : Apache的主目录
Listen:apache监听的端口号
LoadModule:加载动态模块
User/Group:apache进程执行者
ServerAdmin:服务器返回客户端的错误信息中会包含该邮件地址,所以推荐写邮箱地址
ServerName:服务器域名,无需配置
DocumentRoot:网站根目录(apache运行项目的根地址)
DocumentRoot "/usr/local/httpd/htdocs" <Directory "/usr/local/httpd/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
Option指令是Apache配置文件中比较常见的指令,该指令可以在Apache服务器核心配置(server config)、虚拟主机配置(virtual host)、特定目录配置(directory)以及.htaccess文件中使用,该指令主要作用是控制特定目录启动哪些服务器特性
Options +Indexes :加上该指令可以在网页上查看项目某个目录下的所有文件,例如访问/index 等同访问 index.php或index.html
Options +FollowSymLinks:服务器允许在此目录中使用符号链接。如果该配置项位于<Location>配置段中,将会被忽略掉
Options +All:默认设置,开启除MultiViews之外的特性
Options +None:不启动任何服务器特性
Options +ExceCGI:允许使用mod_cgi木块执行CGI脚本
Options +MultiViews:允许使用mod_negotiation模块提供内容协商的“多重视图”,即自动选择最匹配客户端要求的文件
Options +SymLInksIfOwnerMatch:只有当符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略
Options +includes:允许使用mod_include模块提供的服务器端包含功能
“+”的选项将强制覆盖当前的可选项设置
“-”的选项将强制从当前可选项设置中除去
Allow from all
Require all granted :允许所有有权限的人访问apache的运行目录
AllowOverride None/all:禁止(允许)用户对目录配置文件(.htaccess)修改,不建议开启
Order allow,deny :apache会按照Order中的最后一条规则为准,如果allow all 但是deny 某个ip,最后会deny 某个ip
<IfModule>容器作用于模块,如果该模块载入的话就会执行里面的内容
DirectoryIndex index.html index.php :#优先级从左往右一次递减(会优先访问index.html)
<Files >:提供基于文件名的访问控制. 该段将根据他们在配置文件中出现的顺序被处理:在<directory>段和.htaccess文件被处理之后,但是在<Location>段之前,<Files>能嵌入到<Directory>段中来限制作用的文件范围。也可以用于.htaccess文件中,允许用户在文件层面上控制对文件的访问
ErrorLog "logs/error_log"
上面一行是错误日志的存放位置
下面一行是分割日志的操作
LogLevel warn
LogLevel :用于调整记录在错误日志中的信息的详细程度:
emerg:紧急(系统无法使用)
alert:必须立即采取措施
crit:致命情况
error:错误情况
warn:警告情况
notice:一般重要情况
info:普通信息
debug:调试信息
#当指定了某个级别的时候,高于它级别的信息会被记录
httpd中httpd-vhosts.conf配置文件的参数说明
<VirtualHost *:80> ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/usr/local/httpd/docs/dummy-host2.example.com" ServerName dummy-host2.example.com ErrorLog "logs/dummy-host2.example.com-error_log" CustomLog "logs/dummy-host2.example.com-access_log" common </VirtualHost>
ServerAdmin:网页管理员的邮箱或者联系方式
DocumentRoot:设置网站的存放位置
ServerName:配置网站的虚拟域名
ErrorLog:配置错误文件的存放位置和名称
CustomLog:设置访问日志的存放位置和名称
Apache 的三种工作模式(Prefork、Worker、Event)
Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。
它们分别是prefork,worker、event,它们同时也代表这Apache的演变和发展。
如何查看我们的Apache的工作模式呢?可以使用httpd -V 命令查看,如我安装的Apache 2.4版本呢?
[root@localhost ~]# httpd -V AH00112: Warning: DocumentRoot [/usr/local/httpd/docs/dummy-host2.example.com] does not exist AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message Server version: Apache/2.4.25 (Unix) Server built: Dec 6 2022 03:33:00 Server's Module Magic Number: 20120211:67 Server loaded: APR 1.5.2, APR-UTIL 1.5.4 Compiled using: APR 1.5.2, APR-UTIL 1.5.4 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count)
这里使用的是event模式,在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event
在configure配置编译参数的时候,可以使用--with-mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:--enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM
1、Prefork MPM
Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。
如何配置在Apache的配置文件httpd.conf的配置方式
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 250 MaxConnectionsPerChild 1000 </IfModule>
StartServers 服务器启动时建立的子进程数量,prefork默认是5,
MinSpareServers 空闲子进程的最小数量,默认5;如果当前空闲子进程数少于
MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers 空闲子进程的最大数量,默认10;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。次参数也不需要设置太大,如果你将其设置比MinSpareServers 小,Apache会自动将其修改为MinSpareServers +1的数量。
MaxRequestWorkers 限定服务器同一时间内客户端最大接入的请求数量,默认是256;任何超过了MaxRequestWorkers限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务,如果要增大这个数值,必须先增大ServerLimit。在Apache2.3.1版本之前这参数MaxRequestWorkers被称为MaxClients。
MaxConnectionsPerChild 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。Apache2.3.9之前称之为MaxRequestsPerChild。
这里建议设置为非零,注意原因:
1)能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。
2、Worker MPM
和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。
如何配置在Apache的配置文件httpd.conf的配置方式:
<IfModule mpm_worker_module> StartServers 3 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 1000 </IfModule>
配置参数解释:
StartServers 服务器启动时建立的子进程数量,在workers模式下默认是3.
ServerLimit 系统配置的最大进程数量,默认不显示,自己添加上
MinSpareThreads 空闲子进程的最小数量,默认75
MaxSpareThreads 空闲子进程的最大数量,默认250
ThreadsPerChild 每个子进程产生的线程数量,默认是64
MaxRequestWorkers / MaxClients 限定服务器同一时间内客户端最大接入的请求数量.
MaxConnectionsPerChild 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。
这里建议设置为非零,注意原因:
1)能够防止(偶然的)内存泄漏无限进行,从而耗尽内存;
2)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。
Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxRequestWorkers。
如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认ServerLimit 最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。
需要注意的是,如果显式声明了ServerLimit,那么它乘以 MaxRequestWorkers必须是hreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。
3、Event MPM
这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
如何配置在Apache的配置文件httpd.conf的配置方式:
<IfModule mpm_event_module> StartServers 3 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 1000 </IfModule>
event 模式与 worker 模式完全一样,参考 worker 模式参数即可,这里不再重复。
Apache httpd 能更好的为有特殊要求的站点定制。
例如,要求更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧软件兼容的站点可以使用 prefork。
本人apache的知识暂时了解这么多,后面还会更新,如果有错的地方也希望大家来评论,我看到会及时更改,感谢大家评论