自由的BSD操作系统中Apache的配置文件的变化
当我升级子版本控制系统时,pkg audit,导致mod_dav_svn无法加载到apache上,并且apache无法启动。现在我需要了解原因并采取相应措施。
环境
-
- FreeBSD 9(10でも同じはず)
-
- apache22 2.2.29_2
- subversion 1.8.13
现象
当尝试启动Apache时,会出现以下错误。
Performing sanity check on apache22 configuration:
Syntax error on line 309 of /usr/local/etc/apache22/ssl.conf:
Unknown DAV provider: svn
由于似乎加载了mod_dav_svn,因此将LoadModule添加到httpd.conf后,以下错误发生了变化。
Performing sanity check on apache22 configuration:
Syntax error on line 312 of /usr/local/etc/apache22/ssl.conf:
Invalid command 'AuthzSVNAccessFile', perhaps misspelled or defined by a module not included in the server configuration
出现原因
在 /usr/local/etc/apache22/modules.d 这个目录下,出现了两个文件,分别是 220_subversion.conf 和 220_subversion.conf.sample。
我查看了它们的内容,里面写着与 mod_dav_svn 相关的 LoadModule 和设置的示例(但都被注释掉了)。
然而,从 httpd.conf 文件中并没有读取这个文件。
我在另一台安装了 apache24 而不是 apache22 的主机上进行了检查,找到了以下行,它们出现在 LoadModule 的后面。
# Third party modules
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf
嗨,看起来现在不仅读取位于 /usr/local/etc/apacheXX/Includes 的文件,还开始读取 /usr/local/etc/apacheXX/modules.d 中的文件。
我认为这个话题应该在/usr/ports/UPDATING中进行讨论,但我只找到了以下相关内容。
20140713:
AFFECTS: users of www/apache22
AUTHOR: ohauer@FreeBSD.org
The default version was changed from www/apache22 to www/apache24,
pre-build apache modules and web applications will also reflect this!
In case ports are build by yourself and apache22 is required
use the following command to keep apache22 as default.
# echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
我没有修改make.conf文件,但那可能是原因吗?
应对措施 duì cuò shī)
如果将之前的apache24配置添加到apache22的httpd.conf中,将会出现以下错误。
Performing sanity check on apache22 configuration:
Syntax error on line 302 of /usr/local/etc/apache22/httpd.conf:
Invalid command 'IncludeOptional', perhaps misspelled or defined by a module not included in the server configuration
根据调查,看起来 IncludeOptional 是从 Apache 2.3.6 版本后引入的,所以将其修正为 Include。
# Third party modules
Include etc/apache22/modules.d/[0-9][0-9][0-9]_*.conf
顺便提一下,Include和IncludeOptional之间的区别是,如果没有与通配符匹配的文件,则IncludeOptional不会报错。由于我们知道文件是存在的,所以在这种情况下使用Include就没问题。
接下来,需要取消modules.d文件中的注释,并启用LoadModule。
LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so
LoadModule dontdothat_module libexec/apache22/mod_dontdothat.so
快点升级到Apache 2.4吧……