Apache 如何查看完整的httpd配置?

Apache 如何查看完整的httpd配置?,apache,centos,apache2,webserver,server,Apache,Centos,Apache2,Webserver,Server,我试图弄清楚什么是httpd设置的完整配置 所有配置文件分散在不同的文件中(/etc/httpd/conf.d、httpd.conf、各种mod config) 有没有办法列出最终的httpd配置? 与单个文件中的整个运行安装配置一样?如arco444所述,您可以使用apachectl-S显示当前从配置运行的虚拟主机的概览,和apachectl-M来显示所有当前加载的模块-我不知道有什么工具可以在启动httpd时显示所有解析的配置的详细输出(以及它们解析的顺序),但我建议您熟悉httpd配置文件

我试图弄清楚什么是httpd设置的完整配置

所有配置文件分散在不同的文件中(/etc/httpd/conf.d、httpd.conf、各种mod config)

有没有办法列出最终的httpd配置?

与单个文件中的整个运行安装配置一样?

如arco444所述,您可以使用
apachectl-S
显示当前从配置运行的虚拟主机的概览,和
apachectl-M
来显示所有当前加载的模块-我不知道有什么工具可以在启动httpd时显示所有解析的配置的详细输出(以及它们解析的顺序),但我建议您熟悉httpd配置文件的一般结构

您的问题需要特别注意的是:“主”apache配置文件位于
/etc/httpd/conf/httpd.conf
(CentOS 6中包含的repos的默认httpd安装的第221行区域,我假设您是根据post标记使用的),“补充”配置文件位于
/etc/httpd/conf.d
中,需要明确包含在主配置文件中。例如,如果您在
httpd.conf
文件中搜索术语“
Include
”,您将发现行
Include conf.d/*.conf
,它按字母顺序包含子目录
conf.d
中所有扩展名为
.conf
的文件,因此,如果可能的话,您需要在某个时候熟悉配置文件解析的重要性

另一方面,如果您使用的是基于shell的文本编辑器(如vim),我建议您在默认情况下启用行号和语法高亮显示,以便这样长的配置文件更易于自己解析和导航-对于vim,您可以在主目录中创建一个名为
.vimrc
(或附加到现有行)并添加以下行:

set nu
syntax on

为此,请使用mod_信息:

唯一的缺点是,如果您需要它来恢复已删除的配置,并且还没有加载模块,它将不会对您有多大帮助,如中所述

如果设置了config define-DDUMP\u config,mod\u info将转储 在服务器启动期间对标准输出进行预解析的配置

httpd -DDUMP_CONFIG -k start
DUMP\u CONFIG
需要启用
mod\u 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)生成的指令可能不会列出

当我不得不维护太多的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执行。

我有一个脚本(唉,在Perl中;请原谅,它是旧的)可以展平配置文件,删除注释(默认情况下)并包含
#FILE
注释,以便您可以确定哪个文件包含您可能要查找的内容

我已经用apachehttpd编写了它,尽管它也被用于Oracle OHS

特别适用于使用SSH和diff/meld/etc比较不同机器上的配置

例如:

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(CLI)和meld(GUI)的示例:


diff-Bb
apachectl-S
对于运行配置,
apachectl-M
显示加载的模块,除了
apachectl-S
既不提供“完整配置”,也不提供“单个文件中的整个运行设置配置”.related:Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎与主题无关,因为它与编程或开发无关。请参阅帮助中心。也许,或者是一个更好的提问地方。@imme我觉得你的第一个“相关”问题很有趣链接就是这个问题。我也觉得很有趣的是,你在所有引用的链接上复制/粘贴了相同的评论。有趣的是:)我们在CentOS上使用的是apache 2.2。但是,apachectl不可用。它不支持IncludeOptional指令。
diff -Bb <(httpd-dump-config) <(ssh root@revproxy2 httpd-dump-config)

meld <(httpd-dump-config) <(ssh root@revproxy2 httpd-dump-config) &