0%

Nginx

状态码(重点)

200:正常访问

301:永久重定向

307:内部重定向


客户端报错(nginx/apache)

401:用户名密码认证失败

403:找不到主页,权限不足,selinux没有关

404:找不到页面


后端代码程序,php,java… MySQL ,redis

500:内部错误

502:bad gateway

503:服务器过载

504:请求超时


咱们班总共38人,一人两台设备,访问www.123.xxx 就会发起10次请求,访问两次

PV:38*2*2*10

UV:38*2

IP:1

SOA:松耦合架构


Nginx

两种部署方式:

1)yum安装

更改官方源:

1
2
3
4
5
6
[root@web ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

安装依赖包

1
yum install -y gcc gcc-c++ autoconf pcre pcre-devel openssl-devel make automake

安装nginx-1.16.0

1
yum install -y nginx

2)源码安装

解压

1
2
3
4
tar xf nginx-1.16.0.tar.gz
#创建www用户
groupadd www -g 666
useradd www -u 666 -g 666 -s /sbin/nologin -M

生成

1
2
3
4
5
6
./configure --prefix=/usr/local/nginx-1.16.0 \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream

编译

1
make

安装

1
make install

如何升级nginx或者添加功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ln -s /usr/local/nginx-1.16.0 /usr/local/nginx

#升级版本
./configure --prefix=/usr/local/nginx-1.17.2 \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream \
--with-http_mp4_module

#重新软链接
rm -f /usr/local/nginx && ln -s /usr/local/nginx-1.17.2 /usr/local/nginx
-----------------------------------------------------------------------------------------
#添加模块
./configure --prefix=/usr/local/nginx_new-1.16.0 \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream \
--with-http_mp4_module

#重新软链接
rm -f /usr/local/nginx && ln -s /usr/local/nginx_new-1.16.0 /usr/local/nginx

Ansible,SaltStack

先源码安装,然后打rpm包,放到yum仓库,然后yum安装

使用systemd管理nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

nginx相关配置文件

1.Nginx主配置文件

路径 类型 作用
/etc/nginx/nginx.conf 配置文件 nginx主配置文件
/etc/nginx/conf.d/default.conf 配置文件 默认网站配置文件

2.Nginx代理相关参数文件

路径 类型 作用
/etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
/etc/nginx/scgi_params 配置文件 scgi代理配置文件
/etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件

3.Nginx编码相关配置文件

路径 类型 作用
/etc/nginx/win-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
/etc/nginx/mime.types 配置文件 Content-Type与扩展名

4.Nginx管理相关命令

路径 类型 作用
/usr/sbin/nginx 命令 Nginx命令行管理终端工具
/usr/sbin/nginx-debug 命令 Nginx命令行与终端调试工具

4.Nginx日志相关目录与文件

路径 类型 作用
/var/log/nginx 目录 Nginx默认存放日志目录
/etc/logrotate.d/nginx 配置文件 Nginx默认的日志切割

nginx的配置文件详解

Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块)EventModule(事件驱动模块)HttpCoreModule(http内核模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)

CoreModule核心模块

user www; #Nginx进程所使用的用户
worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /log/nginx/error.log #Nginx错误日志存放路径
pid /var/run/nginx.pid #Nginx服务运行后产生的pid进程号
EventModule(事件驱动模块)

events {
worker_connections 25535; #每个worker进程支持的最大连接数
use epoll; #事件驱动模型, epoll默认
}
HttpCoreModule(http内核模块)

#http层开始
http {
#包含资源类型文件
include /etc/nginx/mime.types;
#默认以下载方式传输给浏览器(前提是该资源在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;
#搭配sendfile使用
#tcp_nopush on;
#长连接超时时间
keepalive_timeout 65;
#是否开启压缩
#gzip on;

#使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
'server' {
listen 80; #监听端口, 默认80
server_name driverzeng.com; #提供的域名
access_log access.log; #该网站的访问日志
#控制网站访问路径
'location' / {
root /usr/share/nginx/html; #存放网站源代码的位置
index index.html index.htm; #默认返回网站的文件
}
}
...
#第二个虚拟主机配置
'server' {
...
}

include /etc/nginx/conf.d/*.conf; #包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
} #http结束层

手写虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@web01 conf.d]# vim game.conf
server {
listen 80;
server_name localhost;

location / {
root /code;
index index.html;
}
}

#创建站点目录
[root@web01 conf.d]# mkdir /code
#授权www用户给站点目录
[root@web01 conf.d]# chown -R www.www /code
#手动创建index
[root@web01 code]# echo game > /code/index.html

1565755012533

1
2
3
4
5
6
7
[root@web01 code]# ll /code/
total 18860
-rw-r--r-- 1 root root 19304923 Aug 14 11:36 h5_games.zip
-rw-r--r-- 1 www www 5 Aug 14 11:51 index.html
[root@web01 code]# pwd
/code
[root@web01 code]# unzip h5_games.zip

虚拟主机

1
2
3
4
5
6
7
检查配置 nginx -t
立即生效配置 nginx -s reload
方式一、基于主机多IP方式

方式二、基于端口的配置方式

方式三、基于多个hosts名称方式(多域名方式)

MySQL-day9 日志管理

img

错误日志

作用:记录MySQL的报错信息,一般正常信息

默认是否开启:开启

默认路径:$datadir

默认日志名:${hostname}.err

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
log_error=/application/mysql/data/$hostname.err

[root@db01 ~]# ll /application/mysql/data/zls.err
-rw-rw---- 1 mysql mysql 7265 Nov 12 16:55 /application/mysql/data/zls.err

mysql> show variables like 'log_error';
+---------------+----------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------+
| log_error | /application/mysql-5.6.44/data/zls.err |
+---------------+----------------------------------------+

一般查询日志

作用:
记录mysql所有执行成功的SQL语句信息,可以做审计用,但是我们很少开启。

默认是否开启:关闭

默认位置:$datadir

默认名字:${hostname}.log

开启方式:

1
2
3
[mysqld]
general_log=1
general_log_file=/application/mysql/data/mysql.log

查看方式:

1
2
3
4
5
6
7
mysql> show variables like '%gen%';
+------------------+-----------------------------------------+
| Variable_name | Value |
+------------------+-----------------------------------------+
| general_log | ON |
| general_log_file | /application/mysql-5.6.44/data/db01.log |
+------------------+-----------------------------------------+

binlog 日志(二进制日志)

作用:
记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
记录所有DDL、DCL等语句
总之,二进制日志会记录所有对数据库发生修改的操作

默认是否开启:关闭

默认位置:$datadir

默认名字:mysql-bin

1
2
3
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003

二进制日志模式:
statement:语句模式,上图中将update语句进行记录(默认模式)。
row:行模式,即数据行的变化过程,上图中Age=19修改成Age=20的过程事件。
mixed:以上两者的混合模式。
企业推荐使用row模式

如何开启二进制日志?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#在MySQL5.6中
[mysqld]
log-bin=/application/mysql/data/zls-bin
binlog_format=

#在MySQL5.7中
[mysqld]
server_id=1
log-bin=/application/mysql/data/zls-bin
binlog_format=

mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

statement:语句模式(默认)
row:行级模式(企业推荐使用)
记录数据行的变化过程
mixed:混合模式,把语句模式和行级模式混合使用

总结:
语句模式优点:通俗易懂,占用磁盘空间相对较少
语句模式缺点:不严谨,容易丢数据

行级模式优点:严谨,不易丢数据
行级模式缺点:看不懂,占用磁盘空间较大

mysql> create table binlog(id int);#DDL
mysql> insert into binlog values(1),(2),(3);#DML

#查看binlog
[root@db01 data]# mysqlbinlog zls-bin.000001
#查看行级模式的binlog
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv zls-bin.000002

binlog的作用:
1)如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
2)数据的备份恢复
3)数据的复制(主从)

事件介绍

1)在binlog中最小的记录单元为event
2)一个事务会被拆分成多个事件(event)

1
2
3
4
5
6
7
8
#查看总共的binlog
mysql> show binary logs;
+----------------+-----------+
| Log_name | File_size |
+----------------+-----------+
| zls-bin.000001 | 901 |
| zls-bin.000002 | 1767 |
+----------------+-----------+

事件(event)特性

1)每个event都有一个开始位置(start position)和结束位置(stop position)。
2)所谓的位置就是event对整个二进制的文件的相对位置。
3)对于一个二进制日志中,前120个position是文件格式信息预留空间。
4)MySQL第一个记录的事件,都是从120开始的。

行级模式回复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> create database binlog;
Query OK, 1 row affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 220 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> use binlog
mysql> create table binlog(id int);

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 325 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> insert into binlog values(1);
mysql> insert into binlog values(2);
mysql> commit;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 612 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> update binlog set id=10 where id=1;
mysql> commit;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 814 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> delete from binlog where id=2;
mysql> commit;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1010 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> drop table binlog;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1133 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> drop database binlog;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1222 | | | |
+------------------+----------+--------------+------------------+-------------------+

#状态一:
1
2

#状态二:
10
2

#状态三:
10

恢复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#查看binlog日志
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000001

start-position=120
stop-position=814

#截取binlog
[root@db01 data]# mysqlbinlog --start-position=120 --stop-position=814 /application/mysql/data/mysql-bin.000001 > /tmp/a.sql

#导入数据
[root@db01 data]# mysql -uroot -p1 < /tmp/a.sql

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| binlog |
+--------------------+

mysql> use binlog

mysql> show tables;
+------------------+
| Tables_in_binlog |
+------------------+
| binlog |
+------------------+

mysql> select * from binlog;
+------+
| id |
+------+
| 10 |
| 2 |
+------+

指定数据库恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
mysql> create database db1;

mysql> insert into binlog.binlog values(4);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> use db1

mysql> create table tb1(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb1 values(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> use db2
Database changed

mysql> create table tb2(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from db1.tb1;
+------+
| id |
+------+
| 1 |
| 2 |
+------+


mysql> select * from db2.tb2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+

mysql> insert into binlog.binlog values(10);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables from db1;
Empty set (0.00 sec)

恢复

1
2
3
4
5
6
7
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000001

mysqlbinlog -d db1 --start-position=1916 --stop-position=2576 /application/mysql/data/mysql-bin.000001 > /tmp/b.sql

[root@db01 data]# mysql -uroot -p1 < /tmp/b.sql

## -d 指定只查看某个库的binlog

删除、刷新binlog

1
2
3
4
5
#1.刷新binlog
mysql> flush logs;
#2.当重启数据库的时候,binlog会刷新
/etc/init.d/mysqld restart
#3.当binlog 大小达到1G的时候自动刷新
1
2
3
4
5
6
7
8
9
10
11
12
#1.删除binlog(临时,保留7天的)
mysql> SET GLOBAL expire_logs_days = 7;
#2.永久保存
[root@db01 data]# vim /etc/my.cnf
[mysqld]
expire_logs_days = 7
#3.删除3天之前的binlog
PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
#4.指定binlog名字删除,删除该binlog之前的所有binlog
PURGE BINARY LOGS TO 'mysql-bin.000010';
#5.清除所有binlog
mysql> reset master;

慢查询日志slow-log

1)是将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件
2)通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的

默认是否开启:关闭

默认位置:$datadir

默认名字:${hostname}-slow.log

开启方式:

1
2
3
4
5
6
7
8
9
10
#指定是否开启慢查询日志
slow_query_log = 1 ON
#指定慢日志文件存放位置(默认在data)
slow_query_log_file=/application/mysql/data/slow.log
#设定慢查询的阀值(默认10s)
long_query_time=0.05
#不使用索引的慢查询日志是否记录到索引
log_queries_not_using_indexes
#查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
min_examined_row_limit=100(鸡肋)
1
mysql> create table city_1 select * from city;

NFS 共享存储

Rsync

备份,基于ssh协议

备份的方式

全备:备份所有的(完整的)数据

增备:基于上一次备份,增量的数据

Rsync的三种工作模式

1.本地模式

类似于cp命令

1
2
3
4
5
6
#拷贝文件
[root@backup ~]# rsync /etc/passwd ./

#拷贝目录
[root@backup ~]# rsync -avz /etc/ ./
[root@backup ~]# rsync -avz /etc /tmp

加/和不加/的区别

加/:拷贝目录下的所有文件

不加/:拷贝目录本身及目录下的所有文件

2.远程模式

类似于scp

1
2
3
4
5
#推:push
[root@backup ~]# rsync -avz /root/zls root@172.16.1.7:/root

#拉:pull
[root@web01 ~]# rsync -avz root@172.16.1.41:/root/zls /root

3.守护进程

服务端:172.16.1.41

1)安装Rsync

1
yum install -y rsync

2)配置rsync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[zls]
comment = welcome to oldboyedu backup!
path = /backup

3)创建系统用户

1
useradd rsync -s /sbin/nologin -M

4)创建backup目录

1
2
mkdir /backup
chown -R rsync.rsync /backup

5)创建虚拟用户的密码文件

1
2
echo 'rsync_backup:123' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

6)启动服务

1
2
systemctl start rsyncd
systemctl enable rsyncd

7)检测启动是否成功

1
2
ps -ef|grep rsyncd
netstat -lntup

客户端:172.16.1.7

1)安装rsync

1
yum install -y rsync

2)配置密码文件

1
2
echo '123' > /etc/pass
chmod 600 /etc/pass

3)免密的两种方式

1
2
3
4
5
#指定密码文件
--password-file=/etc/pass

#添加环境变量
export RSYNC_PASSWORD=123
主机名 作用 外网IP 内网IP
web01 客户端 10.0.0.7 172.16.1.7
backup 服务端 10.0.0.41 172.16.1.41

客户端需求:

1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)

#!/bin/bash

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123

mkdir -p ${BD}/${S}

2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@web01 ~]# tar zcf /backup/nfs_172.16.1.31_2018-09-02/conf.tar.gz /etc/passwd 

#!/bin/bash

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123

mkdir -p ${BD}/${S}

tar zcf ${BD}/${S}/conf.tar.gz /etc/passwd

3.客户端最后将备份的数据进行推送至备份服务器

1
2
export RSYNC_PASSWORD=123
rsync -az ${BD}/ rsync_backup@172.16.1.41::zls

4.客户端每天凌晨1点定时执行该脚本

1
2
3
[root@web01 ~]# crontab -e
#每天凌晨一点备份重要数据 By:zls At:2019-08-02
00 01 * * * /bin/sh /root/rsync.sh &>/dev/null

5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
find ${BD} -type d -mtime +7|xargs rm -fr

#!/bin/bash

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123

mkdir -p ${BD}/${S}

tar zcf ${BD}/${S}/conf.tar.gz /etc/passwd

rsync -az ${BD}/ rsync_backup@172.16.1.41::zls

find ${BD} -type d -mtime +7|xargs rm -fr

客户端脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@web01 ~]# vim rsync.sh 
#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123
mkdir -p ${BD}/${S}
tar zcf ${BD}/${S}/conf.tar.gz /etc/passwd &>/dev/null
md5sum ${BD}/${S}/conf.tar.gz > /backup/${I}.txt
rsync -az ${BD}/ rsync_backup@172.16.1.41::zls
find ${BD} -type d -mtime +7|xargs rm -fr

服务端需求:

1.服务端部署rsync,用于接收客户端推送过来的备份数据

2.服务端需要每天校验客户端推送过来的数据是否完整

3.服务端需要每天校验的结果通知给管理员

1
2
3
4
5
6
7
8
9
#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup

md5sum -c ${BD}/*.txt|mail -s "${D}:校验结果" 133411023@qq.com

4.服务端仅保留6个月的备份数据,其余的全部删除

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup

md5sum -c ${BD}/*.txt|mail -s "${D}:校验结果" 133411023@qq.com
find ${BD} -type d -mtime +180|xargs rm -fr

NFS

共享存储,文件服务器

NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph

为什么要使用共享存储

1.实现多台服务器之间数据共享

2.实现多台服务器之间数据一致

集群没有共享存储的情况

1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。

2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。

img

集群有共享存储

1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储

2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

img

NFS的工作原理

1.用户进程访问NFS客户端,使用不同的函数对数据进行处理

2.NFS客户端通过TCP/IP的方式传递给NFS服务端。

3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。

4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。

5.Rpc.mount进程判断客户端是否有对应的权限进行验证。

6.idmap进程实现用户映射和压缩7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。

img

NFS部署

1.环境准备

主机名 角色 外网IP 内网IP
backup nfs的客户端 10.0.0.41 172.16.1.41
nfs nfs的服务端 10.0.0.31 172.16.1.31
web01 nfs的客户端 10.0.0.7 172.16.1.7

2.关闭防火墙和selinux

1
2
3
4
5
6
7
#1.关闭Firewalld防火墙
[root@nfs ~]# systemctl disable firewalld
[root@nfs ~]# systemctl stop firewalld

#2.关闭selinux防火墙
[root@nfs ~]# sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
[root@nfs ~]# setenforce 0

3.部署nfs服务端

1
yum -y install nfs-utils rpcbind

4.启动rpcbind

1
2
3
4
5
6
7
8
9
#启动rpcbind
[root@nfs01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl start rpcbind
[root@backup ~]# systemctl start rpcbind

#添加开机自启
[root@nfs01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl enable rpcbind
[root@backup ~]# systemctl start rpcbind

1564974331033

5.检测端口和进程

1
2
3
4
5
6
7
8
9
[root@nfs01 ~]# ps -ef|grep rpc
rpc 11746 1 0 01:12 ? 00:00:00 /sbin/rpcbind -w
root 11750 11421 0 01:15 pts/1 00:00:00 grep --color=auto rpc

[root@nfs01 ~]# netstat -lntup|grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp6 0 0 :::111 :::* 1/systemd

6.编辑配置文件

1
2
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)

6.1创建/data目录

1
2
[root@nfs01 data]# mkdir /data
[root@nfs01 data]# chown -R nfsnobody.nfsnobody /data

6.2启动NFS

1
[root@nfs01 ~]# systemctl start nfs-server

7.部署NFS客户端

1
yum install -y rpcbind nfs-utils

8.启动rpcbind

1
2
3
#只启动rpcbind
[root@web01 ~]# systemctl start rpcbind
[root@backup ~]# systemctl start rpcbind

9.查看可挂载点

1
[root@backup ~]# showmount -e 172.16.1.31

10.挂载目录

1
[root@backup ~]# mount -t nfs 172.16.1.31:/data /backup

统一web、nfs、backup的用户权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#创建www用户和组
[root@backup html]# groupadd www -g 666
[root@backup html]# useradd www -u 666 -g 666

---------------------------------WEB-----------------------------------
#修改httpd的配置文件
vim /etc/httpd/conf/httpd.conf
User www
Group www

[root@web01 html]# systemctl restart httpd

------------------------------------NFS--------------------------------------
#修改nfs的配置文件
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs01 data]# systemctl restart rpcbind nfs-server

#重新授权
[root@nfs01 data]# chown -R www.www /data

代码部署步骤

1.安装服务,httpd(apache)和php

1
yum install -y httpd php

2.查找httpd的站点目录

1
2
3
4
[root@web01 html]# rpm -ql httpd|grep html
[root@web01 html]# rz windows-提交作业代码.zip
[root@web01 html]# yum install -y unzip
[root@web01 html]# unzip windows-提交作业代码.zip

3.修改上传目录

1
2
[root@backup ~]# vim /var/www/html/upload_file.php
$wen="/var/www/html/tupian";

4.启动服务

1
systemctl start httpd

Ansible 变量

定义变量的方式

1.命令行

2.playbook

3.主机清单

如何定义变量

1.在playbook中定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#方法一:
- hosts: db02
vars:
pkg:
- MySQL-python
- mariadb-server
tasks:
- name:
yum:
name: "{{ pkg }}"
state: present

#方法二:
- hosts: db01
vars:
web_pkg: httpd
db_pkg:
- unzip
- vsftpd
php_pkg:
- php-fpm
- php
- php-mysql

2.使用vars_file定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#定义阶段
[root@m01 project]# vim vars_file.yml
web_pkg: httpd
db_pkg: mariadb-server
php_pkg: php

#调用阶段
[root@m01 project]# vim httpd.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install httpd
yum:
name: "{{ db_pkg }}"
state: present

3.使用Ansible内置变量

1
2
3
4
5
6
7
8
vim mkdri.yml
- hosts: web_group
tasks:
- name: MKDIR
file:
path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }}
state: directory
recurse: yes

4.使用主机清单定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#定义阶段
[web_group]
zls_web01 ansible_ssh_host=172.16.1.7
zls_web02 ansible_ssh_host=172.16.1.8

[web_group:vars]
web_pkg=nginx

[backup_group]
backup ansible_ssh_host=172.16.1.41

[db_group]
db01 ansible_ssh_host=172.16.1.51
db02 ansible_ssh_host=172.16.1.52

[nfs_group]
nfs ansible_ssh_host=172.16.1.31

[rsync_server:children]
web_group
backup_group

[rsync_server:vars]
web_pkg=httpd

[nfs_server:children]
web_group
nfs_group

#调用阶段
- hosts: zls_web01
tasks:
- name: Install web server
yum:
name: "{{ web_pkg }}"
state: present

5.官方推荐方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#定义阶段
#创建主机组变量定义目录
mkdir group_vars
[root@m01 ~]# vim group_vars/webs
web_pkg: httpd

#定义阶段
[root@m01 ~]# cat group_vars/webs
web_pkg: httpd
#定义阶段
[root@m01 ~]# cat host_vars/zls_web01
web_pkg: nginx

[root@m01 ~]# vim web.yml
- hosts: webs
tasks:
- name: Install web server
yum:
name: "{{ web_pkg }}"
state: present

6.命令行定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#调用阶段
[root@m01 ~]# !vim
vim web.yml
- hosts: webs
tasks:
- name: Install httpd Server
yum:
name:
- "{{ web_pkg }}"

- name: Install mariadb Server
yum:
name:
- "{{ db_pkg }}"


#定义阶段
[root@m01 ~]# ansible-playbook web.yml -e "web_pkg=vsftpd" -e "db_pkg=unzip"

Ansible变量优先级测试

1
2
3
4
5
6
7
8
9
- hosts: webs
vars:
dir: playbook_vars
vars_files: ./vars_file.yml
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory
1
2
[root@m01 ~]# vim vars_file.yml
dir: vars_file
1
2
[root@m01 ~]# vim host_vars/zls_web01
dir: host_vars
1
2
[root@m01 ~]# vim group_vars/webs
dir: group_vars

测试阶段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#1.
[root@m01 ~]# ansible-playbook test.yml -e "dir=command_vars"
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars

#2.
[root@m01 ~]# ansible-playbook test.yml
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file

#3.
[root@m01 ~]# vim test.yml
- hosts: webs
vars:
dir: playbook_vars
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory

[root@m01 ~]# ansible-playbook test.yml
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:52 playbook_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file

#4.
- hosts: webs
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory

[root@m01 ~]# ansible-playbook test.yml

命令行 > vars_file > playbook vars > host_vars > group_vars

ansible层级定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php

lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php

lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat

#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp.framework.web_package }}"

- name: Install LAMP mariadb-server
yum:
name: "{{ lamp.framework.db_package }}"

- name: Install LAMP php
yum:
name: "{{ lamp.framework.php_package }}"

#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}"

- name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}"

- name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}"

#执行playbook
[root@m01 ~]# ansible-playbook test.yml

PLAY [web_group] *****************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]

TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1
2
3
4
5
6
7
- hosts: webs
tasks:
- name: mem
file:
path: /opt/{{ ansible_facts['fqdn'] }}
#path: /root/{{ ansible_fqdn }}
state: directory

关闭facts

1
2
3
4
[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:

自动化运维工具-Ansible基础

什么是Ansible

Ansible是一个自动化统一配置管理工具

同类型软件对比

1.puppet 学习难,安装ruby环境难,没有远程执行功能
2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
3.saltstack 一般选择salt会使用C/S结构的模式,salt-mastersalt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消协队列

Ansible使用的是python2

saltstack即有python2也有python3

Ansible的功能及优点

1.远程执行
批量执行远程命令,可以对多台主机进行远程操作

2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停

3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理

4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。

5.二次开发
因为语法是Python,所以便于运维进行二次开发。

6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署

7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache和启动服务

在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd

在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx

Ansible的架构

1568165740284

Ansible的执行流程

1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。

安装Ansible

1.环境准备

主机名 wanIP lanIP 角色
m01 10.0.0.61 172.16.1.61 Ansible控制端
web01 10.0.0.7 172.16.1.7 Ansible被控端
web02 10.0.0.8 172.16.1.8 Ansible被控端

2.安装ansible

1
[root@m01 ~]# yum install -y ansible

3.查看ansible模块及版本

1
2
3
4
5
6
7
[root@m01 ~]# ansible --version
ansible 2.8.4
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

4.ansible参数

1
2
3
4
5
6
7
8
9
10
# ansible <host-pattern> [options]
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
ansible-doc #帮助

5.ansible配置文件读取顺序

1
2
3
4
5
6
7
8
9
10
11
[root@m01 ~]# vim /etc/ansible/ansible.cfg
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first

1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~/.ansible.cfg
4、/etc/ansible/ansible.cfg

ansible配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#inventory      = /etc/ansible/hosts      #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志

#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

ansible Inventory(主机清单文件)

场景一:密码方式连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@m01 ~]# cat /etc/ansible/hosts

#方式一、IP+端口+用户+密码
[webs]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'

#方式二、主机名+密码
[webs]
web0[1:2] ansible_ssh_pass='123456'

#方式三、主机+密码
[webs]
web0[1:2]
[webs:vars]
ansible_ssh_pass='123456'

注意:方式二和方式三,都需要做hosts解析

场景二:密钥方式连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#创建密钥对
[root@m01 ~]# ssh-keygen
#推送公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8

#方式一:
[web_group]
172.16.1.7
172.16.1.8

#方式二:
[webs]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8

场景三:主机组定义方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8

[db_group]
db01 ansible_ssh_host=172.16.1.51
lb01 ansible_ssh_host=172.16.1.5
[db_group:vars]
ansible_ssh_pass='1'

[nfs_group]
nfs ansible_ssh_host=172.16.1.31

[nfs_server:children]
web_group
nfs_group

[lnmp:children]
web_group
db_group


[root@m01 ~]# ansible 'all' --list-host
hosts (5):
nfs
web01
web02
db01
lb01
[root@m01 ~]# ansible 'web_group' --list-host
hosts (2):
web01
web02
[root@m01 ~]# ansible 'db_group' --list-host
hosts (2):
db01
lb01
[root@m01 ~]# ansible 'lnmp' --list-host
hosts (4):
web01
web02
db01
lb01

ad-hoc模式命令使用

1568174302939

结果返回颜色

1
2
3
绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示

ansible常用模块

1.command

1
2
3
4
5
6
7
8
9
10
[root@m01 ~]# ansible 'web_group' -m command -a 'free -m'
web02 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 972 140 489 7 342 658
Swap: 1023 0 1023

web01 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 972 113 412 13 446 669
Swap: 1023 0 1023

2.shell

1
2
3
4
5
6
7
8
[root@m01 ~]# ansible 'web_group' -m shell -a 'ps -ef|grep nginx'
web02 | CHANGED | rc=0 >>
root 12584 12583 0 20:16 pts/1 00:00:00 /bin/sh -c ps -ef|grep nginx
root 12586 12584 0 20:16 pts/1 00:00:00 grep nginx

web01 | CHANGED | rc=0 >>
root 14575 14570 0 12:16 pts/1 00:00:00 /bin/sh -c ps -ef|grep nginx
root 14577 14575 0 12:16 pts/1 00:00:00 grep nginx

1)command不支持特殊符号

2)shell模块支持特殊符号

3)不指定-m 默认使用的是command模块

3.script

1
2
3
4
5
6
7
[root@m01 ~]# vim vsftpd.sh 
#!/usr/bin/bash
mkdir /tmp/zls

[root@m01 ~]# ansible 'web01' -m script -a '/root/vsftpd.sh'

[root@m01 ~]# ansible 'web01' -m shell -a 'ls -l /tmp'

4.yum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=vsftpd state=present'
#相当于:yum install -y vsftpd

[root@m01 ~]# ansible 'web_group' -m yum -a 'name=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present'
#相当于:yum install -y https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm

[root@m01 ~]# ansible 'web_group' -m yum -a 'name=file:///root/nagios-4.4.3-1.el7.x86_64.rpm state=present'
#相当于:yum localinstall -y nagios-4.4.3-1.el7.x86_64.rpm

[root@m01 ~]# ansible 'web_group' -m yum -a 'name=vsftpd state=absent'
#相当于:yum remove -y vsftpd

name
httpd #指定要安装的软件包名称
file:// #指定本地安装路径(yum localinstall 本地rpm包)
http:// #指定yum源(从远程仓库获取rpm包)

state #指定使用yum的方法
installed,present #安装软件包
removed,absent #移除软件包
latest #安装最新软件包

5.yum_repository

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- name: Add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/


#添加yum仓库
ansible 'web_group' -m yum_repository -a 'name=zls_epel,zls_base description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no enabled=yes file=zls_epel'

#添加mirrorlist
ansible 'web_group' -m yum_repository -a 'name=zls_epel description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no enabled=yes file=epel mirrorlist=http://mirrorlist.repoforge.org/el7/mirrors-rpmforge'

#删除yum仓库
ansible 'web_group' -m yum_repository -a 'name=zls_epel,zls_base file=zls_epel state=absent'

#修改yum仓库
ansible 'web_group' -m yum_repository -a 'name=epel description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no enabled=no file=epel'

name #指定仓库名字
description #添加描述(repo文件中的name)
baseurl #指定yum仓库的地址
gpgcheck #是否开启校验
yes
no
enabled #是否启用yum仓库
yes
no
file #指定仓库文件名
state
absent #删除yum仓库
present #创建yum仓库


ansible 'web_group' -m yum_repository -a 'name=zls_yum description=EPEL baseurl=http://www.driverzeng.com gpgcheck=no enabled=no file=zls'

ansible文件管理模块

1.copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- name: Copy file with owner and permissions
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: '0644'


#推送文件
[root@m01 ~]# ansible 'web_group' -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=0644'

#推送文件并备份
[root@m01 ~]# ansible 'web_group' -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=0644 backup=yes'

#编辑nfs配置文件
[root@m01 ~]# ansible 'web_group' -m copy -a 'content="/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" dest=/etc/exports'

src #指定推送的源文件
dest #指定推送的目标位置
owner #指定属主
group #指定属组
mode #指定权限(数字方式)
content #在指定文件中添加内容
backup #是否备份(注意:控制端和被控端,内容不一致才会备份)
yes
no

2.file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
- name: Create an insecure file
file:
path: /work
owner: root
group: root
mode: 0755

#创建目录 mkdir
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/backup state=directory owner=adm group=adm mode=0700'

#递归创建目录并授权chown -R chmod -R
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/zls/mysql/db01 state=directory owner=adm group=adm mode=0700 recurse=yes'

#创建文件(前提条件,上级目录必须存在) touch
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/root/zls.txt state=touch'

#删除目录 rm -fr
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/backup state=absent'

#做软链接 ln -s
[root@m01 ~]# ansible 'web_group' -m file -a 'src=/root/zls.txt dest=/root/zls.txt.ori state=link'

src #指定软链接的源文件
dest #指定软连接的目标文件
path #指定创建目录或文件
state
touch #创建文件
directory #创建目录
absent #删除目录或文件
link #做软链接
owner #指定属主
group #指定属组
mode #指定权限
recurse #递归授权
yes
no

3.get_url

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- name: Download foo.conf
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
mode: '0440'

#下载worldpress代码
[root@m01 ~]# ansible 'web_group' -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz dest=/root mode=0777'

#下载并校验MD5
[root@m01 ~]# ansible 'web_group' -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/test.txt dest=/root mode=0777 checksum=md5:ba1f2511fc30423bdbb183fe33f3dd0f'

url #指定下载文件的url
dest #指定下载的位置
mode #指定下载后的权限
checksum #校验
md5 #md5校验
sha256 #sha256校验

ansible服务管理模块

1.service,systemd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=stopped enabled=yes'
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=started enabled=yes'
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=restarted enabled=yes'
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=reloaded enabled=yes'

name #指定服务名称
state
started #启动
stopped #停止
restarted #重启
reloaded #重载
enabled #是否开机自启
yes
no

ansible用户管理模块

1.group

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- name: Ensure group "somegroup" exists
group:
name: somegroup
state: present

#创建组
[root@m01 ~]# ansible 'web_group' -m group -a 'name=www gid=666 state=present'

#删除组
[root@m01 ~]# ansible 'web_group' -m group -a 'name=www gid=666 state=absent'

name #指定组名
gid #指定gid
state
present #创建
absent #删除

2.user

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
- name: Create a 2048-bit SSH key for user jsmith in ~jsmith/.ssh/id_rsa
user:
name: jsmith
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa

#创建用户
[root@m01 ~]# ansible 'web_group' -m user -a 'name=www uid=666 group=www state=present shell=/sbin/nologin create_home=false'

#删除用户
[root@m01 ~]# ansible 'web_group' -m user -a 'name=www uid=666 state=absent'

#创建用户的同时创建密钥对
[root@m01 ~]# ansible 'web_group' -m user -a 'name=zls generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'

name #指定用户名
uid #指定uid
group #指定属组
groups #指定附加组
state
present #创建用户
absent #删除用户
shell #指定用户登录的shell
/bin/bash
/sbin/nologin
create_home #是否创建家目录
true
false
comment #添加注释
generate_ssh_key #创建密钥对
ssh_key_bits #指定密钥对长度
ssh_key_file #指定密钥文件

Ansible playbook

什么是playbook

playbook(剧本)是由两部分组成

play:主机或者主机组(角色:可以有一个或者多个)

task:指定工作(动作,台词:一个或者多个)


在Ansible中”剧本文件”是以yml结尾的文件。

在SaltStack中”剧本文件”是以sls结尾的文件。

但是语法,使用的都是yaml语法

playbook的组成

1568631108546

playbook和Ad-Hoc对比

特点 PlayBook ad-hoc
完整性
持久性
执行效率
变量 支持 不支持
耦合度

1.PlayBook功能比ad-hoc更全,是对ad-hoc的一种编排.
2.PlayBook能很好的控制先后执行顺序, 以及依赖关系.
3.PlayBook语法展现更加的直观.
4.playbook可以持久使用,ad-hoc无法持久使用.

YAML语法

1
2
3
4
5
6
7
8
9
10
11
12
缩进:

中国:
上海: 浦东新区
北京:
- 朝阳区
- 海淀区
- 昌平区
- 大兴区

美国:
德克萨斯州: 电信一区
1
2
冒号:只要不是以冒号结尾的冒号,冒号后面都要加空格
短横线-:代表一个层级,在Python中专业叫法,代表是一个列表

安装httpd练习

1.安装httpd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@m01 httpd]# vim httpd.yml
#角色
- hosts: web_group

#动作
tasks:
- name: install httpd server
yum:
name: httpd
state: present

#检查语法
[root@m01 httpd]# ansible-playbook --syntax-check httpd.yml

playbook: httpd.yml

#执行
[root@m01 httpd]# ansible-playbook httpd.yml
PLAY [web_group] ********************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [zls_web02]
ok: [zls_web01]

TASK [install httpd server] *********************************************************************************************************
changed: [zls_web01]
changed: [zls_web02]

PLAY RECAP **************************************************************************************************************************
zls_web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
zls_web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

2.启动httpd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#角色
- hosts: web_group

#动作
tasks:
- name: install httpd server
yum:
name: httpd
state: present

- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

3.关闭防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- hosts: web_group

#动作
tasks:
#关闭防火墙
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

#安装httpd
- name: install httpd server
yum:
name: httpd
state: present

#开启httpd
- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

4.给默认站点页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#角色
- hosts: web_group

#动作
tasks:
#关闭防火墙
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

#安装httpd
- name: install httpd server
yum:
name: httpd
state: present

#开启httpd
- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

#配置默认页面
- name: Config index.html
copy:
content: "zls_web_page"
dest: /var/www/html/index.html
group: root
owner: root
mode: 0644

5.给不同的web配置不同的页面(多个play)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#角色
- hosts: web_group

#动作
tasks:
#关闭防火墙
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

#安装httpd
- name: install httpd server
yum:
name: httpd
state: present

#开启httpd
- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

- hosts: zls_web01
tasks:

- name: Config index.html
copy:
content: "zls_web01_page"
dest: /var/www/html/index.html
group: root
owner: root
mode: 0644

- hosts: zls_web02
tasks:

- name: Config index.html
copy:
content: "zls_web02_page"
dest: /var/www/html/index.html
group: root
owner: root
mode: 0644

rsyncd实战

1.环境准备

主机名 wanIP lanIP 服务 角色
m01 10.0.0.61 172.16.1.61 Ansible 控制端(导演)
backup 10.0.0.41 172.16.1.41 rsync服务端 被控端(男一)
web01 10.0.0.7 172.16.1.7 rsync客户端 被控端(女二)
web02 10.0.0.8 172.16.1.8 rsync客户端 被控端(女二)

2.战前准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#准备项目目录
[root@m01 project]# mkdir rsyncd

#配置文件
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

#准备主机清单
[web_group]
zls_web01 ansible_ssh_host=172.16.1.7
zls_web02 ansible_ssh_host=172.16.1.8

[backup_group]
backup ansible_ssh_host=172.16.1.41

[rsync_server:children]
web_group
backup_group

3.写剧本

1)安装rsync服务端和客户端

2)配置rsync服务端

3)创建目录授权

4)创建密码文件授权

5)创建系统用户

6)启动rsync并加入开机自启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
[root@m01 rsyncd]# vim rsyncd.yml
[root@m01 rsyncd]# cat rsyncd.yml
- hosts: rsync_server
tasks:

#关闭防火墙
- name: Stop firewalld
systemd:
name: firewalld
state: stopped
enabled: no

- name: SCP YUM REPO
copy:
src: /etc/yum.repos.d/CentOS-Base.repo
dest: /etc/yum.repos.d/

#安装rsync服务端和客户端
- name: Install rsyncd Server
yum:
name: rsync
state: present
#创建系统用户组
- name: Create www Group
group:
name: www
gid: 666
state: present
#创建系统用户
- name: Create www User
user:
name: www
uid: 666
group: www
create_home: false
shell: /sbin/nologin


- hosts: backup_group
tasks:
#配置rsync服务端
- name: Config rsyncd Conf
copy:
src: ./rsyncd.j2
dest: /etc/rsyncd.conf
owner: root
group: root
mode: 0644

#创建目录授权
- name: Create dir
file:
path: /backup
state: directory
owner: www
group: www
mode: 0755
recurse: yes

#创建密码文件授权
- name: Create passwd file
copy:
content: "rsync_backup:123"
dest: /etc/rsync.passwd
owner: root
group: root
mode: 0600


#启动rsync并加入开机自启
- name: Start rsyncd
systemd:
name: rsyncd
state: started
enabled: yes

#配置客户端
- hosts: web_group
tasks:
- name: Config client passwd file
copy:
content: "123"
dest: /etc/rsync.pass
owner: root
group: root
mode: 0600

SSH远程管理

ssh功能

SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?

1.提供远程连接服务器的服务

2.对传输的数据进行加密

Linux远程链接:ssh协议(加密) telnet(明文)

windows远程连接:RDP协议 (remote desktop)

协议 端口
ssh 22
telnet 23
RDP 3389
http 80
https 443
FTP 20 21
POP3 110
MySQL 3306
Rsync 873
DNS 53

SSH相关命令

SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp文件传输、ssh-copy-id秘钥分发等应用程序。

1
2
3
4
5
6
[root@m01 ~]# ssh root@10.0.0.41
ssh:客户端命令
root:系统用户名
@:分割用户和主机
10.0.0.41:主机的IP(可以是公网也可以是内网)
-p:指定端口

Xshell连接不上虚拟机

1.检查网络

1
2
3
#连谁ping谁
ping 10.0.0.41
tcping 10.0.0.41 22

2.检查端口

1
2
telnet 10.0.0.41 22
tcping 10.0.0.41 22

1565231029898

3.如果可以ping通,端口不通

1
2
3
4
5
6
#检测sshd服务是否启动
netstat -lntup|grep 22

#防火墙 selinux
systemctl stop firewalld
setenforce 0

scp命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -P 指定端口,默认22端口可不写
# -r 表示递归拷贝目录
# -p 表示在拷贝文件前后保持文件或目录属性不变
# -l 限制传输使用带宽(默认kb)

#推:将本地/tmp/oldboy推送至远端服务器10.0.0.61的/tmp目录,使用对端的root用户
[root@m01 ~]# scp -P22 -rp /tmp/oldboy oldboy@10.0.0.61:/tmp

#拉:将远程10.0.0.61服务器/tmp/oldboy文件拉取到本地/opt/目录下
[root@m01 ~]# scp -P22 -rp root@10.0.0.61:/tmp/oldboy /opt/

#限速
[root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31 password:
test 100% 656MB '83.9MB/s' 00:07
#限速为8096kb,换算为MB,要除以 8096/8=1024KB=1MB
[root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31s password:
test 7% 48MB '1.0MB/s' 09:45

SSH验证方式

1.用户名密码

1
[root@m01 ~]# ssh root@10.0.0.41

2.密钥登陆方式

默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。

img

1.管理机生成密钥对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@m01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:P6UswOccoZSLunZ0gekcQ/gDzhFNkH/+I1WHhtwQro8 root@m01
The key's randomart image is:
+---[RSA 2048]----+
| oB. .. |
| = o o. |
| o * oo.o+ . |
| o O+o+o.= . |
| o.**.So .. |
| .+ oB.+ o |
| .. .Eo= = |
| ... . o. . |
| ... . . |
+----[SHA256]-----+

[root@m01 ~]# ll .ssh/
total 8
-rw------- 1 root root 1679 Aug 8 19:07 id_rsa #私钥(宝塔镇河妖)
-rw-r--r-- 1 root root 390 Aug 8 19:07 id_rsa.pub #公钥(天王盖地虎)

2.管理机推送公钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
方式一(手动):
#在要连接的服务器上家目录下创建.ssh目录(用哪个用户连,就创建在哪个家目录下)
mkdir /root/.ssh
#授权700
chmod 700 /root.ssh
#在m01上查看公钥文件内容
cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuxyeePaQr6cI6KMINgW7262dDdfgiiwspNjKYEoEj7cfjpMBPBCpqTO4H5+E8U/GcxsFcj2S2fHlRevPMa8vXYqOvX3O0Xp/C9zNMJrNdT+NdpCnDHRpsF4/Egr0xxKju7LPC1qz/Gu6ksx1VqUmcX2RKrQdV2BYi+pqu/2SQYOUUjKpen0zWxnhjuVmZMV+hPHgs4ILbGwwmYxqY+ldvP0guviQ2CeK1JtQIbP2Q5bBSlMwPxr4P303LUkIBsI3pHRoCMnDT0YI9x9JjdRkkUNjeFoTAE4APsTgICd6nzRBfRRf/VOYk5REuub367yxrOZpfNXOcJ6QCRLYQl6Xn root@m01

#创建公钥文件authorized_keys
vim ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuxyeePaQr6cI6KMINgW7262dDdfgiiwspNjKYEoEj7cfjpMBPBCpqTO4H5+E8U/GcxsFcj2S2fHlRevPMa8vXYqOvX3O0Xp/C9zNMJrNdT+NdpCnDHRpsF4/Egr0xxKju7LPC1qz/Gu6ksx1VqUmcX2RKrQdV2BYi+pqu/2SQYOUUjKpen0zWxnhjuVmZMV+hPHgs4ILbGwwmYxqY+ldvP0guviQ2CeK1JtQIbP2Q5bBSlMwPxr4P303LUkIBsI3pHRoCMnDT0YI9x9JjdRkkUNjeFoTAE4APsTgICd6nzRBfRRf/VOYk5REuub367yxrOZpfNXOcJ6QCRLYQl6Xn root@m01

#授权600
chmod 600 ~/.ssh/authorized_keys
1
2
3
方式二:
#使用命令推送公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7

免交互expect[扩展]

1.安装expect

1
[root@m01 ~]# yum install -y expect

2.编写expect脚本

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/expect
set ip 10.0.0.51
set pass 123456
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "df -h\r"}
expect "root@*" {send "exit\r"}
expect eof

免交互sshpass[扩展]

1.安装sshpass

1
[root@m01 ~]# yum install -y sshpass

2.使用sshpass命令

1
2
3
4
5
6
7
[root@m01 ~]# sshpass -p 123456 ssh root@10.0.0.51

[option]
-p:指定密码
-f:从文件中取密码
-e:从环境变量中取密码
-P:设置密码提示

实时同步sersync实战

什么是实时同步

实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。

sersync和rsync+inotify对比

提到数据同步就必然会谈到rsync,一般简单的服务器数据传输会使用ftp/sftp等方式,但是这样的方式效率不高,不支持差异化增量同步也不支持实时传输。针对数据实时同步需求大多数人会选择rsync+inotify-tools的解决方案,但是这样的方案也存在一些缺陷(文章中会具体指出),sersync是国人基于前两者开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。

项目地址

sersync项目实战

1)环境准备

角色 外网IP(NAT) 内网IP(LAN) 安装工具
web01 eth0:10.0.0.7 eth1:172.16.1.7 部署代码(提交作业)
nfs-server eth0:10.0.0.31 eth1:172.16.1.31 rsync+inotify+sersync
backup eth0:10.0.0.41 eth1:172.16.1.41 rsync-server

1.实时同步哪台服务器的目录,那么就在哪台服务器上安装sersync

2.只要安装sersync 就必须安装rsyncinotify

安装rsync的服务端(backup)

1)安装rsync服务

1
[root@backup ~]# yum install -y rsync

2)配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@backup ~]# vim /etc/rsyncd.conf 
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[zls]
comment = welcome to oldboyedu backup!
path = /backup

[nfs]
comment = welcome to oldboyedu backup!
path = /data

3)创建用户

1
2
[root@backup ~]# groupadd www -g 666
[root@backup ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

4)创建目录并授权

1
2
[root@backup ~]# mkdir /data  /backup
[root@backup ~]# chown -R www.www /data/ /backup/

5)创建虚拟用户的密码文件并授权

1
2
[root@backup ~]# echo 'rsync_backup:123' > /etc/rsync.passwd 
chmod 600 /etc/rsync.passwd

6)启动rsync服务

1
[root@backup ~]# systemctl start rsyncd

NFS服务端部署sersync

1)安装sersync需要依赖rsyncinotify

1
[root@nfs ~]# yum install -y rsync inotify-tools

2)下载sersync

1
[root@nfs ~]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz

3)部署sersync

​ 源码包:解压 生成 编译 安装

​ 解压:

1
[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

4)移动并改名

1
[root@nfs ~]# mv GNU-Linux-x86 /usr/local/sersync

5)编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
[root@nfs ~]# vim /usr/local/sersync/confxml.xml
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>
-----------------------------------------------------------------------------------------
<sersync>
#监控的目录,改成/data
<localpath watch="/opt/tongbu">
#推送的IP(backup服务的IP)172.16.1.41 ,name是模块名
<remote ip="127.0.0.1" name="tongbu1"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
#执行rsync的参数改成 -az
<commonParams params="-artuz"/>
#虚拟用户的用户名和密码文件,开启认证start=true rsync_backup /etc/rsync.pass
<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
#设置超时时间
<timeout start="true" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>


#完整配置文件
[root@nfs ~]# cat /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>

<sersync>
<localpath watch="/data">
<remote ip="172.16.1.41" name="nfs"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-az"/>
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pass"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="true" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>

<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>

<plugin name="socket">
<localpath watch="/opt/tongbu">
<deshost ip="192.168.138.20" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
</localpath>
</plugin>
</head>

6)创建虚拟用户的密码文件,并授权

1
2
[root@nfs sersync]# echo '123' > /etc/rsync.pass
[root@nfs sersync]# chmod 600 /etc/rsync.pass

7)查看帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nfs sersync]# /usr/local/sersync/sersync2 -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________

8)启动sersync

1
[root@nfs data]# /usr/local/sersync/sersync2 -rdo /usr/local/sersync/confxml.xml

————————————————rsync服务端————————————————–

1)安装

1
[root@backup ~]# yum install -y rsync

2)改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[zls]
comment = welcome to oldboyedu backup!
path = /backup

3)创建系统用户

1
[root@backup ~]# useradd rsync -s /sbin/nologin  -M

4)创建虚拟用户及密码文件并授权

1
2
[root@backup ~]# echo 'rsync_backup:123' > /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd

5)创建目录并授权

1
2
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup

6)启动服务并加入开机自启

1
2
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd

———————————————————-rsync的客户端(nfs)——————————————————————

1)安装sersync(rsync+inotify)

1
[root@nfs ~]# yum install -y rsync inotify-tools

2)安装sersync

下载:

1
[root@nfs ~]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz

解压:

1
[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

移动并改名:

1
[root@nfs ~]# mv GNU-Linux-x86 /usr/local/sersync

3)修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@nfs ~]# vim /usr/local/sersync/confxml.xml
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>

<sersync>
<localpath watch="/zls">
<remote ip="172.16.1.41" name="zls"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-az"/>
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pas"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="true" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>

4)创建目录

1
[root@nfs ~]# mkdir /zls

5)创建密码文件并授权

1
2
[root@nfs ~]# echo '123' > /etc/rsync.pas
[root@nfs ~]# chmod 600 /etc/rsync.pas

6)启动sersync

1
[root@nfs ~]# /usr/local/sersync/sersync2 -rdo /usr/local/sersync/confxml.xml

sersync 就是rsync的客户端

底层调用:rsync和inotify

Nginx实现反向代理

1)在web01和web02上安装nginx和php

2)创建www用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@web01 php]# groupadd www -g 666
[root@web01 php]# useradd www -u 666 -g 666 -s /sbin/nologin -M

[root@web02 php]# groupadd www -g 666
[root@web02 php]# useradd www -u 666 -g 666 -s /sbin/nologin -M

[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

[root@db01 ~]# groupadd www -g 666
[root@db01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

[root@backup ~]# groupadd www -g 666
[root@backup ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

3)修改nginx和PHP启动用户

1
2
3
4
5
6
7
8
9
10
11
12
[root@web01 php]# vim /etc/nginx/nginx.conf 
user www;
[root@web01 php]# vim /etc/php-fpm.d/www.conf
user = www
group = www


[root@web02 php]# vim /etc/nginx/nginx.conf
user www;
[root@web02 php]# vim /etc/php-fpm.d/www.conf
user = www
group = www

4)编辑nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@web01 php]# vim /etc/nginx/conf.d/blog.drz.com.conf
server {
listen 80;
server_name blog.drz.com;
root /code/wordpress;
index index.php index.html;
access_log /var/log/nginx/blog.drz.com_access.log main;

location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}

[root@web01 php]# vim /etc/nginx/conf.d/zh.drz.com.conf
server {
listen 80;
server_name zh.drz.com;
root /code/zh;
index index.php index.html;
access_log /var/log/nginx/zh.drz.com_access.log main;

location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

}

5)创建站点目录并授权

1
[root@web01 php]# mkdir -p /code/{wordpress,zh}

6)代码上线

1
2
[root@web01 code]# tar xf wordpress-5.0.3-zh_CN.tar.gz
[root@web01 code]# unzip WeCenter_3-3-3.zip

7)创建出用户上传目录

1
2
[root@web01 code]# mkdir /code/wordpress/wp-content/uploads
[root@web01 php]# chown -R www.www /code/

8)启动nginx和php并加入开机自启

1
2
[root@web01 code]# systemctl start nginx php-fpm
[root@web01 code]# systemctl enable nginx php-fpm

9)安装数据库

1
[root@db01 ~]# yum install -y mariadb-server

10)启动数据库

1
[root@db01 ~]# systemctl start mariadb

11)设置数据库root用户的密码

1
[root@db01 ~]# mysqladmin -uroot password '123'

12)免交互创建数据库

1
2
3
4
5
#创建数据库
[root@db01 ~]# mysqladmin -uroot -p123 create wordpress
[root@db01 ~]# mysql -uroot -p123 -e 'create database zh'
#查看数据库
[root@db01 ~]# mysql -uroot -p123 -e 'show databases'

13)免交互创建程序连接MySQL用户

1
2
[root@db01 ~]# mysql -uroot -p123 -e "grant all on wordpress.* to wp@'172.16.1.%' identified by '1'"
[root@db01 ~]# mysql -uroot -p123 -e "grant all on zh.* to zh@'172.16.1.%' identified by '1'"

1566436371652

1566436380746

1566436415252

14)部署第二台web

1
2
3
4
5
6
7
8
9
10
11
12
#推送代码
[root@web01 code]# scp -r /code 172.16.1.8:/
#推送配置文件
[root@web01 ~]# scp /etc/nginx/conf.d/* 172.16.1.8:/etc/nginx/conf.d/
#授权
[root@web02 php]# chown -R www.www /code/
#删除默认虚拟主机配置文件
[root@web01 ~]# rm -f /etc/nginx/conf.d/default.conf
[root@web02 php]# rm -f /etc/nginx/conf.d/default.conf
#启动nginx和php并加入开机自启
[root@web02 php]# systemctl start nginx php-fpm
[root@web02 php]# systemctl enable nginx php-fpm

15)共享静态资源

  • 安装nfs服务端
1
2
[root@nfs ~]# yum install -y nfs-utils
[root@backup ~]# yum install -y nfs-utils
  • 修改配置文件
1
2
3
4
5
6
7
[root@nfs ~]# vim /etc/exports
/data/wordpress 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@backup ~]# vim /etc/exports
/data/wordpress 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zh 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  • 创建共享目录
1
2
3
4
5
[root@nfs ~]# mkdir -p /data/{wordpress,zh}
[root@nfs ~]# chown -R www.www /data

[root@backup ~]# mkdir -p /data/{wordpress,zh}
[root@backup ~]# chown -R www.www /data
  • 启动nfs和rpcbind
1
2
3
4
5
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server

[root@backup ~]# systemctl start nfs-server
[root@backup ~]# systemctl enable nfs-server
  • 安装nfs客户端
1
2
[root@web01 code]#  yum install -y nfs-utils
[root@web02 php]# yum install -y nfs-utils
  • 查看挂载点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@web01 code]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh 172.16.1.0/24
/data/wordpress 172.16.1.0/24
[root@web01 code]# showmount -e 172.16.1.41
Export list for 172.16.1.41:
/data/zh 172.16.1.0/24
/data/wordpress 172.16.1.0/24


[root@web02 php]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zh 172.16.1.0/24
/data/wordpress 172.16.1.0/24
[root@web02 php]# showmount -e 172.16.1.41
Export list for 172.16.1.41:
/data/zh 172.16.1.0/24
/data/wordpress 172.16.1.0/24
  • 挂载
1
2
3
4
5
6
[root@web01 code]# mount -t nfs 172.16.1.31:/data/wordpress /code/wordpress/wp-content/uploads/
[root@web01 code]# mount -t nfs 172.16.1.31:/data/zh /code/zh/uploads/


[root@web02 php]# mount -t nfs 172.16.1.31:/data/wordpress /code/wordpress/wp-content/uploads/
[root@web02 php]# mount -t nfs 172.16.1.31:/data/zh /code/zh/uploads/

16)部署rsync和sersync

  • 安装rsync服务端
1
[root@backup ~]# yum install -y rsync
  • 修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@backup ~]# vim /etc/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rc
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[nfs]
comment = welcome to oldboyedu backup!
path = /data
  • 创建密码文件并授权
1
2
[root@backup ~]# echo 'rc:123' > /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd
  • 启动rsyncd
1
[root@backup ~]# systemctl start rsyncd

17)客户端部署sersync

  • 安装rsync和inotify-tools
1
[root@nfs ~]# yum install -y rsync inotify-tools
  • 安装sersync
1
2
[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz 
[root@nfs ~]# mv GNU-Linux-x86/ /usr/local/sersync
  • 修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@nfs ~]# vim /usr/local/sersync/confxml.xml
<sersync>
<localpath watch="/data">
<remote ip="172.16.1.41" name="nfs"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-az"/>
<auth start="true" users="rc" passwordfile="/etc/rsync.pass"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="true" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
  • 创建密码文件并授权
1
2
[root@nfs ~]# echo 123 > /etc/rsync.pass
[root@nfs ~]# chmod 600 /etc/rsync.pass
  • 启动sersync
1
[root@nfs ~]# /usr/local/sersync/sersync2 -rdo /usr/local/sersync/confxml.xml

Nginx实现反向代理

Nginx服务支持的代理协议

1566439704173

反向代理使用的模块

img

ngx_http_uwsgi_module 代理python项目模块

重点:http_proxy_module

模块总结

反向代理模式与Nginx代理模块总结如表格所示

反向代理模式 Nginx配置模块
http、websocket、https、tomcat、Java程序 ngx_http_proxy_module
fastcgi(php程序) ngx_http_fastcgi_module
uwsgi(python程序) ngx_http_uwsgi_module
grpc(Golang程序) ngx_http_v2_module

环境准备

外网IP 内网IP 主机名
10.0.0.5 172.16.1.5 lb01
10.0.0.7 172.16.1.7 web01
10.0.0.8 172.16.1.8 web02

1)web01部署网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#准备配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name proxy.drz.com;

location / {
root /code/proxy;
index index.html;
}
}

#创建站点目录
[root@web01 ~]# mkdir /code/proxy
#部署代码
[root@web01 ~]# echo 'web01...' > /code/proxy/index.html
#重启nginx
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# nginx -s reload

在lb01上安装nginx

1
[root@lb01 php]# rpm -ivh nginx-1.16.1-1.el7.ngx.x86_64.rpm

1)配置代理

1
2
3
4
5
6
7
8
9
[root@lb01 ~]# vim /etc/nginx/conf.d/daili.conf
server {
listen 80;
server_name proxy.drz.com;

location / {
proxy_pass http://10.0.0.7;
}
}

2)创建www用户

3)修改启动用户

4)启动nginx

1
2
3
4
[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# nginx

解决问题

1
2
3
4
5
6
7
8
9
10
11
[root@lb01 ~]# vim /etc/nginx/conf.d/daili.conf
server {
listen 80;
server_name proxy.drz.com;

location / {
proxy_pass http://10.0.0.7;
proxy_set_header HOST $http_host;
proxy_http_version 1.1;
}
}

Nginx Web 基础入门

Nginx 部署

1)安装依赖

1
[root@web ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree

2)修改官方的yum源

1
2
3
4
5
6
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

3)使用yum安装nginx

1
[root@web01 ~]# yum install -y nginx

4)启动nginx并设置开机自启

1
2
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx

启动报错:

1565851672642

报错原因:80端口被占用

解决方法:谁占用的,干掉谁

1
systemctl stop httpd

5)监测nginx是否启动成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#方法一:监测进程
[root@web01 ~]# ps -ef|grep [n]ginx
root 12457 1 0 11:44 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 12458 12457 0 11:44 ? 00:00:00 nginx: worker process

#方法二:监测端口
[root@web01 ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12457/nginx: master

#方法三:systemd
[root@web01 ~]# systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2019-08-13 11:44:03 CST; 8min ago
Docs: http://nginx.org/en/docs/
Process: 12456 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 12457 (nginx)
CGroup: /system.slice/nginx.service
├─12457 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─12458 nginx: worker process

#方法四:打开浏览器访问
1
2
3
#方法五:curl命令
[root@web01 ~]# curl 10.0.0.7
[root@web01 ~]# curl www.driverzeng.com

6)查看nginx的版本

1
2
3
4
5
6
7
8
[root@web01 ~]# nginx -v
nginx version: nginx/1.16.0安装依赖yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools
换源
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
1
2
3
4
5
6
7
安装依赖yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools
换源
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1