配置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仪表板小部件。