预计阅读本页时间:-
5.5.8 如何利用ERB模板来自动配置Nginx虚拟主机
如果Web集群环境已经上线,那么应该如何方便快速地部署Nginx及其虚拟主机呢?要想实现这个需求可以参考5.5.6节的内容,这里的Nginx建议采用第三方yum源来安装。如果是用Nginx的官方源来安装,可以添加如下内容到/etc/yum.repos.d/nginx.repo文件:
[nginx]
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
第二种方式就是通过createrepo命令建立自己的yum源,这种方式更加灵活,可以先在Nginx官网上下载适合自己的rpm源码包,然后通过执行rpmbuild命令使其成为rpm包,并添加进自己的yum源,在自动化运维要求严格的定制环境中,绝大多数运维人员都会选择这种方法。通过此种方式安装Nginx以后会发现,确实比源码安装方便多了,比如,可以自动分配运行Nginx的用户nginx。另外,Nginx的日志存放会自动保存在/var/log/nginx下,其工作目录为/etc/nginx,这一点跟源码编译安装的Nginx区别比较大,请大家注意区分。
Puppet-Server机器的/etc/puppet文件结构如下:
├──
auth.conf├──
environments│
└──
example_env│
├──
manifests│
├──
modules│
└──
README.environment├──
fileserver.conf├──
manifests│
├──
nodes│
│
├──
client.cn7788.com.pp│
│
└──
nginx.cn7788.com.pp│
└──
site.pp├──
modules│
└──
nginx│
├──
files│
├──
manifests│
│
└──
init.pp│
└──
templates│
├──
nginx.conf.erb│
└──
nginx_vhost.conf.erb└──
puppet.conf
首先建立Nginx模块,命令如下:
mkdir –
p /etc/puppet/modules/nginx/{files,manifests,templates}
Nginx模块的配置文件挺多,这里将详细说明一下。
site.pp的文件内容如下:
import "nodes/*.pp"
client.cn7788.com.pp的文件内容如下:
node 'client.cn7788.com' {
include nginx
nginx::vhost {'client.cn7788.com':
sitedomain => "client.cn7788.com" ,
rootdir => "client",
}
}
nginx.cn7788.com.pp的文件内容如下:
node 'nginx.cn7788.com' {
include nginx
nginx::vhost {'nginx.cn7788.com':
sitedomain => "nginx.cn7788.com" ,
rootdir => "nginx",
}
}
/etc/puppet/modules/nginx/manifests/init.pp的文件内容如下:
class nginx{
package{"nginx":
ensure =>present,
}
service{"nginx":
ensure =>running,
require =>Package["nginx">,
}
file{"nginx.conf":
ensure => present,
mode => 644,
owner => root,
group => root,
path => "/etc/nginx/nginx.conf",
content=> template("nginx/nginx.conf.erb"),
require=> Package["nginx">,
}
}
define nginx::vhost($sitedomain,$rootdir) {
file{ "/etc/nginx/conf.d/${sitedomain}.conf":
content => template("nginx/nginx_vhost.conf.erb"),
require => Package["nginx">,
}
}
/etc/puppet/modules/nginx/templates/nginx.conf.erb的文件内容如下:
user nginx;
worker_processes 8;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 51200;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
然后检查下此ERB模板文件的语法,命令如下:
erb -x -T '-' -P /etc/puppet/modules/apache/templates/nginx.conf.erb | ruby -c
如果没有任何显示,就说明文件在语法上是不存在任何问题的。
/etc/puppet/modules/nginx/templates/nginx_vhost.conf.erb 的文件内容如下:
server {
listen 80;
server_name <%= sitedomain %>;
access_log /var/log/nginx/<%= sitedomain %>.access.log;
location / {
root /var/www/<%= rootdir %>;
index index.php index.html index.htm;
}
}
最后可以在节点名为client.cn7788.com 和nginx.cn7788.com 的机器上验证效果,命令如下:
puppet agent --test --server server.cn7788.com
这里以nginx.cn7788.com 节点机器为例说明,此命令执行结果显示如下:
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for nginx.cn7788.com
Info: Applying configuration version '1446798263'
Notice: /Stage[main]/Nginx/Package[nginx]/ensure: created
Notice: /Stage[main]/Nginx/Service[nginx]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Nginx/Service[nginx]: Unscheduling refresh on Service[nginx]
Notice: /Stage[main]/Main/Node[nginx.cn7788.com]/Nginx::Vhost[nginx.cn7788.com]/File[/etc/nginx/conf.d/nginx.cn7788.com.conf]/ensure: defined content as '{md5}5f08d10788e3c82b41336a40edc5350f'
Notice: /Stage[main]/Nginx/File[nginx.conf]/content:
--- /etc/nginx/nginx.conf 2015-04-21 15:34:33.000000000 +0000
+++ /tmp/puppet-file20151106-5957-1f964a8-0 2015-11-06 08:27:14.267072983 +0000
@@ -1,32 +1,22 @@
-
user nginx;
-worker_processes 1;
-
+worker_processes 8;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
-
-
events {
- worker_connections 1024;
+ use epoll;
+ worker_connections 51200;
}
-
-
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
-
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
-
access_log /var/log/nginx/access.log main;
-
sendfile on;
#tcp_nopush on;
-
keepalive_timeout 65;
-
#gzip on;
-
include /etc/nginx/conf.d/*.conf;
}
+
Info: Computing checksum on file /etc/nginx/nginx.conf
Info: FileBucket got a duplicate file {md5}f7984934bd6cab883e1f33d5129834bb
Info: /Stage[main]/Nginx/File[nginx.conf]: Filebucketed /etc/nginx/nginx.conf to puppet with sum f7984934bd6cab883e1f33d5129834bb
Notice: /Stage[main]/Nginx/File[nginx.conf]/content: content changed '{md5}f7984934bd6cab883e1f33d5129834bb' to '{md5}34e85800459aaf9b40ebfbdfa33614c0'
Notice: Finished catalog run in 42.19 seconds
在nginx.cn7788.com 的机器上检查生成的Nginx相关配置文件,发现都已经顺利生成了,说明Nginx模板配置是成功的。