我想使用-f
Apache 服务器的命令行选项,以便可以存储会议文件放在与服务器二进制文件不同的位置(数据目录)。
问题是我使用 Include 指令来分离和组织配置,但是当我使用类似的命令时Include "addons/SVN.conf"
,它会失败,因为 Apache 会相对于 ServerRoot 目录而不是 ServerConfigFile 目录查找 addons/SVN.conf。
我可以通过使用绝对路径来解决这个问题(例如Include "e:\foo\bar\baz\Apache\conf\addons\svn.conf"
,但我不喜欢这样,因为这意味着如果我移动 conf 文件夹,我必须更改每个 Include 指令,而不是简单地更改 -f 选项。
有谁知道让 Include 指令相对于 Apache 传递的 conf 文件工作的方法吗?我试过了Include "./addons/SVN.conf"
,但那也是相对于 ServerRoot 的。这种强制相对于 ServerRoot 的 Include 行为有点违背了指定 ServerRoot/conf 中配置文件的替代配置文件的整个目的。
谢谢。
答案1
好的,我明白了(谢谢约斯基建议改变服务器根目录,这是解决方案的一部分)。
我有两个与 Apache 相关的位置,例如:
Y:\Servers\HTTP\Apache
- 二进制文件
X:\Docs\Settings\Apache
- 配置文件
所以我做的是:
我将
conf
和logs
目录从二进制目录移到了文档目录…Settings\Apache\conf
。httpd配置文件几乎等同于httpd.conf.默认。它有以下条目:ServerRoot "Y:\Servers\HTTP\Apache"
#像平常一样然后在文件底部我添加了
ServerRoot "X:\Docs\Settings\Apache"
- 更改 ServerRoot
Include "conf/Includes.conf"
- 包括自定义下一步就是编辑我的几个包括-ed .conf 文件使用加载模块,并传递.so 文件的完整路径。
如果我的自定义 .conf 文件中有很多 LoadModule 调用,而不是使用绝对路径,我会做的是创建两个新的 .conf 文件,(例如BinLoc配置文件和ConfLoc.conf)每个都包含一个服务器根目录指令将其设置为 binary/docs 目录。然后我可以像这样包装 LoadModule 调用:
Include "conf/BinLoc.conf"
LoadModule ssl_module modules/mod_ssl.so
Include "conf/ConfLoc.conf"
(不幸的是,第二个 Include 必须使用设置目录的绝对路径,因此这会有点违背目的。)
最后,我设置 Apache 来加载httpd配置文件从我的 docs 目录中下载文件(即 load
X:\Docs\Settings\Apache\httpd.conf
)。有几种方法可以做到这一点。安装程序使用配置参数Apache 服务的注册表项,但我决定不使用它,并将其清空。我尝试设置HKLM\SOFTWARE\Apache 软件基金会\Apache\2.2.15\ServerRoot,X:\Docs\Settings\Apache
但 Apache 似乎没有识别到。我决定使用命令行。我修改了我的安装.bat这样当它创建 Apache 服务时,它会传递httpd配置文件使用-f
参数的文件(编辑批处理文件比修改注册表中的多字符串更容易/更快)。
事实上,我已经使用-f
之前的方式传递了 .conf 文件,所以最终唯一需要做的更改(除了将文件夹移动到我的 docs 目录之外)是添加一个额外的服务器根目录指令httpd配置文件重置配置目录并更改非默认(即自定义).conf 文件中的几个 LoadModule 指令以使用绝对路径(但如果有很多,我可以将其设置回二进制文件。
Apache 现在运行良好,并且(可替换的)二进制文件和(不可替换的)配置文件都很好且独立。:)
(哦,日志在其他地方,例如X:\Docs\Logs\Apache
。日志相关的条目在httpd配置文件使用绝对路径,但如果我要更改日志目录,只需在文件中搜索并替换即可更新,就像使用绝对路径一样加载模块如果我改变了二进制文件的位置,我的自定义 .conf 文件中的指令。)
答案2
只需设定服务器根目录到您需要的目录或使用-d
命令行参数。该ServerRoot
指令不必指向包含 Apache httpd 的二进制文件和库的目录。