如何查看完整的httpd配置?

106

我正在试图弄清楚httpd安装的完整配置。

所有配置文件都散布在不同的文件中(/etc/httpd/conf.d、httpd.conf、各种模块配置)。

有没有一种方法可以列出最终的httpd配置?
就像在单个文件中列出整个运行设置配置一样?


14
运行命令 apachectl -S 可以查看当前的配置文件,而运行命令 apachectl -M 可以显示已加载的模块。 - arco444
11
apachectl -S 命令并不能提供 "完整的配置文件" 或者 "单个文件中的全部运行设置配置"。 - Frederick Nord
1
相关内容: https://dev59.com/9F4d5IYBdhLWcg3wHPc9 https://superuser.com/questions/922869 https://unix.stackexchange.com/questions/129026 https://serverfault.com/questions/425894 https://serverfault.com/questions/696164 https://serverfault.com/questions/500329 https://serverfault.com/questions/489018 https://serverfault.com/questions/42539http://httpd.apache.org/docs/current/mod/mod_info.html http://httpd.apache.org/docs/current/invoking.html - imme
1
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎与编程或开发无关。请参阅帮助中心中的“我可以在这里问什么话题”(http://stackoverflow.com/help/on-topic)。也许[Web应用程序堆栈交换](http://webapps.stackexchange.com/),[Webmaster Stack Exchange](http://webmasters.stackexchange.com/)或[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)会是更好的提问地点。 - jww
3
@imme 我觉得很有趣,你的第一个“相关”链接就是这个问题。我也觉得很有趣,你在所有引用的链接上都复制/粘贴了相同的评论。挺好笑的 :) - Hickory420
在那个时候,复制粘贴可能是最容易的。我有点想念(或者不知道如何)在S.O.系统中进行某种链接/关联的可能性。而且所有这些都要在一分钟内完成 ;) - imme
6个回答

58

正如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

我们在CentOS上使用apache 2.2。然而,apachectl不可用。 - user674669

38

正如Apache HTTP Server文档所述

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)生成的指令可能未被列出。

2
很棒的答案。为了完整起见: apache2ctl -DDUMP_CONFIG -t 可用于无需 root 权限的干运行。 - TheMadsen
在RHEL/AMI上,相应的命令是sudo apachectl -DDUMP_CONFIG - bathyscapher
如果您的配置中未启用mod_info(在正确配置时存在安全问题),可以通过使用-C 选项LoadModule指令来加载它。在我的情况下,我使用:-t -C "LoadModule info_module modules/mod_info.so" -D DUMP_CONFIG - undefined

17

4

我有一个脚本(遗憾的是,用的是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(CLI)和 meld(GUI)的示例:
diff -Bb <(httpd-dump-config) <(ssh root@revproxy2 httpd-dump-config)

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

多年来,当我需要浏览一个分散在许多文件中的成千上万行配置时,我经常使用这个工具。


它不支持IncludeOptional指令。 - Der_Meister
或者使用(但这也可以被视为一个特性)。另一方面,-DDUMP_CONFIG会展开宏。 - András Korn

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
在/etc目录中有一个主配置文件夹。
cd /etc/httpd

有多个配置文件夹。
[root@server httpd]# ls
conf  conf.d  conf.modules.d  logs  modules  run  state

使用-R参数以递归方式查看详细文件。
[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]#

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接