1. 了解nginx,以及其实际场景中的部署、更新等操作
2. 学习安装部署、配置nginx
3. 实践利用ansible-playbook下发nginx及远程维护
4. 实践到自身实际的服务器中,学以致用
-
NGINX是一个高性能的 HTTP 和 反向代理 服务器
-
轻量级, 比apache占用更少的内存及资源
-
网络模型是异步非阻塞的,apache是阻塞型的, 所以在高并发下nginx更能保持低消耗而高性能
-
由于架构设计等原因,apache比nginx更加稳定, nginx相对来说bug会多一些, apache更加稳定
-
apache的各种模块功能上要比nginx强大, 比如URL重写,连接池, SSL等模块功能
-
总的来说,倾向于性能,优先选择nginx, 倾向于稳定, 优先选择apache
-
首先在管理端编译安装nginx (在管理端执行)
# 直接用apt-get, yum 的方式虽然方便, 但是编译安装我们是devops系统运维一定要掌握的安装方式
# 1. 首先安装编译nginx需要的依赖包, 依赖包建议用 apt-get install安装,这些都是跟系统发行版号配置的软件包,比较稳定
apt-get install libpcre3 libpcre3-dev openssl zlib1g zlib1g-dev
# 2. 先针对编译安装nginx进行配置检查
# 下载nginx源码包
wget http://nginx.org/download/nginx-1.4.4.tar.gz
# 解压nginx源码包
tar -zxvf nginx-1.4.4.tar.gz
# 如果要解压到指定的文件夹路径
tar -zxvf nginx-1.4.4.tar.gz -C /opt
# 进行配置检查
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_sub_module
--with-http_gzip_static_module --with-http_stub_status_module
--with-pcre
# ./configue 的作用就是配置我们即将要安装的nginx的一些选项
# --prefix 表要要安装在哪个目录
# --with-xx 的写法表示我们在编译nginx过程中会用到什么软件库,常见的软件库有zlib(压缩算法用到),
# pcre(正则库,URL重写会用到), ssl(加密,HTTPS会用到)
# 3. make 编译
# 4. make install 安装
# 编译安装是不会生成管理脚本的,要自己编写, 类似 /etc/init.d/apache2 这样的管理脚本
# 编写nginx的管理脚本
# ------------------------------------------------------------------
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
PIDFILE=/var/run/$NAME.pid
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
# ------------------------------------------------------------------------
# 上面的脚本保存为 /etc/init.d/nginx
# 执行授权
chmod +x /etc/init.d/nginx
# 启动nginx
/etc/init.d/nginx start
- 按照官方建议生成目录结构 (在管理端执行)
cd /etc/ansible
mkdir -p nginx_install/roles/{common,delete,install}/{handlers,files,meta,tasks,templates,vars}
# 文件夹作用说明
# common 为安装nginx做一些准备配置操作
# delete 删除nginx的操作
# install 安装nginx的操作
# 以上的每个目录下 又有几个目录
# handlers 标识当发生改变时要执行的操作
# files 安装nginx时要用到的一些文件
# meta 存放一些说明信息的文件
# tasks 核心的配置文件, 具体的任务操作文件
# template 通常存一些配置文件, 启动脚本等模板文件
# vars 通常为定义的变量文件
- 打包nginx并生成压缩包拷贝 (在管理端执行)
cd /usr/local/
tar czvf nginx.tar.gz nginx
cp nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/
cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates/
# 说明:把安装文件放于 install/files/ 目录下,把启动脚本放于install/templates/ 目录下。
- 定义相关的yaml文件 (在管理端执行)
# 1. 定义common的tasks(这里主要是定义nginx需要安装的一些依赖包)
# -------------------------------------------------------
cd /etc/ansible/nginx_install/roles/
vim common/tasks/main.yml
---
- name: Install initializtion require software
apt: name={{ item }} state=installed
with_items:
- gcc
- libpcre3
- libpcre3-dev
- openssl
- zlib1g
- zlib1g-dev
# --------------------------------------------------------
# 2. 定义install的vars
# ---------------------------------------------------------
vim install/vars/main.yml
nginx_user: nobody
nginx_basedir: /usr/local/nginx
# 注意: 这个 nginx_user 要和 nginx.conf 配置文件中定义的用户一样。
# 还可以定义一些其他的变量比如
# nginx_port: 80
# nginx_web_dir: /data/www
# nginx_version: 1.4.4
# ---------------------------------------------------------
# 3. 定义install的tasks
# ---------------------------------------------------------
# 拷贝分发文件到客户端
vim install/tasks/copy.yml
- name: Copy Nginx Files
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompress Nginx Files
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Scripts
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
# 在客户端安装nginx
vim install/tasks/install.yml
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service
# service: name=nginx state=started
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
shell: insserv /etc/init.d/nginx
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
# task汇总文件的写法, 先执行 copy, 再执行install,通过定义文件的顺序执行task
vim install/tasks/main.yml
- include: copy.yml
- include: install.yml
# ---------------------------------------------------------
# 4. 定义整个 ansible-playbook 的总入口文件
cd /etc/ansible/nginx_install/
vim install.yml
---
- hosts: nginxhosts
remote_user: root
gather_facts: True
roles:
- common
- install
- 执行下发(在管理端执行)
# 验证Iventory文件是否正确
cat /etc/ansible/hosts
修改之前的group名称为我们这次实践的名称
# 测试一下主机的状态
ansible nginxhosts -m ping
# 执行下发命令
ansible-playbook install.yml
# 在客户端验证下发结果(在客户端执行)
ls /usr/local/nginx/
ps -ef |grep nginx
cat /etc/init.d/nginx
netstat -anp | grep nginx
- 修改1, 新建拷贝配件文件(在管理端执行)
cd /etc/ansible
# 建立配置更新nginx的相关role文件
mkdir -p nginx_config/roles
cd nginx_config/roles/
mkdir -p new/{vars,files,tasks,handlers}
# 配置相关文件, new是表示更新nginx的时候用到的文件
cp /usr/local/nginx/conf/nginx.conf new/files
# 为了实践效果,我们定义一个vhosts文件夹
# 当nginx需要配置多个域名服务的时候,一般需要用到vhosts文件夹里面的多个配置文件做配置
# 具体可参考 nginx 的vhost文件配置形式
mkdir -p /usr/local/nginx/conf/vhosts
vim /usr/local/nginx/conf/vhosts/test-domain.conf
# ------
server {
listen 80;
server_name www.test-domain.com;
# -----
cp -r /usr/local/nginx/conf/vhosts new/files
- 修改2, 更改nginx默认的服务监听端口
vim roles/new/files/nginx.conf
# -------
#testdomain.devops.com
server {
listen 8089;
# -------
- 定义一些变量(在管理端执行)
vim new/vars/main.yml
nginx_basedir: /usr/local/nginx
- 更新nginx之后,重新启动nginx服务(在管理端执行)
vim new/handlers/main.yml
- name: restart nginx
shell: /etc/init.d/nginx reload
- 汇总所有tasks任务文件(在管理端执行)
vim new/tasks/main.yml
- name: copy conf file and restart nginx
copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644
with_items:
- { src: nginx.conf, dest: conf/nginx.conf }
- { src: vhosts, dest: conf/ }
notify: restart nginx
- 定义入口文件 (在管理端执行)
cd ..
vim update.yml
---
- hosts: nginxhosts
user: root
roles:
- new
- 测试更新nginx配置和重启服务 (在管理端执行)
vim roles/new/files/vhosts/test-domain.conf
# 1. 写上示例的文本内容,模拟配置nginx虚拟主机范例, 详细的nginx vhosts文件配置可在之后详细了解
#testdomain.devops.com
# 2. 发布更新nginx
ansible-playbook update.yml
# 3. 在客户端查看是否已经更新了配置
cat /usr/local/nginx/conf/vhosts/test_domain.conf
# 4. 查看最新的nginx服务端口是否改变
- 关闭 gathering facts, ansible操作任务的时候, 会默认收集远程系统的信息, 主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息, 这个信息就是fact信息。如果我们不需要这些信息来作为执行的必要条件,就可以屏蔽这个收集的动作,这样就可以大大的提高ansible的效果,一般可以提高40%左右。
# Ansible 提供了 setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用。
ansible all -m setup
# 查看获取fact信息的耗时
time ansible localhost -m setup
# 直接屏蔽收集fact信息的设置
gather_facts: no
# 例如在定义 install_nginx 任务的时候,改为
vim install.yml
---
- hosts: nginxhosts
remote_user: root
gather_facts: False # 原来是True
roles:
- common
- install
# 请自行测试该优化效果, 当远程的机器多的时候尤为明显
- 开启pipelining, SSH pipelining 是一个加速 Ansible 执行速度方法,默认是关闭,之所以默认关闭是为了兼容不同的sudo配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项。修改 /etc/ansible/ansible.cfg 文件可以开启 pipelining
pipelining=True
# 请自行测试该优化效果, 当远程的机器多的时候尤为明显
通过今天的课程实践,可知正确的使用 ansible-playbook可以轻松远程部署,管理nginx的日常运维,多个
nginx节点只需要一套配置文件,执行脚本即可,方便实用,按照ansible-playbook官方推荐的文件结构形式
,条理分明,运维耦合度比较低,非常实用,熟练之后,可一人轻松管理N台nginx,其他的运维工作借鉴这
种方式即可。