配置Apache服务器并使用Puppet部署WordPress
我们将使用Puppet来安装Apache和WordPress。
本文是KVM,Katelo和Puppet系列测试环境项目的一部分。
测试环境
我们安装了两个要配置的CentOS 7服务器,如下所示:
web1.hl.local(10.11.1.21)–具有WordPress和NFS挂载的Apache服务器
web2.hl.local(10.11.1.22)–带有WordPress和NFS挂载的Apache服务器
SELinux设置为强制模式。
来自自定义tar包的WordPress
我们不会从Internet下载WordPress,而是会使用我们自己的自定义版本(压缩包)。
每个版本均受源代码控制并在发布到环境之前进行本地测试。
压缩包的名称是'wordpress-latest.tar.gz',当前存储在Katello服务器上的'/var/www/html/pub /'下。
这使我们能够从https://katello.hl.local/pub/wordpress-latest.tar.gz中提取存档。
请注意,文件“ wp-config.php”从不存储在压缩包中,而是由Puppet生成。
冗余Apache/MySQL架构
为了增加冗余,将每个Apache服务器配置为使用不同的MySQL数据库服务器。
由于我们的MySQL节点配置为使用主/主复制,因此从理论上讲,每个VM上存储的数据应该没有差异。
我们将web1.hl.local插入db1.hl.local,并将web2.hl.local插入db2.hl.local。
NFS挂载上载
两台Apache服务器都将需要配置为安装共享存储的NFS客户端。
尽管用户可以使用任何一台Apache服务器上传文件,但我们需要确保无论最终使用的虚拟机是什么,整个WordPress实例中的文件都是相同的。
我们可以使用rsync解决问题,但是我不确定扩展的程度。
也许将来有事情要看。
用Puppet配置
Puppet Master 在Katello服务器上运行。
Puppet模块
我们使用以下Puppet模块:
- derdanne-nfs-为WordPress'/uploads'文件夹挂载NFS共享
- puppetlabs-apache-安装和配置Apache
- puppet-selinux-配置SELinux布尔值(例如
httpd_use_nfs)
- hunner-wordpress-安装WordPress
请参阅每个模块的文档以获取支持的功能和可用的配置选项。
防火墙配置
配置两个Apache服务器以允许HTTPS通信:
firewall { '007 allow HTTPS':
dport => '443',
source => '10.11.1.0/24',
proto => tcp,
action => accept,
}
与纯文本HTTP相比,在HAProxy和Apache之间使用加密时,可能会产生微不足道的性能损失,但是我们要确保流量得到保护。
如果出现问题,可以将HAProxy重新配置为卸载TLS。
SELinux布尔值
在两台Apache服务器上配置SELinux。
为了允许Apache使用NFS并连接到远程MySQL实例,必须使用这些文件。
我们还希望允许Apache(WordPress)发送电子邮件通知。
selinux::boolean { 'httpd_use_nfs':
persistent => true, ensure => 'on'
}->
selinux::boolean { 'httpd_can_network_connect_db':
persistent => true, ensure => 'on'
}->
selinux::boolean { 'httpd_can_sendmail':
persistent => true, ensure => 'on'
}
配置NFS客户端
这需要同时应用于两个Apache服务器。
class { '::nfs':
server_enabled => false,
client_enabled => true,
}->
nfs::client::mount { '/var/www/html/wp-content/uploads':
server => 'nfsvip.hl.local',
share => '/nfsshare/uploads',
}
虚拟IP(运行NFS群集的虚拟IP)为10.11.1.31,DNS名称为nfsvip.hl.local。
集群配置为导出'/nfsshare'。
有关更多信息,请参见此处。
安装Apache
这需要同时应用于两个Apache服务器。
我们部署一台Apache虚拟主机,并将日志转发配置为Graylog(请参见custom_fragment部分)。
我撰写了另一篇文章,介绍如何将Apache日志发送到Graylog,如果需要更多信息,请在此处查看。
TLS证书由环境的主要Puppet列表处理。
有关更多信息,请参见此处。
package { 'php-mysql':
ensure => 'installed'
}->
class { 'apache':
default_vhost => false,
default_ssl_vhost => false,
default_mods
=> false,
mpm_module
=> 'prefork',
server_signature => 'Off',
server_tokens => 'Prod',
trace_enable
=> 'Off',
log_formats
=> { graylog_access => '{ \"version\": \"1.1\", \"host\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"_user_agent\": \"%{User-Agent}i\", \"_source_ip\": \"%h\", \"_duration_usec\": %D, \"_duration_sec\": %T, \"_request_size_byte\": %O, \"_http_status_orig\": %s, \"_http_status\": %>s, \"_http_request_path\": \"%U\", \"_http_request\": \"%U%q\", \"_http_method\": \"%m\", \"_http_referer\": \"%{Referer}i\", \"_from_apache\": \"true\" }' },
}
include apache::mod::alias
include apache::mod::headers
include apache::mod::php
include apache::mod::rewrite
include apache::mod::ssl
::apache::mod { 'logio': }
## Configure VirtualHosts
apache::vhost { 'blog_https':
port
=> 443,
servername => 'blog.hl.local',
docroot
=> '/var/www/html',
manage_docroot => false,
options
=> ['FollowSymLinks','MultiViews'],
override => 'All',
suphp_engine => 'off',
ssl
=> true,
ssl_cert => '/etc/pki/tls/certs/hl.crt',
ssl_key
=> '/etc/pki/tls/private/hl.key',
ssl_protocol => ['all', '-SSLv2', '-SSLv3'],
ssl_cipher => 'HIGH:!aNULL!MD5:!RC4',
ssl_honorcipherorder => 'On',
redirectmatch_status => ['301'],
redirectmatch_regexp => ['(.*)\.gz'],
redirectmatch_dest => ['/'],
custom_fragment
=> 'CustomLog "|/usr/bin/nc -u syslog.hl.local 12201" graylog_access',
}
从我们的自定义tar包安装WordPress
我们要使用现有的MySQL配置,这意味着我们不希望WordPress创建任何数据库或者用户。
下面的细节是我们在设置MySQL服务器时使用的细节。
唯一不同的是db_host参数,一台Apache服务器使用db1.hl.local,另一台使用db2.hl.local。
class { 'wordpress':
db_user
=> 'dbuser1',
db_password => 'PleaseChangeMe',
db_name
=> 'blog',
db_host
=> 'db1.hl.local',
create_db
=> false,
create_db_user => false,
install_dir => '/var/www/html',
install_url => 'http://katello.hl.local/pub',
version
=> 'latest',
wp_owner
=> 'apache',
wp_group
=> 'root',
}
请注意我们如何将所有者设置为apache。
根据安全要求,我们可能希望进一步强化这一点。
如果一切顺利,我们最终应该使用NFS共享使用两台服务器:
[Hyman@theitroad ~]# df -h|egrep "File|uploads" Filesystem Size Used Avail Use% Mounted on nfsvip.hl.local:/nfsshare/uploads 2.0G 53M 1.9G 3% /var/www/html/wp-content/uploads
[Hyman@theitroad ~]# df -h|egrep "File|uploads" Filesystem Size Used Avail Use% Mounted on nfsvip.hl.local:/nfsshare/uploads 2.0G 53M 1.9G 3% /var/www/html/wp-content/uploads
我们还应该能够通过使用Apache数据来创建Graylog仪表板小部件。

