Puppetlabs-Apache:为虚拟主机启用 80 和 443

Posted

技术标签:

【中文标题】Puppetlabs-Apache:为虚拟主机启用 80 和 443【英文标题】:Puppetlabs-Apache: enable both 80 and 443 for virtualhost 【发布时间】:2017-07-02 18:02:48 【问题描述】:

我对 puppet 比较陌生,目前正在研究“puppetlabs-apache”模块。在虚拟主机上同时设置 ssl 和非 ssl 时我遗漏了一些东西。

已应用清单:

include apache
include apache::mod::rewrite

#apache::vhost  'site.mydomain.com':
# port         => '80',
# docroot      => '/var/www/site',
# rewrite_rule => '(.*) https://site.mydomain.com [R,L]',
#

apache::vhost  'site.mydomain.com':
  port          => '443',
  ssl           => true,
  docroot       => '/var/www/site',
  docroot_owner => 'www-data',
  docroot_group => 'www-data',
#  rewrite_rule  => '(.*) https://site.mydomain.com [R,L]',

问题是我不需要非 ssl(80 端口),但所有请求都应该重定向到 443。

如果我注释掉端口 80 的 site.mydomain.com 的第一个 vhost 定义,则会引发错误:

服务器上的错误 400:重复声明:Apache::Vhost[site2.mydomain.com] 已在文件中声明..

不确定我在这里缺少什么。我应该怎么做才能使这种永久重定向发生?

http://site2.mydomain.com/ => https://site2.mydomain.com/

【问题讨论】:

【参考方案1】:

要配置虚拟主机以将未加密的连接重定向到 SSL,请使用单独的 apache::vhost 定义类型声明它们,并将未加密的请求重定向到启用 SSL 的虚拟主机:

apache::vhost  'site.mydomain.com:80':
  servername      => 'site.mydomain.com',
  port            => '80',
  docroot         => '/var/www/site',
  rewrite_rule    => '(.*) https://site.mydomain.com [R,L]',
  redirect_status => 'permanent',
  redirect_dest   => 'https://site.mydomain.com'


apache::vhost  'site.mydomain.com:443':
  servername    => 'site.mydomain.com',
  port          => '443',
  ssl           => true,
  docroot       => '/var/www/site',
  docroot_owner => 'www-data',
  docroot_group => 'www-data',
  rewrite_rule  => '(.*) https://site.mydomain.com [R,L]',

对于非 SSL 虚拟主机资源,您还需要那些额外的 redirect 属性。由于apache::vhost 是没有namevar 的已定义资源类型,因此您可以通过使用两个唯一且纯粹的装饰性资源标题来规避多资源声明问题。

【讨论】:

非常感谢。我明白了,但这有一个小问题。这将使用 ServerName site.mydomain.com non-sslServerName site.mydomain 创建 2 个虚拟主机配置 [site.mydomain.com_ssl.conf, site.mydomain.com_non-ssl.conf] .com ssl ,会抛出错误,AH00526: Syntax error on line 7 of /etc/apache2/sites-enabled/25-site.mydomain.com_non-ssl.conf: ServerName takes one argument, The hostname and port of the server @VineethVijayan 这就是puppetlabs-apache 的文档如何解决您的问题。该 conf 文件语法错误源于其他地方,或者模块本身存在问题。这里看起来哪个更有可能? 这个错误是有道理的,把端口放在那里可以工作..!! apache::vhost 'site.mydomain.com:80' ... apache::vhost 'site.mydomain.com:443' : ... @VineethVijayan 这听起来像是模块的问题。您可能希望将其报告给 Github 上的维护者。我会更新答案。我希望使用servername:port 格式的资源标题不会创建一个混乱的文件名。 谢谢,我看看能不能举报。【参考方案2】:

在运行时找出马特的答案和错误让我得到了以下答案。

apache::vhost  'site.mydomain.com:80' ...  

apache::vhost  'site.mydomain.com:443' : ...

谢谢,

【讨论】:

以上是关于Puppetlabs-Apache:为虚拟主机启用 80 和 443的主要内容,如果未能解决你的问题,请参考以下文章

怎么启用VMware vSphere 6虚拟机中的容错功能三大步骤

为虚拟机启用本地共享文件夹步骤图文详述

当我启用虚拟主机时 Apache 返回 403

在vSphere 6.0修改不了虚拟机设置是啥问题

禁用ubuntu启用虚拟内存swap

vsphere6 web虚拟机控制台中鼠标不显示不能使用怎么破