Apache HTTP Server 版本 2.4
为了帮助用户升级,我们维护了一份文档,其中描述了对现有 Apache HTTP Server 用户至关重要的信息。这些只是简短的说明,您可以在 新功能 文档或 src/CHANGES
文件中找到更多信息。应用程序和模块开发人员可以在 API 更新 概述中找到 API 更改的摘要。
本文档描述了服务器行为的更改,这些更改可能需要您更改配置或使用服务器的方式,以便继续使用 2.4,就像您当前使用 2.2 一样。要利用 2.4 中的新功能,请参阅新功能文档。
本文档仅描述了从 2.2 到 2.4 的更改。如果您从 2.0 版本升级,还应查阅 2.0 到 2.2 升级文档。
编译过程与 2.2 版本中使用的过程非常相似。您的旧 configure
命令行(如安装的服务器目录中的 build/config.nice
中所找到的)在大多数情况下都可以使用。默认设置有一些更改。更改的一些细节
mod_cache_disk
。mod_lbmethod_bybusyness
。您可能需要构建和加载配置中使用的任何这些模块。LoadModule
指令在配置文件中被注释掉。授权配置和其他次要配置更改发生了重大变化,这可能需要在将 2.2 配置文件用于 2.4 之前对其进行更改。
任何使用授权的配置文件可能都需要更改。
您应该查看 身份验证、授权和访问控制指南,尤其是 超越授权 部分,该部分解释了控制授权指令应用顺序的新机制。
控制授权模块在不匹配已验证用户时如何响应的指令已被删除:这包括 AuthzLDAPAuthoritative、AuthzDBDAuthoritative、AuthzDBMAuthoritative、AuthzGroupFileAuthoritative、AuthzUserAuthoritative 和 AuthzOwnerAuthoritative。这些指令已被更具表现力的 RequireAny
、RequireNone
和 RequireAll
取代。
如果您使用 mod_authz_dbm
,您必须将配置移植到使用 Require dbm-group ...
代替 Require group ...
。
在 2.2 中,基于客户端主机名、IP 地址和客户端请求的其他特征的访问控制是使用指令 Order
、Allow
、Deny
和 Satisfy
完成的。
在 2.4 中,这种访问控制与其他授权检查以相同的方式完成,使用新的模块 mod_authz_host
。旧的访问控制习惯用法应该被新的身份验证机制取代,尽管为了与旧配置兼容,提供了新的模块 mod_access_compat
。
混合使用旧指令(如 Order
、Allow
或 Deny
)和新指令(如 Require
)在技术上是可行的,但不建议这样做。 mod_access_compat
是为了支持仅包含旧指令的配置而创建的,以方便 2.4 升级。请查看下面的示例,以更好地了解可能出现的问题。
以下是一些使用旧方法和新方法执行相同访问控制的示例。
在此示例中,没有身份验证,所有请求都被拒绝。
Order deny,allow Deny from all
Require all denied
在此示例中,没有身份验证,所有请求都被允许。
Order allow,deny Allow from all
Require all granted
在以下示例中,没有身份验证,example.org 域中的所有主机都被允许访问;所有其他主机都被拒绝访问。
Order Deny,Allow Deny from all Allow from example.org
Require host example.org
在以下示例中,混合使用旧指令和新指令会导致意外结果。
DocumentRoot "/var/www/html" <Directory "/"> AllowOverride None Order deny,allow Deny from all </Directory> <Location "/server-status"> SetHandler server-status Require local </Location> access.log - GET /server-status 403 127.0.0.1 error.log - AH01797: client denied by server configuration: /var/www/html/server-status
为什么 httpd 即使配置似乎允许访问服务器状态,也会拒绝访问?因为在此配置 合并 方案中,mod_access_compat
指令优先于 mod_authz_host
指令。
相反,此示例按预期工作
DocumentRoot "/var/www/html" <Directory "/"> AllowOverride None Require all denied </Directory> <Location "/server-status"> SetHandler server-status Order deny,allow Deny from all Allow From 127.0.0.1 </Location> access.log - GET /server-status 200 127.0.0.1
因此,即使混合配置仍然可行,请在升级时尽量避免这样做:要么保留旧指令,然后在稍后阶段迁移到新指令,要么一次性迁移所有内容。
在许多具有身份验证的配置中,Satisfy
的值为默认的 ALL,因此简单地禁用基于主机的访问控制的代码段被省略了
# 2.2 config that disables host-based access control and uses only authentication Order Deny,Allow Allow from all AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
# No replacement of disabling host-based access control needed AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
在同时有意义地组合了身份验证和访问控制的配置中,应迁移访问控制指令。此示例允许满足 *两者* 条件的请求
Order allow,deny Deny from all # Satisfy ALL is the default Satisfy ALL Allow from 127.0.0.1 AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure <RequireAll> Require valid-user Require ip 127.0.0.1 </RequireAll>
在同时有意义地组合了身份验证和访问控制的配置中,应迁移访问控制指令。此示例允许满足 *任一* 条件的请求
Order allow,deny Deny from all Satisfy any Allow from 127.0.0.1 AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure Require valid-user
AuthType Basic AuthBasicProvider file AuthUserFile /example.com/conf/users.passwd AuthName secure # Implicitly <RequireAny> Require valid-user Require ip 127.0.0.1
如以下所述,某些其他配置可能需要进行一些小的调整。
MaxRequestsPerChild
已重命名为 MaxConnectionsPerChild
,更准确地描述了它的作用。旧名称仍然受支持。MaxClients
已重命名为 MaxRequestWorkers
,更准确地描述了它的作用。对于异步 MPM(如 event
),客户端的最大数量与工作线程的数量并不等效。旧名称仍然受支持。DefaultType
指令不再有任何作用,除了在使用除 none
之外的任何值时发出警告。您需要使用其他配置设置在 2.4 中替换它。AllowOverride
现在默认为 None
。EnableSendfile
现在默认为 Off。FileETag
现在默认为 "MTime Size"(不含 INode)。mod_dav_fs
:对于具有 inode 的系统,DavLockDB
文件的格式已更改。升级时必须删除旧的 DavLockDB
文件。KeepAlive
仅接受 On
或 Off
值。以前,任何非 "Off" 或 "0" 的值都被视为 "On"。Mutex
指令取代。您需要评估 2.2 配置中对这些已删除指令的任何使用,以确定它们是否可以被删除,或者是否需要使用 Mutex
替换它们。mod_cache
:CacheIgnoreURLSessionIdentifiers
现在对查询字符串进行精确匹配,而不是部分匹配。如果您的配置使用部分字符串(例如,使用 sessionid
匹配 /someapplication/image.gif;jsessionid=123456789
),那么您需要更改为完整的字符串 jsessionid
。mod_cache
:CacheEnable
的第二个参数仅在以正确协议开头时才匹配正向代理内容。在 2.2 及更早版本中,参数 '/' 匹配所有内容。mod_ldap
:LDAPTrustedClientCert
现在始终仅为每个目录设置。如果您使用此指令,请查看您的配置以确保它存在于所有必要的目录上下文中。mod_filter
:FilterProvider
语法已更改,现在使用布尔表达式来确定是否应用过滤器。mod_include
:
#if expr
元素现在使用新的 表达式解析器。可以使用新的指令 SSILegacyExprParser
恢复旧语法。mod_charset_lite
:DebugLevel
选项已被删除,取而代之的是每个模块 LogLevel
配置。mod_ext_filter
:DebugLevel
选项已被删除,取而代之的是每个模块 LogLevel
配置。mod_proxy_scgi
: PATH_INFO
的默认设置已从 httpd 2.2 更改,一些 Web 应用程序将无法在新 PATH_INFO
设置下正常运行。可以通过配置 proxy-scgi-pathinfo
变量来恢复之前的设置。mod_ssl
: 基于 CRL 的吊销检查现在需要通过 SSLCARevocationCheck
显式配置。mod_substitute
: 最大行长现在限制为 1MB。mod_reqtimeout
: 如果加载了该模块,它现在将设置一些默认超时。mod_dumpio
: DumpIOLogLevel
不再受支持。数据始终以 LogLevel
trace7
记录。ErrorLog
或 CustomLog
配置的管道日志命令在 2.2 及更早版本中使用 /bin/sh -c
调用。在 2.4 及更高版本中,管道日志命令直接执行。要恢复旧的行为,请参阅 管道日志记录文档。mod_autoindex
: 现在将提取标题并显示 .xhtml 文件的描述,这些文件以前被忽略。mod_ssl
: *_DN
变量的默认格式已更改。旧格式仍然可以使用 SSLOptions
的新 LegacyDNStringFormat
参数。SSLv2 协议不再受支持。 SSLProxyCheckPeerCN
和 SSLProxyCheckPeerExpire
现在默认设置为 On,导致代理请求具有错误或过时证书的 HTTPS 主机以 502 状态代码 (错误网关) 失败。htpasswd
现在在所有平台上默认使用 MD5 哈希。NameVirtualHost
指令不再有任何作用,除了发出警告。出现在多个虚拟主机中的任何地址/端口组合都隐式地被视为基于名称的虚拟主机。mod_deflate
现在将跳过压缩,如果它知道压缩添加的大小开销大于要压缩的数据。mod_include
的 #if expr=
元素的新语法,或者为包含错误文档的目录启用了指令 SSILegacyExprParser
。mod_authn_alias
提供的功能(即 AuthnProviderAlias
指令)已移至 mod_authn_core
。LogLevel
指令为 mod_rewrite
模块配置适当的日志记录级别来提供。另请参阅 mod_rewrite 日志记录 部分。所有模块必须在加载之前为 2.4 重新编译。
许多为 2.2 版本设计的第三方模块将在 Apache HTTP Server 2.4 版本中保持不变。有些需要更改;请参阅 API 更新 概述。
Invalid command 'User', perhaps misspelled or defined by a module not included in the server configuration
- 加载模块 mod_unixd
Invalid command 'Require', perhaps misspelled or defined by a module not included in the server configuration
,或 Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration
- 加载模块 mod_access_compat
,或将配置更新为 2.4 授权指令。Ignoring deprecated use of DefaultType in line NN of /path/to/httpd.conf
- 删除 DefaultType
并替换为其他配置设置。Invalid command 'AddOutputFilterByType', perhaps misspelled or defined by a module not included in the server configuration
- AddOutputFilterByType
已从核心移至 mod_filter,必须加载该模块。configuration error: couldn't check user: /path
- 加载模块 mod_authn_core
。.htaccess
文件未被处理 - 检查是否有适当的 AllowOverride
指令;默认值在 2.4 中更改为 None
。