puppet-apache

  1. 先睹为快
  2. 代码讲解-如何管理apache服务
  3. 推荐阅读
  4. 动手练习

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,我们开始吧!

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

  1. $ puppet apply -ve "include ::apache"

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

  1. class { 'apache': }

在终端下执行puppet apply命令:

  1. 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软件包

  1. package { 'httpd':
  2. ensure => $package_ensure,
  3. name => $apache_name,
  4. notify => Class['Apache::Service'],
  5. }

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

  1. file { $confd_dir:
  2. ensure => directory,
  3. recurse => true,
  4. purge => $purge_confd,
  5. notify => Class['Apache::Service'],
  6. require => Package['httpd'],
  7. }

用于启用所有默认的mods

  1. class { '::apache::default_mods':
  2. all => $default_mods,
  3. }

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

  1. ::apache::vhost { 'default':
  2. ensure => $default_vhost_ensure,
  3. port => 80,
  4. docroot => $docroot,
  5. scriptalias => $scriptalias,
  6. serveradmin => $serveradmin,
  7. access_log_file => $access_log_file,
  8. priority => '15',
  9. ip => $ip,
  10. logroot_mode => $logroot_mode,
  11. manage_docroot => $default_vhost,
  12. }
  13. $ssl_access_log_file = $::osfamily ? {
  14. 'freebsd' => $access_log_file,
  15. default => "ssl_${access_log_file}",
  16. }
  17. ::apache::vhost { 'default-ssl':
  18. ensure => $default_ssl_vhost_ensure,
  19. port => 443,
  20. ssl => true,
  21. docroot => $docroot,
  22. scriptalias => $scriptalias,
  23. serveradmin => $serveradmin,
  24. access_log_file => $ssl_access_log_file,
  25. priority => '15',
  26. ip => $ip,
  27. logroot_mode => $logroot_mode,
  28. manage_docroot => $default_ssl_vhost,
  29. }
  30. }

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

  1. class { 'apache':
  2. default_vhost => false,
  3. }

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>方式:
  1. #开启ssl compression
  2. class { 'apache::mod::ssl':
  3. ssl_compression => true,
  4. }
  • define apache::mod方式:
    1. 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的安装和配置工作:

  1. 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传值,例如:

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

2.3.2 配置开启SSL的vhost

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

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

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

  1. apache::vhost { 'cert.example.com':
  2. port => '443',
  3. docroot => '/var/www/cert',
  4. ssl => true,
  5. ssl_cert => '/etc/ssl/cert.example.com.cert',
  6. ssl_key => '/etc/ssl/cert.example.com.key',
  7. }

2.3.3 配置一个WSGI的vhost

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

  1. apache::vhost { 'wsgi.example.com':
  2. port => '80',
  3. docroot => '/var/www/pythonapp',
  4. wsgi_application_group => '%{GLOBAL}',
  5. wsgi_daemon_process => 'wsgi',
  6. wsgi_daemon_process_options => {
  7. processes => '4',
  8. threads => '24',
  9. display-name => '%{GROUP}',
  10. },
  11. wsgi_import_script => '/var/www/wsgi.example.com',
  12. wsgi_import_script_options => {
  13. process-group => 'wsgi',
  14. application-group => '%{GLOBAL}',
  15. },
  16. wsgi_process_group => 'wsgi',
  17. wsgi_script_aliases => { '/' => '/var/www/wsgi.example.com' },
  18. }

推荐阅读

动手练习

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