我正在试图弄清楚httpd安装的完整配置。
所有配置文件都散布在不同的文件中(/etc/httpd/conf.d、httpd.conf、各种模块配置)。
有没有一种方法可以列出最终的httpd配置?
就像在单个文件中列出整个运行设置配置一样?
正如arco444所指出的那样,您可以使用apachectl -S
来显示当前从配置中运行的VirtualHosts概述,以及apachectl -M
来显示所有当前加载的模块。我不知道是否有工具可以显示启动httpd时解析的所有配置的详细输出(以及它们被解析的顺序),但是我建议您熟悉httpd配置文件的一般结构:
特别要注意的是,'main' Apache配置文件位于/etc/httpd/conf/httpd.conf
(在默认的httpd安装包中,位于关于221行附近,该安装包包含在CentOS 6的repos中,我假设您正在使用基于您的帖子标签),而'supplementary'配置文件位于/etc/httpd/conf.d
并需要在主配置文件中明确包含。例如,如果您在httpd.conf
文件中搜索术语'Include
',您将找到行Include conf.d/*.conf
,它包括子目录conf.d
中所有扩展名为.conf
的文件,按字母顺序排序,因此您需要在可能的某个时候熟悉配置文件解析的重要性。
顺便说一句,如果您正在使用像vim这样的基于shell的文本编辑器,我建议您默认启用行编号和语法突出显示,以便这些冗长的配置文件更容易自己解析和导航 - 在vim的情况下,您可以通过创建一个名为.vimrc
的文件并添加以下行(或追加到现有文件中)来实现:
set nu
syntax on
If the config define -DDUMP_CONFIG is set, mod_info will dump the pre-parsed configuration to stdout during server startup.
httpd -DDUMP_CONFIG -k start
DUMP_CONFIG
需要启用mod_info
:执行a2enmod info
命令开启它!
在Ubuntu中,请按照以下步骤进行操作:
sudo apache2ctl -DDUMP_CONFIG
如果您想要去掉行号,请执行以下操作
sudo apache2ctl -DDUMP_CONFIG | grep -vE "^[ ]*#[ ]*[0-9]+:$"
或者重定向到一个文件
sudo apache2ctl -DDUMP_CONFIG | grep -vE "^[ ]*#[ ]*[0-9]+:$" > /path/to/dump.conf
已知限制
mod_info通过读取解析后的配置信息来提供其信息,而不是读取原始配置文件。由于解析配置树的方式存在一些限制:
- 立即执行而不是存储在解析配置中的指令未列出,包括ServerRoot、LoadModule和LoadFile。
- 控制配置文件本身的指令,例如Include和,未列出,但包含的配置指令会被列出。
- 注释没有被列出。(这可能被视为一个特性.)
- 来自.htaccess文件的配置指令未被列出(因为它们不是永久的服务器配置的一部分)。
- 容器指令(例如)通常会列出,但mod_info无法找到关闭标签的行号。
- 第三方模块(如mod_perl)生成的指令可能未被列出。
我有一个脚本(遗憾的是,用的是Perl;请原谅,它有些老旧),可以将配置文件展平,删除注释(默认情况下),并包括# FILE
注释,以便您可以找到包含您正在查找的内容的文件。
我使用Apache httpd编写了它,虽然也可以在Oracle OHS中使用。
https://github.com/cameronkerrnz/scriptorium/blob/master/httpd-dump-config
特别适用于使用SSH和diff/meld等工具比较不同机器上的配置。
例如:
httpd-dump-config | grep -i -e '# FILE:' -e servername -e serveralias
# FILE: /etc/httpd/conf/maintenance-curtain.conf
# FILE: /etc/httpd/conf.d/proxy.conf
# FILE: /etc/httpd/otago/secure-www.alias.conf
# FILE: /etc/httpd/conf.d/proxy.conf
ServerName www.otago.ac.nz
ServerAlias otago.ac.nz
diff -Bb <(httpd-dump-config) <(ssh root@revproxy2 httpd-dump-config)
meld <(httpd-dump-config) <(ssh root@revproxy2 httpd-dump-config) &
多年来,当我需要浏览一个分散在许多文件中的成千上万行配置时,我经常使用这个工具。
宏
和使用
(但这也可以被视为一个特性)。另一方面,-DDUMP_CONFIG
会展开宏。 - András Korn当我需要维护太多的Apache配置时,我会准备一个脚本来完成你所要求的任务。这对我帮助很大。
awk -v pc=$APCALL '
NR == 1 {
if (pf != "") {
print "### End of " pf " ###"
}
print "### " FILENAME " ###"
pf = FILENAME
}
{ if (pc || ( $1 !~ "^#" && $0 != "" ) ) {
printf "%5d %s\n", NR, $0
}
}
$1 ~ /^Include(Optional)?$/ {
$1 = ""
system("for ACF in " $0 "; do apache_config.sh $ACF; done" )
}
END {
print "### End of " pf " ###"
}
' "$@"
如果您想查看注释和空行,可以设置APCALL环境变量,但我大多数情况下不需要。注意:它必须从ServerRoot执行。
cd /etc/httpd
[root@server httpd]# ls
conf conf.d conf.modules.d logs modules run state
[root@server httpd]# ls -R
.:
conf conf.d conf.modules.d logs modules run state
./conf:
httpd.conf magic
./conf.d:
autoindex.conf README userdir.conf welcome.conf
./conf.modules.d:
00-base.conf 00-brotli.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-optional.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf 10-h2.conf 10-proxy_h2.conf README
[root@server httpd]#
apachectl -S
可以查看当前的配置文件,而运行命令apachectl -M
可以显示已加载的模块。 - arco444apachectl -S
命令并不能提供 "完整的配置文件" 或者 "单个文件中的全部运行设置配置"。 - Frederick Nord