RHEL 上的 Chef Apache2 配方:默认配方中未定义服务器名称

Posted

技术标签:

【中文标题】RHEL 上的 Chef Apache2 配方:默认配方中未定义服务器名称【英文标题】:Chef Apache2 recipe on RHEL: ServerName not defined in the default recipe 【发布时间】:2014-04-17 10:03:39 【问题描述】:

我正在使用 Chef 在 Rackspace 上构建虚拟机。 VM 是一个 RHEL 6.5 机器。

我在使用 Apache2 配方为 RHEL 构建默认的 Apache2 /etc/httpd/conf/httpd.conf 文件时遇到问题(它似乎默认为 Ubuntu 风格的配置)。

在配方配置模板 (apache2/templates/default/apache2.conf.erb) 中没有定义 ServerName 的地方。因此,当我测试 Apache 是否正常工作时,我得到以下信息

% apachectl configtest
httpd: Could not reliably determine the server's fully qualified domain name, using ##### for ServerName
Syntax OK

其中##### 是我的DNS,在我的/etc/hosts 中列出,并在我的食谱attributes/default.rb 文件中定义为servername

如果我查看配方模板,我看不到变量 ServerName 的任何位置(前 17 行):

#
# Generated by Chef
#
# Based on the Ubuntu apache2.conf

ServerRoot "<%= node['apache']['dir'] %>"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
<% if %w[debian].include?(node['platform_family']) -%>
LockFile /var/lock/apache2/accept.lock
<% elsif %w[freebsd].include?(node['platform_family']) -%>
LockFile /var/log/accept.lock
<% else %>
LockFile logs/accept.lock
<% end -%>

现在,如果我手动编辑/etc/httpd/conf/httpd.conf,添加ServerName 变量,一切正常。前后相关:

之前

#
# Generated by Chef
#
# Based on the Ubuntu apache2.conf

ServerRoot "/etc/httpd"

之后

#
# Generated by Chef
#
# Based on the Ubuntu apache2.conf

ServerRoot "/etc/httpd"
ServerName #####:80

现在当我测试 Apache 时:

% apachectl configtest
Syntax OK

显然,使用 Chef 的全部意义在于而不是手动编辑配置文件,每当我使用 chef-solo 重新运行我的厨师食谱时,我都会破坏这个自定义离开。我对 Chef 太陌生了,我真的不想在 Github 上 fork 食谱并为 RHEL 制作新模板,但也许这就是我需要做的?

我希望我的整体配方中只有一个配置设置我没有定义,它将将此变量添加到我的核心 Apache httpd.conf 文件中。

希望对 Chef 有更多经验的人,尤其是 Apache2 食谱,可以帮助我。提前致谢。

编辑#1

查看netstat -tulpn 表明我认为 Apache (httpd) 确实在工作,或者至少正在侦听端口 80:

% netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1274/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1677/master         
tcp        0      0 **.***.*.***:3306           0.0.0.0:*                   LISTEN      1585/mysqld         
tcp        0      0 :::80                       :::*                        LISTEN      6663/httpd          
tcp        0      0 :::22                       :::*                        LISTEN      1274/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1677/master

是否越来越像网络 (DNS) 问题?

编辑#2

根据对我原来帖子的帮助,我认为我最初误诊了这一点。我刚刚构建了一个新的 Ubuntu VM 并使用 sudo apt-get install apache2 手动安装了 Apache2(即不使用 chef-solo),我看到了与我的 Chef 配方在我的 RHEL VM 上创建的相同的 apache2 安装布局。我在运行apachectl configtest 时也收到同样的警告:

apache2: Could not reliably determine the server's fully qualified domain name, using ##### for ServerName
Syntax OK

当我将 Ubuntu 上的浏览​​器指向 127.0.0.1:80 时,我看到“它可以工作了!”标准的 Apache 响应。所以,我的问题并不是真正的问题。我现在的想法是,这是一个网络问题。 iptables?

编辑#3

我刚刚通过 ssh 连接到我的 RHEL 虚拟机并安装了 Firefox。然后我打开它并将其指向 127.0.0.1:80,我得到了默认页面。我认为这绝对证实了我有 DNS 问题。是时候与我的网络管理员交谈了。

【问题讨论】:

问题比我想象的要深。 apache2 Chef 食谱专门针对 Apache 2 的 Debian/Ubuntu 风格安装,这意味着虚拟主机文件安装在 /etc/httpd/sites-available/ 下而不是 /etc/httpd/conf.d/ 下。我想我得自己写食谱了……真可惜…… 嗯。我实际上收回了这一点。在 attributes/default.rb 的 Apache 2 手册中,有一条 case 语句根据平台类型选择如何安装 apache2。这将选择包是httpd(RHEL 和其他)、apache2(Debian/Ubuntu)还是其他。 apache2 食谱并不假定您使用的是 Debian 系列操作系统,但它确实以 Debian 风格管理 apache 配置——通过使用 (sites|mods)-(available|enabled) 和所有这一切。我发现它比 RHEL/CentOS 做的要好得多(基本上什么都没有),但你可能不同意。 这不只是默认站点的特征,它没有声明ServerName吗?否则它不会停止充当默认站点吗?我经常看到我真正担心的警告消息,但如果 apache 无法解析其自己的主机名(反向查找 IP 地址?只是猜测),情况并非如此。 是的,this question 有正确的答案。没关系,如果发出此警告并且它是作为无法确定自己的主机名而发出的。 Apache 正在运行,因为这只是一个警告。 【参考方案1】:

根据用户 cassianoleal 和 StephenKing 提供的帮助,这个“错误”实际上是一个红鲱鱼。这只是一个 Apache 警告,对 httpd 是否实际运行没有影响。

问题在于我没有更新我的iptables 配置。一旦我安装了 Chef 食谱 simple_iptables 并在我的 Chef 食谱中添加了 simple_iptables_rule 以更新我的 iptables 以侦听端口 80 和 443,一切正常。

我猜是生活和学习。

作为记录,如果您还没有使用 Chef,强烈推荐它!

【讨论】:

这为我省去了很多麻烦。谢谢!虽然现在也有一本普通的iptables 食谱。 @Derek - 很高兴这为您节省了一些时间和麻烦!

以上是关于RHEL 上的 Chef Apache2 配方:默认配方中未定义服务器名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Chef 配方设置环境变量?

安装 Postgresql 时 AWS Opsworks Chef 配方失败

如果该源文件存在,如何编写Chef配方来复制文件? only_if后卫不工作

捕获shell输出时,Chef编译错误

如何在命令行中捕获值并添加到配方中?

获取中厨运行的目录列表