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模板配置是成功的。