On this page
从 2.2 升级到 2.4
为了帮助人们进行升级,我们维护了一个文档,该文档描述了对现有 Apache HTTP Server 用户至关重要的信息。这些只是简要说明,您应该能够在New Features文档或src/CHANGES
文件中找到更多信息。应用程序和模块开发人员可以在API updates概述中找到 API 更改的摘要。
本文档描述了服务器行为的更改,这些更改可能需要您更改配置或使用服务器的方式,以便 continue 使用 2.4(如当前使用的 2.2)。要利用 2.4 中的新功能,请参阅“新功能”文档。
本文仅描述从 2.2 到 2.4 的更改。如果您要从 2.0 版升级,则还应咨询2 .0 到 2.2 升级文档。
编译时配置更改
编译过程与 2.2 版中使用的过程非常相似。在大多数情况下,可以使用旧的configure
命令行(在已安装的服务器目录的build/config.nice
中找到)。默认设置中有一些更改。更改的一些细节:
这些模块已被删除:mod_authn_default,mod_authz_default,mod_mem_cache。如果您在 2.2 中使用 mod_mem_cache,请在 2.4 中查看mod_cache_disk。
所有负载平衡实现都已移至各个独立的 mod_proxy 子模块,例如mod_lbmethod_bybusyness。您可能需要构建和加载配置中使用的任何这些。
对 BeOS,TPF 甚至更旧的平台(例如 A/UX,Next 和 Tandem)的平台支持已被删除。这些被认为还是被 break 了。
配置:默认情况下构建动态模块(DSO)
configure:默认情况下,仅加载基本模块集。其他
LoadModule
指令在配置文件中被 Comments 掉。配置:默认情况下会构建“最”模块集
配置:“ reallyall”模块集将开发者模块添加到“ all”集
运行时配置更改
授权配置中已进行了重大更改,而其他一些次要配置更改也可能需要更改 2.2 配置文件,然后才能将其用于 2.4.
Authorization
使用授权的任何配置文件都可能需要更改。
您应该查看身份验证,授权和访问控制方法,尤其是超越授权部分,该部分解释了用于控制应用授权指令 Sequences 的新机制。
删除了控制授权模块在与身份验证的用户不匹配时如何响应的指令:这包括 AuthzLDAPAuthoritative,AuthzDBDAuthoritative,AuthzDBMAuthoritative,AuthzGroupFileAuthoritative,AuthzUserAuthoritative 和 AuthzOwnerAuthoritative。这些指令已被更具表现力的RequireAny,RequireNone和RequireAll代替。
如果使用mod_authz_dbm,则必须移植配置以使用Require dbm-group ...
代替Require group ...
。
Access control
在 2.2 中,使用指令Order,Allow,Deny和Satisfy进行了基于 Client 端主机名,IP 地址和其他 Client 端请求 Feature 的访问控制。
在 2.4 中,使用新模块mod_authz_host以与其他授权检查相同的方式完成这种访问控制。尽管为了与旧配置兼容,提供了新的模块mod_access_compat,但旧的访问控制习惯用法应替换为新的身份验证机制。
Mixing old and new directives
从技术上讲,可以将Order,Allow或Deny之类的旧指令与Require之类的新指令混合使用,但不建议这样做。创建mod_access_compat是为了支持仅包含旧指令的配置,以促进 2.4 升级。请检查以下示例,以更好地了解可能出现的问题。
以下是执行相同访问控制的旧方法和新方法的一些示例。
在此示例中,没有身份验证,并且所有请求都被拒绝。
2.2 configuration:
Order deny,allow
Deny from all
2.4 configuration:
Require all denied
在此示例中,没有身份验证,并且所有请求都被允许。
2.2 configuration:
Order allow,deny
Allow from all
2.4 configuration:
Require all granted
在以下示例中,不进行身份验证,并且 example.org 域中的所有主机都被允许访问;所有其他主机都被拒绝访问。
2.2 configuration:
Order Deny,Allow
Deny from all
Allow from example.org
2.4 configuration:
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 即使配置似乎允许它也拒绝访问服务器状态?因为在此配置merge方案中,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 configuration:
# 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
2.4 configuration:
# No replacement of disabling host-based access control needed
AuthType Basic
AuthBasicProvider file
AuthUserFile /example.com/conf/users.passwd
AuthName secure
Require valid-user
在将身份验证和访问控制都有意义地结合在一起的配置中,应该迁移访问控制指令。此示例允许满足以下两个条件的请求:
2.2 configuration:
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
2.4 configuration:
AuthType Basic
AuthBasicProvider file
AuthUserFile /example.com/conf/users.passwd
AuthName secure
<RequireAll>
Require valid-user
Require ip 127.0.0.1
</RequireAll>
在将身份验证和访问控制都有意义地结合在一起的配置中,应该迁移访问控制指令。本示例允许符合以下两个条件的请求:
2.2 configuration:
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
2.4 configuration:
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,它更准确地描述了它的作用。对于event之类的异步 MPM,最大 Client 端数不等于工作线程数。仍然支持旧名称。DefaultType指令不再有效,除了与
none
以外的其他值一起使用时发出警告。您需要使用其他配置设置将其替换为 2.4.AllowOverride现在默认为
None
。EnableSendfile现在默认为关闭。
FileETag现在默认为“ MTime 大小”(不带 INode)。
mod_dav_fs:对于具有 inode 的系统,DavLockDB文件的格式已更改。升级时必须删除旧的DavLockDB文件。
KeepAlive仅接受
On
或Off
的值。以前,“ Off”或“ 0”以外的任何值都被视为“ On”。指令 AcceptMutex,LockFile,RewriteLock,SSLMutex,SSLStaplingMutex 和 WatchdogMutexPath 已替换为单个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语法已更改,现在使用布尔表达式来确定是否应用了过滤器。
#if expr
元素现在使用新的expression parser。可以使用新的伪指令SSILegacyExprParser恢复旧语法。- 目录范围内的 SSI * config 指令不再导致所有其他按目录的 SSI *指令重置为其默认值。
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:现在需要通过SSLCARevocationCheck显式配置基于 CRL 的吊销检查。
mod_substitute:现在最大行长度限制为 1MB。
mod_reqtimeout:如果模块已加载,则它将设置一些默认超时。
mod_dumpio:
DumpIOLogLevel
不再受支持。数据始终记录在LogLeveltrace7
处。在 Unix 平台上,使用ErrorLog或CustomLog配置的管道记录命令是在 2.2 及更早版本中使用
/bin/sh -c
调用的。在 2.4 及更高版本中,管道记录命令直接执行。要恢复旧的行为,请参见管道记录文档。
Misc Changes
mod_autoindex:现在将提取.xhtml 文件的标题并显示描述,这些文件以前被忽略。
mod_ssl:
*_DN
变量的默认格式已更改。旧格式仍可以与SSLOptions的新LegacyDNStringFormat
参数一起使用。不再支持 SSLv2 协议。 SSLProxyCheckPeerCN和SSLProxyCheckPeerExpire现在默认设置为“开”,导致对具有错误或过期证书的 HTTPS 主机的代理请求失败,并带有 502 状态代码(错误网关)htpasswd现在默认在所有平台上使用 MD5 哈希。
NameVirtualHost指令除了发出警告外,不再具有任何作用。出现在多个虚拟主机中的任何地址/端口组合都被隐式视为基于名称的虚拟主机。
如果mod_deflate现在知道压缩所增加的大小开销大于要压缩的数据,它将跳过压缩。
除非将 2.2.x 中的多语言错误文档调整为mod_include的
#if expr=
元素的新语法,或者为包含错误文档的目录启用了指令SSILegacyExprParser,否则它们可能无法工作。以前版本中
mod_authn_alias
提供的功能(即AuthnProviderAlias指令)已移至mod_authn_core。RewriteLog 和 RewriteLogLevel 指令已删除。现在,可以通过使用LogLevel指令为mod_rewrite模块配置适当的日志记录级别来提供此功能。另请参见mod_rewrite logging部分。
第三方模块
加载之前,所有模块都必须重新编译为 2.4.
否则,为版本 2.2 设计的许多第三方模块将与 Apache HTTP Server 版本 2.4 保持不变。有些将需要更改;请参阅API update概述。
升级时的常见问题
Startup errors:
Invalid command 'User', perhaps misspelled or defined by a module not included in the server configuration
-加载模块mod_unixdInvalid 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
。