返回介绍

puppet-apache 模块

发布于 2025-02-18 00:20:46 字数 8987 浏览 0 评论 0 收藏 0

Apache HTTP Server(简称 Apache)是 Apache 软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器软件之一。它快速、可靠并且可通过简单的 API 扩充,将 Perl/Python 等解释器编译到服务器中。

puppet-apache 模块是由 Puppet 公司维护的官方模块,提供了完善的 Apache 管理能力。

puppet-apache 项目地址: https://github.com/puppetlabs/puppetlabs-apache

在开始介 puppet-apache 模块前,读者需特别留意以下:

WARNING: Configurations not managed by Puppet will be purged.

对于已存在的 Apache 服务,如果尝试使用 puppet-apache 模块进行管理,请额外小心在默认情况下该模块会清除所有未被 Puppet 管理的配置文件!

1. 先睹为快

不想看下面大段的代码说明,已经跃跃欲试了?

Ok,我们开始吧!

打开虚拟机终端并输入以下命令:

$ puppet apply -ve "include ::apache"

或者创建一个 manifest 文件 test.pp,并输入以下代码:

class  { 'apache': }

在终端下执行 puppet apply 命令:

   puppet apply -v test.pp

约 1 分钟之后(取决于网速和虚拟机的性能),Puppet 已经完成了 Apache 服务的安装,配置和启动了。

这是如何做到的呢?我们打开 puppet-apache 模块下 manifests/init.pp 文件,看看是如何做的?

2. 代码讲解

puppet-apache 模块当前支持的主要功能如下:

  • Apache 配置文件和目录
  • Apache 软件包/服务/配置文件
  • Apache 的 module
  • 虚拟主机(Virtual hosts)
  • 监听端口(Listened-to ports)

2.1 class apache

class apache 中有大量的判断逻辑,这些并不是核心,对于一个 init 类,其核心是调用了哪些资源( class ,define 等):

用于安装 Apache 软件包

    package { 'httpd':
      ensure => $package_ensure,
      name   => $apache_name,
      notify => Class['Apache::Service'],
    }

用于管理 conf.d 目录,注意这个$purge_confd 参数,默认为 true,会清理掉一切未被管理的配置文件。

  file { $confd_dir:
    ensure  => directory,
    recurse => true,
    purge   => $purge_confd,
    notify  => Class['Apache::Service'],
    require => Package['httpd'],
  }

用于启用所有默认的 mods

class  { '::apache::default_mods':
  all => $default_mods,
}

这里有两个 apache::vhost define,分别用于生成默认的 80 端口和 443 端口的 vhost 文件。

   ::apache::vhost { 'default':
      ensure          => $default_vhost_ensure,
      port            => 80,
      docroot         => $docroot,
      scriptalias     => $scriptalias,
      serveradmin     => $serveradmin,
      access_log_file => $access_log_file,
      priority        => '15',
      ip              => $ip,
      logroot_mode    => $logroot_mode,
      manage_docroot  => $default_vhost,
    }
    $ssl_access_log_file = $::osfamily ? {
      'freebsd' => $access_log_file,
      default   => "ssl_${access_log_file}",
    }
    ::apache::vhost { 'default-ssl':
      ensure          => $default_ssl_vhost_ensure,
      port            => 443,
      ssl             => true,
      docroot         => $docroot,
      scriptalias     => $scriptalias,
      serveradmin     => $serveradmin,
      access_log_file => $ssl_access_log_file,
      priority        => '15',
      ip              => $ip,
      logroot_mode    => $logroot_mode,
      manage_docroot  => $default_ssl_vhost,
    }
  }

以上代码示例用于简单的测试验证,若在生产环境中,请关闭默认生成的 vhost 文件:

class  { 'apache':
  default_vhost => false,
}

2.2 配置 Apache mod

puppet-apache 支持使用两种方式来安装 mod 软件包和管理 mod 配置文件:

  • class apache::mod::<MODEULE_NAME> 方式
  • define apache::mod 方式

其中 apache::mod::<MODULE NAME> 支持众多已预先定义的 Apache mod 的管理,而 define apache::mod 方式则可以灵活地支持未在 define apache::mod 中的 mod。

2.2.1 class apache::mod::ssl

下面以 mod_ssl 为例进行说明:

为了确保通讯安全,会使用 HTTPS 来加密通讯,因此需在 Apache 启用 mod_ssl。

  • class apache::mod::<MODEULE_NAME> 方式:
#开启 ssl compression
class  { 'apache::mod::ssl':
  ssl_compression => true,
}
  • define apache::mod 方式:
    apache::mod { 'mod_ssl': }
    

在通常情况下,使用默认参数 apache::mod::ssl 就可以完成 mod_ssl 的管理工作,同时也提供了 10 个可配置的参数:

  • $ssl_compression = false
  • $ssl_cryptodevice = 'builtin'
  • $ssl_options = [ 'StdEnvVars' ]
  • $ssl_openssl_conf_cmd = undef
  • $ssl_cipher = 'HIGH:MEDIUM:!aNULL:!MD5:!RC4'
  • $ssl_honorcipherorder = 'On'
  • $ssl_protocol = [ 'all', '-SSLv2', '-SSLv3' ]
  • $ssl_pass_phrase_dialog = 'builtin'
  • $ssl_random_seed_bytes = '512'
  • $ssl_sessioncachetimeout = '300'

需要注意的是,在使用 define apache::mod 方式下,Puppet 仅会安装指定名称的 mod 软件包,用户需要手动完成对于 mod 配置文件的设置。

2.2.2 class apache::mod::wsgi

OpenStack 服务的所有提供 API 接口的组件使用 Python 语言编写,Python 原生的 Web 服务器性能较弱,只适合用于非线上环境。为了提高 API 服务的性能,需将 Python Web 程序运行在 Apache 上,将使用到 mod_wsgi

在通常情况下,声明 apache::mod::wsgi 时使用默认参数就可以完成 mod_wsgi 的安装和配置工作:

class  { 'apache::mod::wsgi':}

apache::mod::wsgi 也提供了 5 个可配置的参数,其中 $wsgi_socket_prefix 有默认值:

  • $wsgi_socket_prefix = $::apache::params::wsgi_socket_prefix
  • $wsgi_python_path
  • $wsgi_python_home
  • $package_name
  • $mod_path

2.3 define apache::vhost

在配置 Apache 时,最常见的操作之一就是添加和修改虚拟主机。

因此,在 puppet-apache 模块中 apache::vhost 是使用最频繁的 define,用于管理 Apache 服务的 vhost 配置文件。

2.3.1 配置一个 vhost

最简单的调用方式是在声明一个 apache::vhost 时,只对参数 port 和 docroot 传值,例如:

apache::vhost { 'vhost.example.com':
  port    => '80',
  docroot => '/var/www/vhost',
}

2.3.2 配置开启 SSL 的 vhost

在线上配置 vhost 时,经常会使用 HTTPS 来确保 Web 访问的安全性,这在 puppet 中配置起来也非常容易。在声明一个 apache::vhost 时,开启$ssl 参数即可:

apache::vhost { 'ssl.example.com':
  port    => '443',
  docroot => '/var/www/ssl',
  ssl     => true,
}

如果要对开启 SSL 的 vhost 指定证书路径,则在声明时引入参数 ssl_certssl_key

apache::vhost { 'cert.example.com':
  port     => '443',
  docroot  => '/var/www/cert',
  ssl      => true,
  ssl_cert => '/etc/ssl/cert.example.com.cert',
  ssl_key  => '/etc/ssl/cert.example.com.key',
}

2.3.3 配置一个 WSGI 的 vhost

下面代码示例说明了如何为 vhost 配置 WSGI mod,用于运行 Python Web 服务:

apache::vhost { 'wsgi.example.com':
  port                        => '80',
  docroot                     => '/var/www/pythonapp',
  wsgi_application_group      => '%{GLOBAL}',
  wsgi_daemon_process         => 'wsgi',
  wsgi_daemon_process_options => {
    processes    => '4',
    threads      => '24',
    display-name => '%{GROUP}',
  },
  wsgi_import_script          => '/var/www/wsgi.example.com',
  wsgi_import_script_options  => {
    process-group     => 'wsgi',
    application-group => '%{GLOBAL}',
  },
  wsgi_process_group          => 'wsgi',
  wsgi_script_aliases         => { '/' => '/var/www/wsgi.example.com' },
}

推荐阅读

动手练习

  1. 使用 Puppet 搭建一套 LAMP 环境(注:需和 puppet-mysql 结合使用)
  2. 使用 Certbotpuppet-apache 配置并管理一个 HTTPS 站点(注: Certbot 的说明见 https://certbot.eff.org/ )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文