从 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。这些指令已被更具表现力的RequireAnyRequireNoneRequireAll代替。

如果使用mod_authz_dbm,则必须移植配置以使用Require dbm-group ...代替Require group ...

Access control

在 2.2 中,使用指令OrderAllowDenySatisfy进行了基于 Client 端主机名,IP 地址和其他 Client 端请求 Feature 的访问控制。

在 2.4 中,使用新模块mod_authz_host以与其他授权检查相同的方式完成这种访问控制。尽管为了与旧配置兼容,提供了新的模块mod_access_compat,但旧的访问控制习惯用法应替换为新的身份验证机制。

Mixing old and new directives

从技术上讲,可以将OrderAllowDeny之类的旧指令与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仅接受OnOff的值。以前,“ Off”或“ 0”以外的任何值都被视为“ On”。

  • 指令 AcceptMutex,LockFile,RewriteLock,SSLMutex,SSLStaplingMutex 和 WatchdogMutexPath 已替换为单个Mutex指令。您将需要评估在 2.2 配置中对这些已删除指令的使用情况,以确定它们是否可以删除或是否需要使用Mutex进行替换。

  • mod_cacheCacheIgnoreURLSessionIdentifiers现在对查询字符串进行完全匹配,而不是部分匹配。如果您的配置使用的是部分字符串,例如使用sessionid匹配/someapplication/image.gif;jsessionid=123456789,则需要更改为完整字符串jsessionid

  • mod_cacheCacheEnable的第二个参数仅在以正确协议开头时才匹配转发代理内容。在 2.2 及更早版本中,参数'/'匹配所有内容。

  • mod_ldapLDAPTrustedClientCert现在始终是按目录设置。如果使用此指令,请检查您的配置以确保它存在于所有必要的目录上下文中。

  • mod_filterFilterProvider语法已更改,现在使用布尔表达式来确定是否应用了过滤器。

  • mod_include:

  • #if expr元素现在使用新的expression parser。可以使用新的伪指令SSILegacyExprParser恢复旧语法。

    • 目录范围内的 SSI * config 指令不再导致所有其他按目录的 SSI *指令重置为其默认值。
  • mod_charset_lite:已删除DebugLevel选项,以支持按模块LogLevel配置。

  • mod_ext_filter:已删除DebugLevel选项,以支持按模块LogLevel配置。

  • mod_proxy_scgiPATH_INFO的默认设置已从 httpd 2.2 更改,并且某些 Web 应用程序将无法通过新的PATH_INFO设置正常运行。可以通过配置proxy-scgi-pathinfo变量来恢复先前的设置。

  • mod_ssl:现在需要通过SSLCARevocationCheck显式配置基于 CRL 的吊销检查。

  • mod_substitute:现在最大行长度限制为 1MB。

  • mod_reqtimeout:如果模块已加载,则它将设置一些默认超时。

  • mod_dumpioDumpIOLogLevel不再受支持。数据始终记录在LogLevel trace7处。

  • 在 Unix 平台上,使用ErrorLogCustomLog配置的管道记录命令是在 2.2 及更早版本中使用/bin/sh -c调用的。在 2.4 及更高版本中,管道记录命令直接执行。要恢复旧的行为,请参见管道记录文档

Misc Changes

  • mod_autoindex:现在将提取.xhtml 文件的标题并显示描述,这些文件以前被忽略。

  • mod_ssl*_DN变量的默认格式已更改。旧格式仍可以与SSLOptions的新LegacyDNStringFormat参数一起使用。不再支持 SSLv2 协议。 SSLProxyCheckPeerCNSSLProxyCheckPeerExpire现在默认设置为“开”,导致对具有错误或过期证书的 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_unixd

    • Invalid command 'Require', perhaps misspelled or defined by a module not included in the server configurationInvalid 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