【问题标题】:How can I view the complete httpd configuration?如何查看完整的 httpd 配置?
【发布时间】:2015-01-25 00:06:57
【问题描述】:

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

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

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

【问题讨论】:

标签: apache centos apache2 webserver server


【解决方案1】:

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

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

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

set nu
syntax on

【讨论】:

  • 我们在 CentOS 上使用 apache 2.2。但是,apachectl 不可用。
【解决方案2】:

Apache HTTP Server Documentation中所述

如果设置了配置定义 -DDUMP_CONFIG,mod_info 将转储 在服务器启动期间预解析配置到标准输出。

httpd -DDUMP_CONFIG -k start

DUMP_CONFIG 需要 mod_infoenabled: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)生成的指令。

【讨论】:

  • 很好的答案。为了完整起见: apa​​che2ctl -DDUMP_CONFIG -t 可用于不需要 root 权限的试运行
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我有一个脚本(唉,在 Perl 中;原谅我,它是旧的),它会扁平化配置文件,删除 cmets(默认情况下)并包含 # FILE cmets,这样您就可以确定哪个文件包含您可能是的东西正在寻找。

    我已经用 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) &
    

    多年来,我在导航配置时经常使用它,其中包含分布在许多文件中的数千行配置。

    【讨论】:

    • 不支持 IncludeOptional 指令。
    【解决方案5】:

    当我不得不维护太多 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  " ###"
      }
    ' "$@"
    

    如果您想查看 cmets 和空行,您可以设置 APCALL 环境变量,而我大多没有这样做。警告:它必须从 ServerRoot 执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2022-01-15
      相关资源
      最近更新 更多