如何查看完整的httpd配置?


79

我试图找出什么是httpd安装程序的完整配置。

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

有没有办法列出最终的httpd配置?
像单个文件中的整个运行安装程序配置一样?


12
apachectl -S用于运行配置,apachectl -M以显示已加载的模块
arco444,2014年

5
除此之外,apachectl -S它不会给您“完整的完整配置”或“单个文件中的完整运行安装程序配置”。
弗雷德里克·诺德


堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎与主题无关,因为它与编程或开发无关。请在帮助中心中查看我可以询问哪些主题。也许Web应用程序堆栈交换网站管理员堆栈交换Unix&Linux堆栈交换是一个更好的选择。
jww

@imme我觉得这很有趣,您的第一个“相关”链接是怎么回事。对于您引用的所有链接都复制/粘贴了相同的评论,我也感到非常有趣。搞笑:)
Hickory420 '19

Answers:


50

如arco444所述,您可以apachectl -S用来显示当前正在配置中运行的VirtualHosts的概述,以及apachectl -M显示所有当前已加载的模块-我不知道用于显示所有已解析配置的详细输出(以及顺序如何)的工具。它们在httpd启动时被解析),但我建议您熟悉httpd配置文件一般结构

需要特别注意的问题是:“主要” apache配置文件位于/etc/httpd/conf/httpd.conf(位于CentOS 6中包含的存储库中默认httpd安装的第221行区域中,我假设您使用的是post标签),并且“辅助”配置文件位于/etc/httpd/conf.d主配置文件中,并且需要明确包含在主配置文件中。例如,如果您在httpd.conf文件中搜索术语“ Include”,则会发现该行Include conf.d/*.conf包括.conf子目录中所有扩展名的文件conf.d-按字母顺序排列,因此您需要熟悉配置文件解析的重要性,网址为如果可能的话。

顺便说一句,如果您使用的是基于外壳的文本编辑器(如vim),建议您默认启用行编号和语法高亮显示,这样冗长的配置文件就更容易解析和导航了(在vim的情况下) ,您可以通过在主目录中创建一个文件.vimrc(或附加到现有文件)并添加以下几行来做到这一点:

set nu
syntax on

我们在CentOS上使用的是Apache 2.2。但是,apachectl不可用。
user674669

16

Apache HTTP Server文档中所述

如果设置了config define -DDUMP_CONFIG,则mod_info将在服务器启动期间将预先解析的配置转储到stdout。

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无法确定close的行号。
  • 由第三方模块(例如mod_perl)生成的指令可能不会列出。

14

为此,请使用mod_info:http ://httpd.apache.org/docs/2.2/mod/mod_info.html

唯一的缺点是,如果您需要它来恢复已删除的配置并且还没有加载模块,那么它对您没有太大帮助


0

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


0

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

我已经用Apache httpd编写了它,尽管它也可以在Oracle OHS中使用

https://github.com/cameronkerrnz/scriptorium/blob/master/httpd-dump-config

在比较使用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 <(httpd-dump-config) <(ssh root@revproxy2 httpd-dump-config)

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

多年来,当导航配置时,已经在很多文件上使用了数千行配置,因此我已经使用了很多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.