网络综合架构

综合架构知识

 

目录

1.            综合架构. 5

1.1 综合架构阶段概述. 5

1.2 综合架构的组成部分:. 5

1.2.1 主要组成部分:. 5

1.2.2 架构完善部分:. 5

1.3 准备阶段. 6

1.3.1 架构的规划说明:. 6

1.3.2 系统基础优化部分:. 7

1.3.3 虚拟主机网络配置:. 8

1.3.4 虚拟主机的克隆操作. 9

1.3.5 架构部署顺序规划. 9

1.4 备份服务rsync 10

1.4.1 rsync 10

1.4.2 rsync命令详细用法说明. 11

1.4.3 rsync备份服务部署(守护进程) 13

1.4.4 rsync命令参数. 15

1.4.5 rsync守护进程企业应用. 16

1.4.6 rsync备份服务优缺点. 20

1.4.7 Rsync服务常见问题:. 20

1.4.8 补充:如何保证备份的数据属主和属组信息不变. 26

1.4.9 总结:rsync服务部署流程. 26

1.5 存储服务nfs 27

1.5.1 存储服务器概念介绍. 27

1.5.2 NFS存储服务器架构中作用. 27

1.5.3 NFS服务安装部署. 27

1.5.4 nfs存储服务存储原理. 30

1.5.5 nfs配置文件参数说明. 32

1.5.6 企业存储服务器部署方案:. 33

1.5.7 存储服务重要文件/命令总结. 34

1.5.8 客户端挂载参数说明:. 35

1.5.9 NFS服务程序常见的问题总结:. 36

1.5.10 NFS如何解决单点问题. 37

1.5.11 总结:nfs服务部署流程. 37

1.5.12 测试练习:. 38

1.6 全网备份项目. 39

1.6.1 项目流程:全网备份. 39

1.6.2 实际工作中:find命令排除指定目录不被搜索. 40

1.6.3 备份服务端完成什么操作:(backup). 41

1.6.4 实现定时任务备份数据. 42

1.6.5 编写定时任务 date 44

1.6.6 项目总结:. 45

1.7 远程连接(SSH服务). 45

1.7.1 远程连接服务概念介绍. 45

1.7.2 远程连接服务连接原理. 45

1.7.3 远程服务相关命令. 46

1.7.4 远程连接通讯建立. 46

1.7.5 SSH服务端配置文件说明:. 52

1.7.6 SSH防范远程入侵方案  亡羊补牢 -- 未雨绸缪. 52

1.7.7 免输ip登录服务器:(用户/IP/端口)起别名. 53

1.8 批量管理服务. 53

1.8.1 ansible批量管理服务概述. 53

1.8.2 ansible软件安装部署. 55

1.8.3 ansible软件配置及模块实践 ***** 55

1.8.4 用脚本实现批量部署服务. 75

1.8.5 ansible软件剧本编写 ***** 76

1.9 实时同步服务. 97

1.9.1 数据实时同步备份. 97

1.9.2 实时监控软件. 97

1.9.3 脚本如何实现实时同步:. 99

1.9.4 利用sersync软件实现实时同步. 100

1.9.5 inotify服务优化说明. 102

1.10 网站服务原理/名词. 102

1.10.1 用户访问网站的原理过程:. 102

1.10.2 用户访问网站HTTP协议原理. 102

1.10.3 HTTP协议资源   url/uri 104

1.10.4 访问资源分类:静态/动态/伪静态. 105

1.10.5 网站度量方式:面试题. 106

1.10.6 企业网站常见web服务. 106

1.10.1 总结:. 107

1.11 网站web服务(nginx). 107

1.11.1 nginx程序软件概念功能介绍. 107

1.11.2 nginx软件部署安装:. 108

1.11.3 nginx程序目录结构信息. 111

1.11.4 nginx程序配置文件说明. 111

1.11.5 运维网站代码上线流程:. 114

1.11.6 nginx程序企业应用方法:. 115

1.11.7 nginx程序日志配置说明. 121

1.11.8 nginx程序区域模块 - location (匹配uri) 122

1.11.9 nginx程序重写功能 (rewrite url/uri/伪静态) 124

1.11.10 常见跳转示例情况测试说明(测验练习). 126

1.11.11 nginx常用内置变量:. 131

1.12 LNMP架构 (网站web服务) 132

1.12.1 安装部署LNMP架构. 132

1.12.2 综合架构网站LNMP原理. 134

1.12.3 综合架构网站LNMP配置应用. 134

1.12.4 综合架构网站代码上线配置. 137

1.12.5 数据库如何进行数据迁移. 138

1.12.6 实现将用户上传的数据保存到NFS服务器中. 139

1.13 负载均衡. 140

1.13.1 负载均衡反向代理概念:. 140

1.13.2 部署负载均衡服务. 141

1.13.3 负载均衡模块详细说明. 143

1.13.4 负载均衡反向代理企业应用. 147

1.13.5 负载均衡反向代理总结:. 151

1.14 高可用服务. 151

1.14.1 高可用服务概念说明. 151

1.14.2 高可用服务如何实现. 151

1.14.3 高可用服务部署流程:. 151

1.14.4 高可用服务异常问题. 155

1.14.5 高可用服务安全配置. 158

1.14.6 高可用服务双主配置. 159

1.14.7 在keepalived配置文件中weight参数有什么用?. 165

1.14.8 监控nginx程序脚本:. 165

1.15 HTTPS安全证书访问连接. 166

1.15.1 网络安全涉及的问题:. 166

1.15.2 网络安全证书. 168

1.15.3 网站单台服务器实现HTTPS访问. 168

1.15.4 网站多台服务器实现HTTPS访问. 172

1.15.5 wordpress网站如何实现伪静态:(了解) 176

1.15.6 综合架构述职说明. 177

1.16 搭建yum本地仓库. 178

1.16.1 服务端. 178

1.16.2 客户端. 181

 

 

1.    综合架构知识

1.1 综合架构阶段概述

1)能力分水岭,架构述职(面试:曾经干过运维,你以前公司架构是什么)

2)学习很多服务(三剑客 vim 配置文件(定时任务 网卡)find w ps df free--监控服务)

3)学习到很多专业术语

什么是架构? 多台服务器组合在一起,服务器架构

什么是集群? 完成相同工作的一组服务器

什么是负载均衡?

4)学习服务的排错能力?运维工程师 服务稳定运行 进行架构服务的维护(不能出问题)

自动化部署服务

5)服务的优化操作

  

1.2 综合架构的组成部分:

1.2.1 主要组成部分:

1)防火墙服务器         实现访问流量安全控制

iptables(docker)/firewalld

2)负载均衡服务器 实现访问流量调度处理

nginx

3)web服务器   实现处理用户请求  

nginx

4)数据库服务器   实现数据信息存储(字符串)

mysql

5)存储服务器 实现数据信息存储(图片/附件)

NFS

6)备份服务器       实现数据信息备份  

rsync(自动备份 shell+定时任务/sersync实时备份)

7)缓存服务器 实现数据内存存储  

memcache/redis/mongodb

8)批量管理服务器   实现服务器批量管理  

ansible

9)监控服务器   实现监控服务运行状态/报警  

zabbix

 

1.2.2 架构完善部分:

1)解决单点问题   实现主备服务器切换  

keepalived

2)VPN服务器   远程技术人员身份  

pptpvpn (扩展研究)

      https://blog.oldboyedu.com/?s=vpn

3)审计服务器   监控内部人员的所有操作  

jumpserver(跳板机)

========================================

面试问题:

公司数据如何进行备份

回答:

    1)有备份服务器

    2)购买云存储设备(安全问题)

    3)两地三中心

图表 2‑1 简单的架构组成结构

 

    ========================================

1.3 准备阶段

1.3.1 架构的规划说明:

主机名称和IP地址规划  10台服务器 内存--10G

负载均衡服务器:

   lb01  10.0.0.5/24(外网)172.16.1.5/24(内网)

   lb02  10.0.0.6/24(外网)172.16.1.6/24(内网)

 

web服务器:

   web01  10.0.0.7/24(外网)172.16.1.7/24(内网)

   web02  10.0.0.8/24(外网)172.16.1.8/24(内网)

   web03  10.0.0.9/24(外网)172.16.1.9/24(内网)

 

数据库服务器:

   db01  10.0.0.51/24(外网)172.16.1.51/24(内网)

 

存储服务器:

   nfs01  10.0.0.31/24(外网)172.16.1.31/24(内网)

 

备份服务器:

   backup  10.0.0.41/24(外网)172.16.1.41/24(内网)

 

批量管理服务器:

   m01  10.0.0.61/24(外网)172.16.1.61/24(内网)

 

监控管理服务器:

   zabbix-server  10.0.0.71/24(外网)172.16.1.71/24(内网)

1.3.2 系统基础优化部分:

1. 安全优化

   防火墙关闭(永久)

   selinux关闭(永久)

 

2. yum镜像源

   阿里云镜像源

   清华yum源

 

3. 优化hosts文件(本地域名解析)

cat >>/etc/hosts<<EOF

172.16.1. 5     lb01

172.16.1.6     lb02

172.16.1.7     web01

172.16.1.8     web02

172.16.1.9     web03

172.16.1.51    db01

172.16.1.31    nfs01

172.16.1.41    backup

172.16.1.61    m01

172.16.1.71    zabbix-server

172.16.1.101    yum01

EOF

1.3.3 虚拟主机网络配置:

第一个步骤:创建第二块网卡,设置LAN区段

图表 2‑2 模板虚拟主机设置LAN区段实现内网的划分

 

第二个步骤:开启服务器,对第二块网卡进行地址配置

nmtui       (配置命令)

  第二块eth1主机地址要与第一块eth0主机地址一致,便于后期克隆后虚拟机IP地址的修改

systemctl restart NetworkManager

systemctl restart network

图表 2‑3 nmtui命令下的第二块网卡ip地址配置

 

 

 

第三个步骤:清除网卡的mac地址信息和UUID

sed -i '/UUID/d' /etc/sysconfig/network-scripts/ifcfg-eth[01]

   防止后期克隆主机后的地址或UUID冲突

第四个步骤:重启网卡服务

systemctl stop/disable NetworkManager

systemctl restart network

 

 

 

1.3.4 虚拟主机的克隆操作

第一个步骤:模板主机链接克隆

第二个步骤:需要对克隆好的主机进行配置

1)网卡地址修改

sed -i 's#200#41#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]

 

2)修改主机名称

hostnamectl set-hostname backup

 

3)建立新的xshell会话

systemctl restart network

   完整快照拍摄工作

 

PS:克隆好的主机要一台一台启动配置        

1.3.5 架构部署顺序规划

1. 部署备份服务器            (2天)

2. 部署存储服务器            (2天)

3. 全网备份项目(脚本)       (1天)

4. 实时备份服务              (1天)

5. 批量管理服务              (4天)*****

6. HTTP协议原理          (1天)

7. 网站web服务             (4天)*****

8. 如何搭建网站页面-LNMP    (2天)

9. 负载均衡反向代理          (1天)

10. 高可用服务              (1天)

11. 监控服务                (4天)*****

12. 实现HTTPS访问         (1天)

13. 防火墙服务              (1天)

14. 跳板机服务              (1天)

 

============================================

所有服务端部署流程:

    01. 软件部署安装

    02. 软件配置文件编写

    03. 软件环境准备(目录 文件 用户信息)

    04. 将服务进行启动 systemctl start/enable

    05. 进行服务程序验证

============================================

 

1.4 备份服务rsync

1.4.1 rsync

a fast, versatile, remote (and local) file-copying tool

  rsync软件是一个快速,多功能,远程和本地文件备份工具

  rsync软件可以实现全量和增量备份 (优势)

增量备份是如何实现的

    两种方式:数学算法--数据比对

    第一种:比对文件数据属性信息(默认)

    第二种:比对文件md5数值 

   rsync软件 cp  scp  rm  ls  1v4

   rsync替换cp:

cp /etc/hosts /tmp/           -- 备份文件

rsync /etc/hosts /tmp/       --- 备份文件

rsync -a /oldboy /tmp       --- 备份目录

   PS:rsync备份目录时

目录后面有/   oldboy/   将目录下面的数据信息进行备份

目录后面没有/  oldboy   将目录下面的内容以及目录备份都进行备份

   rsync替换scp:远程备份

scp -rp /etc/hosts  172.16.1.31:/tmp       --- 远程传输备份文件

rsync -rp /etc/hosts  172.16.1.31:/tmp

   rsync替换rm:

mkdir /null

rsync -avz --delete /null/ /tmp   --- 将目录中的数据进行删除或者清空

   --delete               无差异同步参数

   rsync替换ls:

rsync /etc/hosts

-rw-r-xr-x            391 2019/06/11 09:36:15 hosts

图表 2‑4 全量备份与增量备份区别

 

1.4.2 rsync命令详细用法说明

本地数据备份

   实现本地数据备份:等价于cp

   Local:  rsync [OPTION...] SRC... [DEST]

   src:需要备份的数据信息

   dest:备份到什么路径中

远程的方式备份

实现远程的方式备份:类似scp(全量备份)

Access via remote shell:

Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

   [USER@]: 以什么用户身份登录到远程主机,默认以当前登录用户身份登录远程主机

   HOST:    远程主机IP地址或者主机名称信息

   SRC:     需要拉取的远程主机数据信息

   dest:    数据保存到本地主机的路径信息

   Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

   SRC:     需要推送的本地主机数据信息

   [USER@]   以什么用户身份登录到远程主机,默认以当前登录用户身份登录远程主机

   HOST:    远程主机IP地址或者主机名称信息

   DEST:    数据保存到远程主机的路径信息

守护进程方式备份

采用守护进程方式进行数据传输备份(远程方式备份)

Access via rsync daemon:

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

Push: rsync [OPTION...] SRC...   [USER@]HOST::DEST

   src:  需要推送的本地主机数据信息

   [USER@]: 输入正确认证用户信息

   HOST:   远程主机IP地址或者主机名称信息

   ::DEST   指定备份数据的模块信息

rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

图表 2‑5 rsync中推与拉的作用说明

 

作用:

   1. 可以实现免交互传输数据

   2. 实现远程传输认证功能

   3. 守护进程方式具有配置文件,满足更多企业需求

   4. 控制客户端连接服务端的数量

1.4.3 rsync备份服务部署(守护进程)

服务端部署流程:

第一个历程:确认软件是否安装

rpm -qa rsync

yum install -y rsync

 

第二个历程:编写配置文件

vim /etc/rsyncd.conf

#rsync_config                         ---rsync 配置文件

#created by HQ at 2017               ---2017由总部创建

##rsyncd.conf start##

 

uid = rsync                       --- 备份目录的管理用户(属主信息)???

gid = rsync                       --- 备份目录的管理用户(属组信息)???

port = 873                        --- rsync守护进程服务端口号 

fake super = yes                   --- (伪装)属主

use chroot = no                   --- 和安全相关配置

max connections = 200             --- 最大连接数

timeout = 300                     --- 设置连接的超时时间

pid file = /var/run/rsyncd.pid        --- 记录服务的进程号码信息(停止服务

                                                 /判断服务是否启动)

lock file = /var/run/rsync.lock        --- 锁文件,进行连接的限制

log file = /var/log/rsyncd.log         --- 服务的日志文件

ignore errors                       --- 忽略错误,提高传输数据效率

read only = false                   --- 设置备份目录是可读可写

list = false                         --- 在客户端不显示模块信息

hosts allow = 172.16.1.0/24          --- 白名单(允许指定网段或者主机)

hosts deny = 0.0.0.0/32              --- 黑名单(拒绝指定网段或者主机)

auth users = rsync_backup           --- 指定认证的用户

secrets file = /etc/rsync.password     --- 创建一个密码文件(用户名称:用户

                                                             密码)

[backup]                                --- 模块信息

comment = "backup dir by oldboy"     --- 注释

path = /backup                          --- 指定备份目录路径信息

 

第三个历程:创建备份目录管理用户

useradd rsync -s /sbin/nologin -M

 

第四个历程:创建认证密码信息,并修改权限

echo "rsync_backup:oldboy123" >/etc/rsync.password

chmod 600 /etc/rsync.password

   rsync服务端的秘钥文件必须是600权限

 

第五个历程:创建备份目录,并修改目录权限

mkdir /backup

chown rsync.rsync /backup/

 

第六个历程:启动备份服务

systemctl start rsyncd

systemctl enable rsyncd

 

  

客户端部署流程:

第一个历程:创建密码文件,并修改权限

echo "oldboy123" >/etc/rsync.password

chmod 600 /etc/rsync.password

   rsync客户端的秘钥文件必须是600权限

 

第二个历程:实现免交互传输数据

rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

图表 2‑6 rsync客户端备份数据到服务端的映射过程

 

1.4.4 rsync命令参数

-v, --verbose       详细模式输出,传输时的进度等信息

 

-z, --compress          传输时进行压缩以提高传输效率,

                      --compress-level=NUM可按级别压缩。局域网可以不用压缩

 

-a, --archive        归档参数,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl

 

-r, --recursive      对子目录以递归模式,即目录下的所有目录都同样传输

 

-t, --times          保持文件时间信息不变(mtime)

 

-o, --owner              保持文件属主信息

 

-g, --group              保持文件属组信息

 

-p, --perms              保持文件权限

 

-P, --progress     显示同步的过程及传输时的进度等信息

 

-D, --devices     保持设备文件信息 b c s

 

-l, --links         保留软链接(小写字母l)  没什么用

 

-L, --copy-links    将链接文件源文件内容进行传输复制

 

-e, --rsh=COMMAND  使用的信道协议(remote shell),指定替代rsh的shell程序。

 

--exclude=PATTERN 指定排除不需要传输的文件信息(和tar参数一样)。??

 

--exclude-from=file    文件名所在的目录文件,即可以实现排除多个文件(和tar参数一样)。???

 

--bwlimit=RATE   limit I/O bandwidth; KBytes per second

                limit socket I/O bandwidth限速功能

案例:某DBA做数据同步,带宽占满,导致用户无法访问网站  git  

 

--delete(慎用)   让目标目录SRC和源目录数据DST一致,即无差异同步数据。

                我有什么,你就有什么

                我没什么,你也不能有

rsync -rtogpLvz     

 (rsync -avz  )

  

 

1.4.5 rsync守护进程企业应用

1.守护进程多模块功能配置 

开发人员

运维人员

数据库人员

 

创建多模块 --- 创建多模块对应目录并授权 --- 重启服务

[backup]

 comment = "backup dir by oldboy"

 path = /backup

 [devdir]

 path = /devdir

 [dbdir]

 path = /dbdir

 

2.守护进程的排除功能实践

   环境准备:

  [root@nfs01 ~]# mkdir /oldboy_dir/oldboy{01..03} -p

root@nfs01 ~]# touch /oldboy_dir/oldboy{01..03}/{a..c}.txt

root@nfs01 ~]# tree /oldboy_dir/

/oldboy_dir/

├── oldboy01

│?? ├── a.txt

│?? ├── b.txt

│?? └── c.txt

├── oldboy02

│?? ├── a.txt

│?? ├── b.txt

│?? └── c.txt

└── oldboy03

    ├── a.txt

    ├── b.txt

    └── c.txt

 

 

需求:

01. 排除oldboy01目录不要传输备份,排除oldboy03目录中a.txt文件不要传输备份

实现需求:--exclude=PATTERN

 [root@nfs01 ~]# rsync -avz /oldboy_dir/ --exclude=oldboy01 --exclude=oldboy03/a.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

sending incremental file list

./

oldboy02/

oldboy02/a.txt

oldboy02/b.txt

oldboy02/c.txt

oldboy03/

oldboy03/b.txt

oldboy03/c.txt

 

sent 381 bytes  received 134 bytes  1,030.00 bytes/sec

total size is 0  speedup is 0.00

总结:排除的路径信息,需要编写为指定目录的相对路径

 

常见错误:

    1. 排除参数后面数据信息,不能写绝对路径

    2. 排除参数后面数据信息,不能写相对路径

  

02. 排除的数据量比较大,有多个目录,多个文件都要排除

vim exlude.txt

oldboy01

oldboy03/a.txt

把多个目录,多个文件名写入一个文件里,排除要加上文件的绝对路径

  [root@nfs01 oldboy_dir]# rsync -avz /oldboy_dir/ --exclude-from=/oldboy_dir/exclude.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

sending incremental file list

./

exclude.txt

oldboy02/

oldboy02/a.txt

oldboy02/b.txt

oldboy02/c.txt

oldboy03/

oldboy03/b.txt

oldboy03/c.txt

sent 482 bytes  received 157 bytes  1,278.00 bytes/sec

total size is 24  speedup is 0.04

  

3.守护进程来创建备份目录(全网备份项目)

  [root@nfs01 oldboy_dir]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/oldboy/ --password-file=/etc/rsync.password

sending incremental file list

created directory oldboy

hosts

 

sent 146 bytes  received 72 bytes  436.00 bytes/sec

total size is 158  speedup is 0.72

[root@nfs01 oldboy_dir]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/oldboy/oldboy01/oldboy02/oldboy03/ --password-file=/etc/rsync.password

sending incremental file list

rsync: mkdir "oldboy/oldboy01/oldboy02/oldboy03" (in backup) failed: No such file or directory (2)

rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]

问题:不能创建多级目录

   

    nfs      数据备份 backup/172.16.1.31/

    web     数据备份 backup/172.16.1.7/

    db      数据备份 backup/172.16.1.51/

  

4.守护进程的访问控制配置

hosts allow = 172.16.1.0/24        (白名单)

hosts deny = 172.17.1.0/24        (黑名单)

 

建议:尽量只使用一种名单

   

补充:rsyncd.conf文件中全局配置和局部配置

    全局配置:模块以上的配置信息 影响全部模块

    局部配置:模块以下的配置信息 只影响当前模块 

 

总结:局部配置优先于全局配置

图表 2‑7 白名单与黑名单的配置说明

5.守护进程无差异同步配置

目录之间实现无差异同步  --delete

mkdir /mull

rsync -avz /null/ --delete rsync_backup@172.16.1.41::backup

 

PS: 可以快速清空目录中的数据

 

文件之间实现无差异同步(没什么用)

rsync -avz /oldboy/hosts01 --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

  

6.守护进程的列表功能配置

list = true   (配置文件/etc/rsyncd.conf中)

 

在客户端,显示服务端的所有模块信息

 

1.4.6 rsync备份服务优缺点

优势:

   1)可以实现增量备份

   2)具有守护进程模式(服务端)

       认证管理控制

       实现白名单黑名单安全访问控制

       密码文件信息,可以实现免交互传输数据

       网络连接数量进行限制

   3)实现数据的加密传输 -e 

 

缺点:

   1)比较擅长传输大文件,传输大量小文件,出问题 (打包)

   2)传输大文件,有可能会传输中断  --partial

 

1.4.7 Rsync服务常见问题:

   1. 防火墙阻止远程备份

   2. 命令语法格式不正确

   3. 认证信息不正确(用户名 密码)

   4. 客户端模块名称要写正确

   5. 备份目录权限设置不正确

   6. 备份目录需要提前创建好

   7. 备份目录管理用户必须存在

   8. 备份传输数据比较慢  (DNS反向解析 已知IP,解析出名称)

   9. 服务端服务必须启动

1. rsync服务端开启的iptables防火墙

  【客户端的错误】

   No route to host

  【错误演示过程】

  【异常问题解决】

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

   rsync: failed to connect to 172.16.1.41: No route to host (113)

   rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

   关闭rsync服务端的防火墙服务(iptables)

[root@backup mnt]# /etc/init.d/iptables stop

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Unloading modules:               [  OK  ]

[root@backup mnt]# /etc/init.d/iptables status

iptables: Firewall is not running.

 

2. rsync客户端执行rsync命令错误

  【客户端的错误】

The remote path must start with a module name not a /

  【错误演示过程】

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::/backup

ERROR: The remote path must start with a module name not a /

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

  【异常问题解决】

   rsync命令语法理解错误,::/backup是错误的语法,应该为::backup(rsync模块)

 

3. rsync服务认证用户失败

  【客户端的错误】

auth failed on module oldboy

  【错误演示过程】

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

Password:

@ERROR: auth failed on module backup

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

  【异常问题解决】

   1. 密码真的输入错误,用户名真的错误

   2. secrets file = /etc/rsync.password指定的密码文件和实际密码文件名称不一致

   3. /etc/rsync.password文件权限不是600

   4. rsync_backup:123456  密码配置文件后面注意不要有空格

   5. rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称

 

4. rsync服务位置模块错误

  【客户端的错误】

Unknown module 'backup'  

  【错误演示过程】 

   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

   @ERROR: Unknown module 'backup'

   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

  【异常问题解决】

   1. /etc/rsyncd.conf配置文件模块名称书写错误

  

5. rsync服务权限阻止问题

  【客户端的错误】

Permission denied

  【错误演示过程】

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

Password:

sending incremental file list

hosts

rsync: mkstemp ".hosts.5z3AOA" (in backup) failed: Permission denied (13)

sent 196 bytes  received 27 bytes  63.71 bytes/sec

total size is 349  speedup is 1.57

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]  

  【异常问题解决】

   1. 备份目录的属主和属组不正确,不是rsync

   2. 备份目录的权限不正确,不是755

  

6. rsync服务备份目录异常

  【客户端的错误】

chdir failed  

  【错误演示过程】  

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

Password:

@ERROR: chdir failed

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

  【异常问题解决】 

   1. 备份存储目录没有建立

   2. 建立的备份存储目录和配置文件定义不一致

   说明:如果没有备份存储目录

7. rsync服务无效用户信息

  【客户端的错误】

invalid uid rsync

  【错误演示过程】   

   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

   Password:

   @ERROR: invalid uid rsync

   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

  【异常问题解决】 

   rsync服务对应rsync虚拟用户不存在了

8. 客户端已经配置了密码文件,但免秘钥登录方式,依旧需要输入密码

  【客户端的错误】

password file must not be other-accessible

  【错误演示过程】

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

password file must not be other-accessible

continuing without password file

Password:

sending incremental file list

sent 26 bytes  received 8 bytes  5.23 bytes/sec

total size is 349  speedup is 10.26

  【异常问题解决】 

   rsync客户端的秘钥文件也必须是600权限

9. rsync客户端连接慢问题

  【错误日志信息】

   错误日志输出

   2017/03/08 20:14:43 [3422] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors

   2017/03/08 20:14:43 [3422] name lookup failed for 172.16.1.31: Name or service not known

   2017/03/08 20:14:43 [3422] connect from UNKNOWN (172.16.1.31)

   2017/03/08 20:14:43 [3422] rsync to backup/ from rsync_backup@unknown (172.16.1.31)

   2017/03/08 20:14:43 [3422] receiving file list

   2017/03/08 20:14:43 [3422] sent 76 bytes  received 83 bytes  total size 349

   正确日志输出

   2017/03/08 20:16:45 [3443] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors

   2017/03/08 20:16:45 [3443] connect from nfs02 (172.16.1.31)

   2017/03/08 20:16:45 [3443] rsync to backup/ from rsync_backup@nfs02 (172.16.1.31)

   2017/03/08 20:16:45 [3443] receiving file list

   2017/03/08 20:16:45 [3443] sent 76 bytes  received 83 bytes  total size 349

  【异常问题解决】

   查看日志进行分析,编写rsync服务端hosts解析文件

 

10.rsync服务没有正确启动

  【错误日志信息】

Connection refused (111)

  【错误演示过程】

[root@oldboy-muban ~]#  rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

rsync: failed to connect to 172.16.1.41: Connection refused (111)

rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

  【异常问题解决】

[root@oldboy-muban ~]# rsync --daemon

[root@oldboy-muban ~]# ss -lntup |grep rsync

[root@oldboy-muban ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup

Password:

sending incremental file list

hosts 

sent 196 bytes  received 27 bytes  49.56 bytes/sec

total size is 349  speedup is 1.57

 

 

11.同学异常问题:rsync服务端—nfs客户端

01. 备份服务用户身份映射问题(uid 用户名称)

第一种情况:

    备份服务器有oldboy用户  存储服务器有oldboy用户

    oldboy uid(备份) == oldboy uid (存储)

 

第二种情况:

    备份服务器有oldboy用户  存储服务器有oldboy用户

    oldboy uid(备份) <> oldboy uid (存储)

    传输的数据信息,属主和属组信息也是oldboy

 

第三种情况

备份服务器没有oldboy用户  存储服务器有oldboy用户

    oldgirl uid(备份)== oldboy uid (存储)

传输的数据信息,属主和属组信息为oldgirl

 

02. 服务配置文件被移动到其他路径,如何启动服务

服务配置文件被移动到/tmp/下

rsync --daemon --config=/tmp/rsyncd.conf

检查服务是否开启

ps -ef|grep rsync

netstat -lntup|grep 873

如果端口改变传输数据的时候加参数--port=改变后的端口号

 

 

 

1.4.8 补充:如何保证备份的数据属主和属组信息不变

方法一:增加模块

  不同用户向不同模块传输数据

 

方法二:修改配置文件uid信息

uid = root

    gid = root

    #fake super = yes

备份目录属主属组需要修改为 root权限

 

 

 

  

  

1.4.9 总结:rsync服务部署流程

Rsync服务部署流程:

服务端部署:

   第一个步骤:确认软件是否安装

   第二个步骤:编写服务配置文件

   第三个步骤:创建备份目录管理用户

   第四个步骤:创建认证密码文件,修改权限

   第五个步骤:创建备份目录,修改权限

   第六个步骤:启动rsync备份服务

  

客户端部署:

   第一个步骤:创建密码文件,修改权限(密码文件中只保存密码信息)

   第二个步骤:实现免交互传输数据测试

 

1.5 存储服务nfs

1.5.1 存储服务器概念介绍

NFS是Network File System的缩写,中文意思是网络共享文件系统,

它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录

   

企业环境:实现数据共享存储

1. FTP服务器(windows--server-U)  部署安装麻烦 / 权限设置

2. samba软件             部署安装麻烦 windows linux系统都支持

3. 分布式存储 Moosefs(mfs)、GlusterFS、FastDFS 

    

1.5.2 NFS存储服务器架构中作用

1. 实现数据共享同一存储,保证数据一致性

2. 降低公司架构服务器成本 

 

1.5.3 NFS服务安装部署

RPC: 远程过程调用程序(开发网络编程)

      中介服务

 

服务端部署:

第一个历程:软件安装部署

yum install -y nfs-utils rpcbind

 

第二个历程:编写配置文件

存储目录信息    主机地址或网段信息-进行安全访问控制(共享目录权限参数)

vim /etc/exports

/data    172.16.1.0/24(rw,sync)

 

第三个历程:创建存储目录,并进行授权???

mkdir /data

chown nfsnobody.nfsnobody /data

 

第四个历程:启动程序服务(按顺序)

systemctl start rpcbind

systemctl enable rpcbind

systemctl start nfs

systemctl enable nfs

图表 2‑8 nfs启动流程

 

 

第五个历程:进行检查验证

rpcinfo -p 172.16.1.31/10.0.0.31/localhost    --- 检查nfs服务信息是否注册

showmount -e 172.16.1.31/10.0.0.31/localhost  --- 检查是否有共享存储目录信息

  

客户端部署:

 

第一个历程:安装部署软件

yum install -y nfs-utils

 

第二个历程:实现挂载存储目录

mount -t nfs  172.16.1.31:/data  /data

[root@web01 /data]# df -h

Filesystem         Size  Used Avail Use% Mounted on

/dev/sda3           19G  1.9G   18G  10% /

devtmpfs           900M     0  900M   0% /dev

tmpfs              910M     0  910M   0% /dev/shm

tmpfs              910M  9.6M  901M   2% /run

tmpfs              910M     0  910M   0% /sys/fs/cgroup

/dev/sda1          197M  116M   82M  59% /boot

tmpfs              182M     0  182M   0% /run/user/0

172.16.1.31:/data   19G  1.9G   18G  10% /data

 

图表 2‑9 nfs服务工作原理

 

 

1.5.4 nfs存储服务存储原理

    服务端:3件事

    客户端:3件事

 

 

服务端注册进程信息:

[root@oldboy ~]# ps -ef|egrep "rpc|nfs"

rpc        1564      1  0 09:32 ?        00:00:00 rpcbind

rpc        1065      1  0 09:32 ?        00:00:00 rpc statd           <- 检查数据存储一致性

root       4736      2  0 21:31 ?        00:00:00 [rpciod/0]

root       5363      1  0 21:47 ?        00:00:00 rpc.rquotad  <- 磁盘配额进程(remote

quote server)

                     带宽 100M  限速 1个人10M  2个人10M

                         / -- 分区大小10G   /tmp 8G  oldboy(6G)  oldgirl(2G) root (2G)

root       5368      1  0 21:47 ?        00:00:00 rpc.mountd  <- 权限管理验证等(NFS

mount daemon)

root       5375      2  0 21:47 ?        00:00:00 [nfsd4]

root       5376      2  0 21:47 ?        00:00:00 [nfsd4_callbacks]

root       5377      2  0 21:47 ?        00:00:00 [nfsd]          <- NFS主进程

root       5378      2  0 21:47 ?        00:00:00 [nfsd]          <- NFS主进程

root       5379      2  0 21:47 ?        00:00:00 [nfsd]          <- NFS主进程,管理登入,

ID身份判别等。

root       5380      2  0 21:47 ?        00:00:00 [nfsd]

root       5381      2  0 21:47 ?        00:00:00 [nfsd]

root       5382      2  0 21:47 ?        00:00:00 [nfsd]

root       5383      2  0 21:47 ?        00:00:00 [nfsd]

root       5384      2  0 21:47 ?        00:00:00 [nfsd]          <- NFS主进程

root       5415      1  0 21:47 ?        00:00:00 rpc.idmapd   <- name mapping daemon

                                                            用户压缩/用户映射(记录)

 

 

1.5.5 nfs配置文件参数说明

rw       --- 设置共享目录权限为可读可写

 

ro       --- 设置共享目录权限为只读

            企业应用:开发人员想查看线上服务器数据,线下服务器权限

            线下环境  线上环境不一致

 

sync     --- 同步存储数据  数据传输到服务器--磁盘 保证数据安全性,存储服务器

 

async    --- 异步存储数据  数据传输到服务器--内存 保证数据传输效率

 

root_squash   --- root用户传输数据需要做映射转换  nfsnobody   OK

 

no_root_squash --- root用户传输数据不需要做映射转换 root    OK

 

all_squash     --- 普通用户传输数据需要做映射转换 nfsnobody   OK

 

no_all_squash  --- 普通用户传输数据不需要做映射转换 原来是什么用户,存储好的数据就是什么用户管理  OK

图表 2‑10 nfs服务端配置与客户端用户映射原理

 

 

企业中:如何进行配置

1. root是否应该做映射

   no_root_squash:存储数据可以被客户端root用户随意改动

   root_squash:   原有的其他用户文件不能查看,可以编辑  (推荐)

2. 其他用户是否应该做映射:

   no_all_squash: 目录属主修改好,有效提高存储目录安全  (推荐)

   all_squash:    安全性较低

 

1.5.6 企业存储服务器部署方案:

服务端

第一个历程:软件安装部署

yum install -y nfs-utils rpcbind

 

第二个历程:编写配置文件

存储目录信息    主机地址或网段信息-进行安全访问控制(共享目录权限参数)

vim /etc/exports

/data    172.16.1.0/24(rw,sync, root_squash, no_all_squash)

 

第三个历程:创建存储目录,并进行授权???

mkdir /data

chown -R www. /data

 

第四个历程:启动程序服务

systemctl start rpcbind

systemctl enable rpcbind

systemctl start nfs

systemctl enable nfs

 

第五个历程:进行检查验证

rpcinfo -p 172.16.1.31/10.0.0.31/localhost   --- 检查nfs服务信息是否注册

showmount -e 172.16.1.31/10.0.0.31/localhost  --- 检查是否有共享存储目录信息

 

客户端:

第一个历程:安装部署软件

yum install -y nfs-utils

 

第二个历程:进行挂载

mount -t nfs 172.16.1.31:/data /mnt

 

设置推荐映射参数后数据在服务器中的变化

 

1.5.7 存储服务重要文件/命令总结

/etc/exports        存储服务端配置文件

/usr/sbin/exportfs    负责平滑重启nfs服务(命令)

 

实践操作:

[root@nfs01 r]# exportfs -rv

exporting 172.16.1.0/24:/data/w

exporting 172.16.2.0/24:/data/r         可以临时配置共享存储目录信息

exportfs -o rw,sync 172.16.1.0/24:/data

/usr/sbin/showmount                  检查可用存储共享目录信息(命令)

/var/lib/nfs/etab                      nfs服务端默认配置信息记录文件(日志文件)

/proc/mounts                         显示客户端挂载信息文件(默认挂载参数)

 

存储服务端配置文件:/etc/exports

/共享目录    白名单地址或网段信息(权限参数)

rw ro sync async

xxx_squash

rw,sync,root_squash,no_all_squash  www用户存储数据,root用户无法存储

 

1.5.8 客户端挂载参数说明:

客户端如何实现自动挂载:

 

方法一:/etc/fstab

编写fstab文件

vim /etc/fstab

172.16.1.31:/data/w       /data/w       nfs     defaults        0 0

 

remote-fs.target  必须启动,才能加载fstab文件内容

 

centos6: 系统启动流程 --- 串行启动

1. /etc/fstab   网络配置

2. network

3. netfs服务

服务启动之后,重新加载fstab文件

 

centos7: 系统启动流程 --- 并行启动

1. /etc/fstab

2. network 

3. 系统启动完毕:remote-fs.target重新加载fstab

 

方法二:/etc/rc.local --- 文件权限是可执行权限

 

客户端指定挂载权限参数信息:

mount -o xx xx

客户端(开机自动挂载) --- 开机尝试挂载 --- nfs服务端

 

参数

fg/bg:

fg:程序在前台运行  mount -t nfs -o  xxx

bg:程序在后台运行  mount -t nfs -o  bg

 

soft: 出现nfs服务端停止,只尝试挂载一段时间,一段时间过后停止挂载(腼腆的男孩)

 

hard: 出现nfs服务端停止,一直尝试挂载,根本停不下来(臭不要脸男孩)

 

rw/ro: 指定挂载点目录权限

 

suid/nosuid:特殊权限 setuid=suid      安全性    s权限

权限位:像文件所有者执行操作动作一样

suid:  挂载点目录中suid功能是可以起作用

nosuid:挂载点目录文件suid权限是没用的

 

exec/noexec:存储目录中的文件是否可以直接执行

exec:可以让存储目录可执行文件直接运行 安全性

 

auto/noauto:fstab文件进行指定挂载参数       使用mount -a命令加载

 

mount -a  快速加载fstab文件中配置信息

 

remount: 重新挂载

172.16.1.31:/data/w       /data/w       nfs     auto        0 0

mount -a

 

企业案例:文件系统异常: 阵列 分区 格式化(创建文件系统 ext3 ext4 xfs) 挂载

 

什么是文件系统:数据进行存储方式(机制) fat32(单个文件不能大于4G)  ntfs(不管数据多大都可以直接存储)

 

系统全部数据出现只读情况

解决方法:

mount -o remount rw  /   

 

架构中耦合度:(架构师)

架构中一台服务器出现问题,影响其他服务器运行  -- 紧耦合

架构中一台服务器出现问题,不会影响其它服务   -- 松耦合(分布式存储)

  

1.5.9 NFS服务程序常见的问题总结:

1)服务权限不正确:

   原因1:配置文件中权限参数书写不正确

   原因2:目录本身权限不正确   755  nfsnobody

   原因3:目录的权限具有继承关系     可能有冲突

          PS:尽量存储服务配置文件中不要出现父子关系

   原因4:客户端挂载参数权限指定不正确

 

2)错误信息:‘/data/w’: Stale file handle(过期文件句柄)

   文件句柄错误:存储服务端有共享目录取消了,客户端并没进行卸载

   什么是卸载完整:cat /proc/mounts文件没有相关挂载信息了

   解决:将所有挂载信息,进行卸载重新挂载

 

3)存储服务无法进行启动:

   当服务没有启动的时候,无法使用reload进行启动

 

4)clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)  (端口映射器故障/不能支取/没有到主机的路由)

   原因:防火墙服务没有关闭 客户端 --- 访问 --- 服务端 111

 

5)RPC: Program not registered(程序没有注册)

   原因:rpcbind服务和nfs服务启动顺序不正确,nfs服务没有启动

   解决:两个服务全关闭,再按照顺序启动

  

6)无法卸载挂载目录:/data/w: device is busy(分区忙碌)

   第一种方式:离开挂载目录进行卸载

   第二种方式:强制卸载

umount -lf  + 挂载点目录

-l           lazy(懒惰)

-f           force(强制)

 

7)nfs实现restart重启==放大招(大招冷却时间cd)

在系统配置中/etc/sysconfig/nfs中指定了无敌时间的配置参数

NFSD_V4_GRACE=90

NFSD_V4_LEASE=90

NLM_GRACE_PERI0D=90

 

补充:运维异常问题三种大招     被人攻击了  负载过高

   1. 服务重启

   2. 操作系统重启

   3. 服务或系统重装

 

1.5.10 NFS如何解决单点问题

1. 可以使用分布式存储

    2. 可以使用keeaplived  脚本

    3. 可以使用弃用nfs方案 (实时同步)

 

 

1.5.11 总结:nfs服务部署流程

NFS服务部署流程:

服务端部署:

1. 安装存储服务软件  nfs-utils rpcbind

2. 编写服务配置文件  /etc/exports

3. 创建存储共享目录 (进行授权 nfsnobody)

4. 启动程序服务      rpcbind nfs

5. 检查确认          rpcinfo -p / showmount -e

 

客户端部署:

1. 安装存储服务软件  nfs-utils(无法识别nfs文件系统)

2. 实现存储目录挂载  mount -t nfs xx.xx.xx.xx:/data  /mnt

 

实现永久挂载:

方法一:/etc/fstab ---小问题???

方法二:/etc/rc.local

方法三:编写定时任务!!!

 

 

1.5.12 测试练习:

如何修改配置文件,让root用户依然可以在存储目录中创建数据

解决问题:

第一个历程:检查共享目录属主用户的uid信息

[root@nfs01 data]# id www

uid=1003(www) gid=1003(www) groups=1003(www)

 

第二个历程:完善修改存储配置文件

vim /etc/exports

/data 172.16.1.0/24(rw,sync,anonuid=1003,anongid=1003)

 

第三个历程:重启nfs服务

systemctl reload nfs  

补充:

   reload:   平滑重启  优先断开空闲链路,不会断开有数据传输的链路

   restart:   强制重启  将所有链路强制断开

 

服务端要求

/data/r   可读   进行数据同步方式存储,将所有用户都做映射(nfsnobody)

/data/w  可读可写 进行数据同步方式存储,将所有用户都做映射(nfsnobody)

 

客户端要求:

web01     /data/r   存储共享目录/data/r   挂载点目录只有读的权限

backup    /data/w   存储共享目录/data/w   挂载点目录只可读可写

 

解决问题:

服务端:

第一个历程:编写配置文件

/data/r  172.16.1.0/24(ro,sync,all_squash)

/data/w  172.16.1.0/24(rw,sync,all_squash)

 

第二个历程:创建存储目录,并进行授权

mkdir /data/{r,w}

chown -R nfsnobody.nfsnobody /data

 

第三个历程:重启nfs服务

systemctl reload nfs

 

客户端:

第一个历程:创建挂载点目录

web01:

mkdir -p /data/r 

backup:

mkdir -p /data/w

 

第二个历程:进行挂载操作

web01:

mount -t nfs 172.16.1.31:/data/r /data/r

backup:

mount -t nfs 172.16.1.31:/data/w /data/w

1.6 全网备份项目

代码上线(重复)       --自动化代码上线 (git jenkins 脚本)

web服务器(重复)    --自动化部署服务 (ansible)

外包公司              --docker    

 

1.6.1 项目流程:全网备份

第一步:项目需求/项目规划:

项目文档: 项目背景  项目需求规划(硬件 人员ELK日志分析(开发人员) 日程规划1个月 )    

1)所有服务器的备份目录必须都为/backup。 ok

 

2)要备份的系统配置文件包括但不限于:    ok

    a.定时任务服务的配置文件(/var/spool/cron/root)(适合web和nfs 服务器)。

    b.开机自启动的配置文件(/etc/rc.local)(适合 web 和 nfs 服务器)。

    c.日常脚本的目录 (/server/scripts)。

    d.防火墙 iptables 的配置文件(/etc/sysconfig/iptables)。

    e. 自己思考下还有什么需要备份呢?

 

3)Web 服务器站点目录假定为(/var/html/www)。 ok

 

4)Web 服务器 A 访问日志路径假定为(/app/logs) ok

 

5)Web 服务器保留打包后的 7 天的备份数据即可(本地留存不能多于 7 天,因为太多硬盘会满) ok

   

 

6)备份服务器上, , 保留 每周一的所有数据副本,其它 要保留 6个月的数据副本。  OK

 

7)备份服务器上要按照备份数据服务器的内网 IP 为目录保存备份,备份的文件按照时间名字保存。 ok

 

8)需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结

      果信息发给系统管理员邮箱中

      验证数据完整性

      发送邮件信息

 

第二步:每个需求具体如何完成:

备份服务客户端完成什么操作:(nfs01 web01)

01. 创建备份目录

mkdir -p /backup

 

02. 进行压缩打包备份:

cd /

tar zchf /backup/system_backup_$(date +%F).tar.gz  ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables

 

03. 备份站点和日志目录:(web01)

cd /

tar zcvf /backup/web_backup_$(date +%F).tar.gz ./var/html/www/

tar zcvf /backup/web_logs_$(date +%F).tar.gz ./app/logs

 

04. 控制客户端备份数据存储量

find /backup  -type f  -name "*.tar.gz" -mtime +7|xargs rm

find /backup/10.0.0.31  -type f  -name "*.tar.gz" -mtime +7|xargs rm

 

05. 进行数据备份

方法一:

rsync -avz /backup/  rsync_backup@172.16.1.41::backup/10.0.0.31/ --password-file=/etc/rsync.password

方法二:

mkdir /backup/10.0.0.31/ -p

rsync -avz /backup/10.0.0.31  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

  

1.6.2 实际工作中:find命令排除指定目录不被搜索

 

===============================================================

find命令排除指定目录不被搜索

方法一:

[root@nfs01 backup]# find /backup -type f -name "*.tar.gz" -print -o -path "/backup/oldboy01" -prune

/backup/system_backup.tar.gz

/backup/system_backup_2019-06-18.tar.gz

方法二:

[root@nfs01 backup]# find /backup -type f -name "*.tar.gz" ! -path "/backup/oldboy01*"

/backup/system_backup.tar.gz

/backup/system_backup_2019-06-18.tar.gz

[root@nfs01 backup]# find /backup -type f -name "*.tar.gz" -not -path "/backup/oldboy01*"

/backup/system_backup.tar.gz

/backup/system_backup_2019-06-18.tar.gz

===============================================================

  

  

1.6.3 备份服务端完成什么操作:(backup)

01. 创建备份目录

mkdir -p /backup

 

02. 服务端rsync守护进程部署

忽略

 

03. 保存指定数据信息,其余数据进行删除

方法一:根据星期信息区分数据  

date +%F_%A

date +%F_星期%w

find /backup -type f -name "*.tar.gz" -mtime +180 ! -name "*_星期1.tar.gz"

方法二:星期一, 将所有数据单独保存

find /backup -type f -name "*.tar.gz"|xargs mv -t /XXX

find /backup -type f -name "*.tar.gz" -mtime +180

 

04. 验证数据完整性 --- md5

客户端操作:

md5sum /backup/10.0.0.31/system_backup_2019-06-18_Tuesday.tar.gz >/backup/10.0.0.31/finger.txt

服务端操作:

md5sum -c 10.0.0.31/finger.txt

 

05. 如何发送邮件信息

foxmail outlook

 

系统 + 企业邮箱(建立关系)

 

系统发送邮件  ---> 企业邮箱163 ---> 运维人员邮箱

第一个历程:拥有企业邮箱 163

设置企业邮箱 163 (2个操作)

 

第二个历程:实现linux系统和企业邮箱建立关系

 

vim /etc/mail.rc

set from=douglas123456@163.com smtp=smtp.163.com

set smtp-auth-user=douglas123456@163.com smtp-auth-password=mengwei702717952 smtp-auth=login

set from=邮箱地址@163.com smtp=smtp.163.com     <- 邮件发送邮件服务器域名,此处为163邮箱的发送服务器域名

set smtp-auth-user=邮箱账号 smtp-auth-password=登录邮箱密码(授权码) smtp-auth=login

 

 

第三个历程:启动邮件服务

systemctl restart postfix.service

 

第四个历程:发送邮件测试

echo "oldboy61 test mail"|mail -s "mail test"  330882721@qq.com

mail -s "mail test" 330882721@qq.com </etc/hosts

  

1.6.4 实现定时任务备份数据

脚本 + 定时任务(00:00)

如何编写脚本:

1. 通用性---幂等性

2. 修改脚本如何简单化

堆命令 --- 逻辑简化

 

客户端脚本:nfs01  web01

[root@nfs01 scripts]# cat backup_nfs01.sh

#!/bin/bash

Ip_Info="$(hostname -i)"

Dir_Info="/backup/"

   

# 第一步:创建备份目录

mkdir -p $Dir_Info$Ip_Info

   

# 第二步:进行数据压缩备份

cd /

tar zchf $Dir_Info$Ip_Info/system_backup_$(date +%F_星期%w -d "-1 day").tar.gz  ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables

#tar zchf $Dir_Info$Ip_Info/web_backup_$(date +%F_星期%w).tar.gz ./var/html/www/

#tar zchf $Dir_Info$Ip_Info/web_logs_$(date +%F_星期%w).tar.gz ./app/logs

      

# 第三步:删除7天以前的数据

find $Dir_Info$Ip_Info  -type f -name "*.tar.gz" -mtime +7|xargs rm &>/dev/null

   

# 第四步:生成指纹文件

find $Dir_Info$Ip_Info -type f -name "*$(date +%F_星期%w -d "-1 day").tar.gz"|xargs md5sum >$Dir_Info$Ip_Info/finger.txt

   

# 第五步:传输文件

rsync -az $Dir_Info$Ip_Info rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

  

服务端脚本:rsync

vim /server/scripts/server_backup.sh

#!/bin/bash

   

# 第一个历程:验证数据完整性

方法一:

find /backup -type f -name "finger.txt"|xargs md5sum -c &>/tmp/check_data.log

方法二:了解

for ip in {31,7}

do

   find /backup/172.16.1.$ip  -type f -name "finger.txt"|xargs md5sum -c

done 

        

# 第二个历程:删除180天前数据,并且保留周一

find /backup -type f -name "*.tar.gz" -mtime +180 ! -name "*_星期1.tar.gz"|xargs rm &>/dev/null

     

# 第三个历程:发送通知邮件

grep -i "fail"  /tmp/check_data.log >/tmp/check_error.log

grep -i "ok"  /tmp/check_data.log >/tmp/check_ok.log

mail -s "check_data_info $(date +%F)" 330882721@qq.com </tmp/check_data.log

 

# 判断当天数据是否存在:???

    find ???

  

1.6.5 编写定时任务 date  

客户端操作:

crontab -e

# xxxxxx

0 0 * * * /bin/bash /server/scripts/backup_nfs01.sh &>/dev/null

 

服务端操作:

crontab -e

# xxxxxx

0 6 * * * /bin/bash server/scripts/server_backup &>/dev/null  

 

1.6.6 项目总结:

01. 测试验证  (项目文档  验收文档) 述职

 

02. 脚本完善

客户端如果数据没有传输过来,如何进行发现

发送信息    邮件发送    --163.com  爬虫 -- 博客园(运维)

                      微信发送  zabbix

            短信发送  zabbix

                      电话      zabbix

 

03. 总结项目文档

   

 

1.7 远程连接(SSH服务)

1.7.1 远程连接服务概念介绍

SSH:系统默认配置             22       默认可以使用root用户进行登录       数据信息进行加密

 

TELNET:网络设备默认开启  23       默认只能使用普通用户进行登录       数据信息显示明文

  

1.7.2 远程连接服务连接原理

openssh   远程连接数据包进行加密处理

openssl   网站访问请求信息和响应信息进行加密(HTTPS

 

原理总结:

1. 客户端 - 服务端     请求建立ssh远程连接--之后:不用反复确认公钥信息

2. 服务端 - 客户端     请求确认公钥信息

3. 客户端 - 服务端     确认接收公钥信息,保存到~/.ssh/know_hosts文件中

4. 服务端 - 客户端     询问用户密码信息

5. 客户端 - 服务端     用户密码信息

6. 服务端 - 客户端     确认密码信息正确 远程连接建立--之后:所有传输的数据信息会进行加密处理

 

总结:

   作用1:利用公钥和私钥对数据信息进行加密处理

   作用2:对用户身份信息进行认证

 

1.7.3 远程服务相关命令

a) ssh

ssh [参数] [user@]主机信息

          参数:-p  指定端口信息

            -o  指定特殊参数功能

          [user@]:  以什么用户身份远程连接到主机上(默认当前用户)

          主机信息:IP地址 或者 主机名称(本地hosts文件需要解析)

 

b) scp  远程传输数据(全量)

推:scp [参数]  src  [user@]主机信息:/dest

拉: scp [参数]  [user@]主机信息:/src  /dest    

参数:-r   递归复制数据信息(目录)

             -p   保持文件数据属性信息不变

 

c) sftp 远程文件数据传输

    sftp [参数]  [user@]主机信息

          参数:-P port

 

如何下载数据:

cd /backup        --- 切换到远程ftp服务端指定目录

get oldboy61.txt  --- 默认下载数据,会下载到进入ftp模式之前的目录中

mget xx xx         --- 批量下载多个文件

    lcd /oldboy             --- 所有命令前面加上l 表示操作本地主机数据信息

   

如何上传数据:

put oldboy.txt

    mput              --- 批量上传多个文件

 

1.7.4 远程连接通讯建立

01.远程连接通讯建立方式

基于口令方式(基于密码方式)  文档/脑子   国家服务器  远程 -- 密码(钱)

基于密钥方式 

02.基于密钥方式实现远程连接步骤:

1.管理端服务器

第一个历程:创建密钥对信息

[root@web01 ~]# ssh-keygen -t dsa

Generating public/private dsa key pair.

Enter file in which to save the key (/root/.ssh/id_dsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_dsa.

Your public key has been saved in /root/.ssh/id_dsa.pub.

The key fingerprint is:

SHA256:v4ECG80UO1dv2WHn3jDkOrT/8luPwDks6NnGh4L8il8 root@web01

The key's randomart image is:

+---[DSA 1024]----+

|      .   .   + .|

|       o . . * + |

|      + .   = = .|

|     + o   o o +.|

|    o o S   +   o|

|     +   + o +   |

|    ....E.+.* . .|

|     .o+.o++.o.oo|

|    ..oo+oo.  .+=|

+----[SHA256]-----+

[root@web01 ~]# ll ~/.ssh/id*

-rw------- 1 root root 668 Jun 19 00:00 /root/.ssh/id_dsa

-rw-r--r-- 1 root root 600 Jun 19 00:00 /root/.ssh/id_dsa.pub

  

第二个历程:分发公钥

  [root@web01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31

root@172.16.1.31's password:

 

第三个历程:检查确认

[root@web01 .ssh]# ssh 172.16.1.31

Last login: Tue Jun 18 23:37:04 2019 from 10.0.0.1

[root@nfs01 ~]# exit

logout

Connection to 172.16.1.31 closed.

[root@web01 .ssh]# ssh 172.16.1.31 hostname

nfs01

 

2.被管理端服务器

   第一个历程:检查确认

[root@nfs01 ssh]# cd /root/.ssh/

[root@nfs01 .ssh]# ll

-rw------- 1 root root 600 Jun 19 00:04 authorized_keys

-rw-r--r-- 1 root root 346 Jun 18 02:31 known_hosts

[root@nfs01 .ssh]# cat authorized_keys

ssh-dss AAAAB3NzaC1kc3MAAACBALkIMlfU30rSp6A9F0+LMg5cPRbDoPlCTm82FuOVXMKieeqniuOMgRSsRlUIwuEIe1e3fwTGmwoKdYGa4RaV8S3ZFm+dc1rEFOIOgC2GLRjLRf14Hmp9ZMOQVpE6AWycs2ziImhxYznawjMm4YgYUGpkeobhM++6ri3MRd+J6wpXAAAAFQD3mmoOxftbuAShzVMzeD/y4T36SQAAAIBfgM8KWsy2+sJRsqKeGmjiXr7OXLTtPaeWjEhJc/Q06HyWuV/K0Phr+c8KHGL1ClgPr0/uUpmoelVy9/ng53olqNy2Vyb6QMyIfenBj6OlQ96WBKNOregKCMgbpOquYgXhCVWMELv7b8PTOV6Rrx1vD0hQI/V9hFTLIYxE95eoqwAAAIA4gYv/P2yJKa156sTPyk+F/e7oMgM5rcpGuLSRk4DV779GE7NFU33A9Xia6EbxDL1fzfkRq3YP83lpmrFYbg8UkEwZpLIPlmshIrvQsuVFnV9nt8JE+uQR75KhT0jTGZZv2mZ+g7NIWDEa1QFsbo+9Nauj8yADiLzXmXrDXCC2nw== root@web01

 

3.被管理主机有多台,如何进行批量分发公钥???
1.解决免交互问题:

01. 第一次连接有yes/no

  ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.7 -o StrictHostKeyChecking=no

  

02. 需要有密码信息确认

  yum install -y sshpass

  sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.7 -o StrictHostKeyChecking=no

 

ssh-copy-id分发公钥原理:

    01. 进行ssh远程连接

    02. scp将公钥进行传输

    03. 被管理端将公钥保存到用户家目录中的.ssh目录中

    04. 修改公钥文件名称和权限  authorized_keys  600

 

2.编写免交互分发脚本:

分发脚本:

  vim /server/scripts/fenfa_key.sh

#!/bin/bash

for ip in {7,31,41}

do

  echo "=====start fenfa_Key to 172.16.1.$ip====="

  sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/null

  if [ $? -eq 0 ]

  then

  echo "=====pub_key fenfa ok with 172.16.1.$ip======="

     echo ""

  else

  echo "=====pub_key fenfa failed with 172.16.1.$ip======"

  echo ""

  fi

done

  

检查脚本:

[root@m01 scripts]# vim fenfa_check.sh

#!/bin/bash

if [ $# -ne 1 ]

then

  echo "Usage: $0 请在脚本后面输入一个命令信息"

  exit 100

fi

for ip in {7,31,41}

do

  echo "======start fenfa_Key to 172.16.1.$ip======"

  ssh 172.16.1.$ip $1

done

 

if判断比较信息:

    =    -eq      equal

    >    -gt       greater than

    <    -lt        less than

    >=   -ge      greater equal

    <=   -le       less equal

    <>   -ne      no equal

  

分发公钥问题说明:

    01. 密码信息不正确

    02. 免密码分发公钥 

    03. 分发公钥信息,需要分发你有的公钥   是否有公钥

m01--/root/.ssh/id_xsa.pub

  

免交互分发公钥脚本排错方法:

01. 测试脚本 

ssh 172.16.1.7 hostname

 

02. 脚本中命令手动执行

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.$ip -o StrictHostKeyChecking=no

  

 

03. 远程服务端口号发生变化了,如何修改脚本命令

脚本免交互编写

 

centos7:掌握

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.7 -o StrictHostKeyChecking=no -p 52113

 

centos6:分发公钥

  sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "10.0.0.7 -o StrictHostKeyChecking=no -p 52113"

    Warning: Permanently added '[10.0.0.7]:52113' (RSA) to the list of known hosts.

    Now try logging into the machine, with "ssh '10.0.0.7 -o StrictHostKeyChecking=no -p 52113'", and check in:

   

      .ssh/authorized_keys

   

    to make sure we haven't added extra keys that you weren't expecting.

 

测试分发是否成功:

 [root@localhost ~]# ssh -p52113 10.0.0.7 hostname

 web01

  

shift ---> 排队

    餐饮店:1 2 3 4 5 6 7

    员工:2 3 4 5 6 7

    员工:3 4 5 6 7

   

shell脚本循环:

    for   循环:循环是有条件,循环会终止

    while 循环:死循环  条件为真的时候

    until 循环:死循环  条件为假的时候

 

需求:

01. 远程连接到指定主机

02. 切换到家目录,临时修改umask数值

03. 判断是否存在.ssh目录,不存在创建.ssh

04. 生成.ssh/authorized_keys,并且把公钥信息保存在此文件中

命令:

    ssh $1 "exec sh -c 'cd; umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)'"

 

总结:掌握批量分发公钥脚本编写能力

    01. 解决免交互问题: yes/no  密码问题

    02. 远程被管理主机端口变化:解决端口问题

 

1.7.5 SSH服务端配置文件说明:

vim /etc/ssh/sshd_config

#Port 22                  --- 指定服务端口号信息

#ListenAddress 0.0.0.0      --- 指定相应网卡可以接收远程访问请求  web

                         默认:主机上所有网卡都可以接收远程连接请求

                         监听地址信息,一定是本地网卡上有的地址信息 ******

#PermitEmptyPasswords no  --- 是否允许空密码登录

#PermitRootLogin yes       --- 不允许root用户登录

115 #UseDNS yes --- 是否进行DNS反向解析 no  172.16.1.31 --> 172.16.1.61

79 GSSAPIAuthentication yes --- 是否开启GSSAPI  no     

 

1.7.6 SSH防范远程入侵方案  亡羊补牢 -- 未雨绸缪

https://blog.51cto.com/phenixikki/1546669

SSH防范远程入侵方案:

1. 用密钥登录,不用密码登陆

2. 防火墙封闭SSH,指定源IP限制(局域网、信任公网)  ???

3. 尽量不给服务器外网IP

4. 负载均衡主机,只监听内网地址的远程访问

5. 最小化(软件安装-授权)  web nfs rsync mysql zabbix ... 端口(门)

yum install -y nmap                --- 扫描网站端口信息

nmap -p 1-65535 www.baidu.com   80 443

6. 给系统的重要文件或命令做一个指纹  

md5sum -c /etc/passwd  abcd          - zabbix

7. chattr +i 锁住文件 

 

如何实现多台主机之间相互基于密钥通讯  --- hadoop大数据分析工具

 

  

1.7.7 免输ip登录服务器:(用户/IP/端口)起别名

编写配置文件:

   cd ~/.ssh/

   vim config

      host “imooc”

           HostName  ip

           User  root

           Port  22

连接ip服务器:

ssh imooc

 

 

1.8 批量管理服务

1.8.1 ansible批量管理服务概述

ansible批量功能:          -- 并行

    01. 可以实现批量系统操作配置

02. 可以实现批量软件服务部署

03. 可以实现批量文件数据分发

04. 可以实现批量系统信息收集

 

ansible批量管理服务意义:  

    01. 提高工作的效率(部署综合架构) 

    02. 提高工作准确度

    03. 减少维护的成本

    04. 减少重复性工作

 

ansible软件功能组成模块:

1)主机清单功能模块: OK

    2)剧本功能模块

    3)核心或自定义模块:

    4)插件功能(python)

 

主机清单是什么 如何配置:

vim /etc/ansible/hosts   --- 指定可以管理哪些主机

172.16.1.41

172.16.1.31

172.16.1.7

 

语法格式:

ansible  管理主机信息  -m  ping

[root@m01 ansible]# ansible all -m ping

172.16.1.31 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

172.16.1.7 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

172.16.1.41 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

 

ansible软件学习方法

01. 官方资料:docs.ansible.com

02. 通过帮助命令:

ansible-doc -l      --- 查看模块的作用说明

ansible-doc -s yum  --- 查看指定模块参数说明

ansible-doc yum     --- 显示模块详细说明

   

ansible输出信息有颜色显示:

    绿色: 操作执行成功,没有对远程主机做任何改动

    黄色: 操作执行成功,对远程主机数据信息有改动

    红色: 操作执行失败

    粉色: 操作警告信息(忠告)

    蓝色: 显示命令操作执行的过程

 

 

测试ansible连接失败,排错思路:

    01. 利用SSH远程连接测试   (重新分发公钥)

    02. SSH测试成功,ansible测试失败

        在被管理主机上,杀死ssh特殊进程

          sshd: root@notty

 

 

1.8.2 ansible软件安装部署  

saltstack自动化批量管理软件 (复杂(安装 配置 应用))  软件服务比较重

ansible特点:

1. 没有配置文件(不需要配置)

    2. 不需要启动服务

    3. 客户端没有需要部署任务

 

管理服务器:

安装ansible软件-- epel依赖

yum install -y ansible  

 

 

1.8.3 ansible软件配置及模块实践 *****

 

01.主机清单如何进行配置:

https://docs.ansible.com/

第一种配置方法:指定主机组配置

[oldboy]

172.16.1.41

172.16.1.31

[oldgirl]

172.16.1.7

 

[root@m01 ansible]# ansible oldboy -m ping

172.16.1.31 | SUCCESS => {

   "ansible_facts": {

       "discovered_interpreter_python": "/usr/bin/python"

   },

 

   "changed": false,

    "ping": "pong"

}

172.16.1.41 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "ping": "pong"

}

 

第二种配置方法:支持主机名符号匹配配置

[oldboy]

172.16.1.[1:50]

web[01:03]

 

第三种配置方法:支持内置变量信息配置

[oldboy]

172.16.1.7  ansible_ssh_user=root ansible_ssh_pass=123456 ansible_ssh_port=22

[oldboy]

172.16.1.7  ansible_user=root ansible_password=123456 ansible_port=22

 

第四种配置方法:支持特殊变量信息配置 (剧本)

[oldboy]

172.16.1.7

[oldboy:vars]             定义变量信息

ansible_user=root

ansible_password=123456

ansible_port=22

 

第五种配置方法:嵌入式配置方法

[backup:children]          父子模块

backupclient

backupserver

[backupclient]

172.16.1.7  ansible_user=root ansible_password=123456

172.16.1.31

[backupserver]

172.16.1.41

官方资料参考:

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

 

02.ansible模块使用方法

模块作用:完成不同的批量管理功能 -m ping(测试)

 

显示ansible所有模块数量:

 [root@m01 ansible]# ansible-doc -l|wc -l

2834

 

需要掌握10几个模块

   

ansible命令语法:

ansible 主机信息(IP/主机组/all)-m (模块名) command -a "操作动作"                                                                      

 01      02                  03         04       05     06 

03.Commands modules    命令模块

1.command

第一个模块:命令模块 - command(默认)

作用:在目标主机执行命令:

 

参数:

    chdir:    在执行命令前,先切换目录信息

    creates:  判断一个文件是否存在,如果存在,后面命令被跳过(不执行)

    removes:  判断一个文件是否存在,如果存在,后面命令就执行

    free_form:在使用command模块时候必须输入一个合法的linux命令

  

基本用法:

[root@m01 ansible]# ansible backup -m command -a "hostname"

172.16.1.31 | CHANGED | rc=0 >>

nfs01

 

172.16.1.41 | CHANGED | rc=0 >>

backup

 

172.16.1.7 | CHANGED | rc=0 >>

web01

特殊用法:

chdir 参数:

[root@m01 ansible]# ansible backup -m command -a "chdir=/tmp pwd"  先切换目录再执行命令

172.16.1.31 | CHANGED | rc=0 >>

/tmp

172.16.1.7 | CHANGED | rc=0 >>

/tmp

172.16.1.41 | CHANGED | rc=0 >>

/tmp

 

creates 参数:

[root@m01 tmp]# ansible backup -m command -a "creates=/etc/oldboy.txt touch /opt/oldboy.txt"            如果存在,则不执行后面的命令

172.16.1.41 | CHANGED | rc=0 >>

172.16.1.7 | SUCCESS | rc=0 >>

skipped, since /etc/oldboy.txt exists

172.16.1.31 | CHANGED | rc=0 >>

ansible部署rsync服务

启动rsync服务

creates=/var/run/rsyncd.pid  systemctl start rsyncd

/var/run/rsyncd.pid             此文件若存在则说明rsync服务开启

removes 参数              如果存在,则执行后面的命令

2.shell

第二个模块:命令模块 - shell(万能模块)

作用:在目标主机执行命令:

 

参数:

    chdir:    在执行命令前,先切换目录信息

    creates:  判断一个文件是否存在,如果存在,后面命令被跳过(不执行)

    removes:  判断一个文件是否存在,如果存在,后面命令就执行

    free_form:在使用command模块时候必须输入一个合法的linux命令

    可以识别一些特殊字符  < > | ; $

 

PS: shell模块虽然是万能模块,但最好选择专业的模块完成专业事情

 

3.script 

第三个模块:命令模块 - script (执行脚本)

 

shell 模块执行脚本:太麻烦

第一个历程:编写脚本

[root@m01 scripts]# cat yum.sh

#!/bin/bash

yum install -y iftop

 

第二个历程:批量分发脚本文件

ansible backup -m copy -a "src=/server/scripts/yum.sh dest=/server/scripts/"

 

第三个历程:修改脚本权限

ansible backup -m shell -a "chmod a+x /server/scripts/yum.sh"

 

第四个历程:运行脚本

ansible backup -m shell -a " /server/scripts/yum.sh "

 

查看安装是否成功:

ansible backup -m shell -a "rpm -qa iftop”

 

卸载安装软件:

ansible backup -m shell -a "rpm -e iftop --nodeps”  不卸载依赖

 

删除分发出去的脚本:

ansible backup -m shell -a "rm -f /server/scripts/yum.sh"

 

script 模块执行脚本 专业,快捷

第一个历程:编写脚本

[root@m01 scripts]# cat yum.sh

#!/bin/bash

yum install -y iftop

 

第二个历程:运行脚本

ansible backup -m script -a "/server/scripts/yum.sh"

4.ping模块

ansible all -m ping

 

04.Files modules    文件模块

1.copy

第四个模块:文件模块 - copy (批量分发文件---推)copy – Copy files to remote locations     复制-将文件复制到远程位置

作用:

01. 分发文件数据信息     从管理端 -- 被管理端

02. 修改文件权限属性信息 

03. 移动远程主机数据信息到被管理端 -- /tmp/oldboy.txt --- /opt/

   

参数:

    src:            指定要推送的数据信息

    dest:        指定数据保存在远程主机什么目录中

    mode:        修改文件权限信息

    owner:       修改文件属主信息

    group:       修改文件属组信息

    backup:       分发文件数据时,会对源文件进行备份

    remote_src:    复制远程主机文件到其他路径,或者进行远程主机数据备份

    content:       直接编辑文件内容 

  

基本用法:

[root@m01 scripts]# ansible backup -m copy -a "src=/etc/hosts dest=/etc/"

172.16.1.31 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "checksum": "d638ce40c3828809802a8d20a585f139f6890487",

    "dest": "/etc/hosts",

    "gid": 0,

    "group": "root",

    "md5sum": "be2eb412ea180d86e3aab6e170c2afd2",

    "mode": "0655",

    "owner": "root",

    "size": 388,

    "src": "/root/.ansible/tmp/ansible-tmp-1560968556.5-168727351038161/source",

    "state": "file",

    "uid": 0

}

 

特殊用法:传输文件时,修改文件权限mode  owner  group

[root@m01 scripts]# ansible backup -m copy -a "src=/etc/hosts dest=/etc/hosts.bak mode=600 owner=oldboy666 group=oldboy666"

172.16.1.41 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "checksum": "d638ce40c3828809802a8d20a585f139f6890487",

    "dest": "/etc/hosts.bak",

    "gid": 2003,

    "group": "oldboy666",

 

    "md5sum": "be2eb412ea180d86e3aab6e170c2afd2",

    "mode": "0600",

    "owner": "oldboy666",

    "size": 388,

    "src": "/root/.ansible/tmp/ansible-tmp-1560968753.45-226114293229473/source",

    "state": "file",

    "uid": 2003

}

 

特殊用法:分发文件时,对源文件进行备份backup

[root@m01 scripts]# ansible backup -m copy -a "src=/etc/hosts dest=/etc/ backup=yes"

172.16.1.41 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "backup_file": "/etc/hosts.4824.2019-06-20@02:29:05~",

    "changed": true,

    "checksum": "d638ce40c3828809802a8d20a585f139f6890487",

    "dest": "/etc/hosts",

    "gid": 1006,

    "group": "1006",

    "md5sum": "be2eb412ea180d86e3aab6e170c2afd2",

    "mode": "0655",

    "owner": "root",

    "size": 388,

    "src": "/root/.ansible/tmp/ansible-tmp-1560968943.36-147735865721233/source",

    "state": "file",

    "uid": 0

}

 

特殊用法:远程主机文件进行复制备份(便于批量还原)remote_src

[root@m01 scripts]# ansible backup -m copy -a "src=/etc/hosts dest=/etc/hosts.backup  remote_src=yes"

172.16.1.31 | CHANGED => {

"ansible_facts": {

    "discovered_interpreter_python": "/usr/bin/python"

},

"changed": true,

"checksum": "d638ce40c3828809802a8d20a585f139f6890487",

"dest": "/etc/hosts.backup",

 

"gid": 0,

"group": "root",

"md5sum": "be2eb412ea180d86e3aab6e170c2afd2",

"mode": "0644",

"owner": "root",

"size": 388,

"src": "/etc/hosts",

"state": "file",

"uid": 0

}

 

批量还原:

[root@m01 scripts]# ansible backup -m copy -a "src=/etc/hosts.backup dest=/etc/hosts  remote_src=yes"

  

特殊用法:直接编辑文件信息,并且进行批量分发

[root@m01 scripts]# ansible backupclient -m copy -a "content='oldboy123' dest=/etc/rsync.password mode=600"

172.16.1.31 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "checksum": "3f8922898e4b39c87b50ac500daa3cca511852e6",

    "dest": "/etc/rsync.password",

    "gid": 0,

    "group": "root",

    "md5sum": "484d81f3893c04df63dc6bd2aedc917c",

    "mode": "0600",

    "owner": "root",

    "size": 9,

    "src": "/root/.ansible/tmp/ansible-tmp-1560969723.3-152280896619550/source",

    "state": "file",

    "uid": 0

}

2.fetch

第五个模块:文件模块 - fetch(批量拉取文件---拉) 扩展

[root@m01 scripts]# ansible 172.16.1.7 -m fetch -a "src=/etc/oldgirl.txt dest=/tmp"

172.16.1.7 | CHANGED => {

     "changed": true,

     "checksum": "33da810408978fbe2dba2befb82fa563283593a4",

     "dest": "/tmp/172.16.1.7/etc/oldgirl.txt",

"md5sum": "bf125690a883fe949eba7392500a3054",

"remote_checksum": "33da810408978fbe2dba2befb82fa563283593a4",

    "remote_md5sum": null

}

3.file

第六个模块:文件模型 - file (修改文件权限

作用:

    01. 修改文件权限信息

    02. 创建数据信息/删除数据信息

基本用法: 修改文件权限

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "path=/etc/oldgirl.txt mode=666 owner=oldboy666 group=oldboy666"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "gid": 1027,

    "group": "oldboy666",

    "mode": "0666",

    "owner": "oldboy666",

    "path": "/etc/oldgirl.txt",

    "size": 9,

    "state": "file",

    "uid": 1026

}

 

特殊用法:创建数据信息:(文件或目录)

 

参数:

State=

    absent             -- 删除数据信息

    directory          -- 创建目录

    file

    hard             -- 创建硬链接

    link              -- 创建软链接

    touch            -- 创建文件

  

创建文件:

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "path=/oldboy/oldboy.txt state=touch"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "dest": "/oldboy/oldboy.txt",

    "gid": 0,

    "group": "root",

    "mode": "0644",

    "owner": "root",

    "size": 0,

    "state": "file",

    "uid": 0

}

 

创建目录:

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "path=/oldboy/oldboy_dir state=directory"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "gid": 0,

    "group": "root",

    "mode": "0755",

    "owner": "root",

    "path": "/oldboy/oldboy_dir",

    "size": 6,

    "state": "directory",

    "uid": 0

}

 

创建链接文件:软连接/硬链接

创建硬链接:

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "src=/oldboy/oldboy.txt path=/oldboy/oldboy_dir/oldboy_hard_link  state=hard"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

 

    "changed": true,

    "dest": "/oldboy/oldboy_dir/oldboy_hard_link",

    "gid": 0,

    "group": "root",

    "mode": "0644",

    "owner": "root",

    "size": 0,

    "src": "/oldboy/oldboy.txt",

    "state": "hard",

    "uid": 0

}

find /oldboy -type f -inum (inode号)   查找相同inode硬链接文件

 

创建软链接

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "src=/oldboy/oldboy.txt path=/oldboy/oldboy_dir/oldboy_soft_link  state=link"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "dest": "/oldboy/oldboy_dir/oldboy_soft_link",

    "gid": 0,

    "group": "root",

    "mode": "0777",

    "owner": "root",

    "size": 18,

    "src": "/oldboy/oldboy.txt",

    "state": "link",

    "uid": 0

}

 

删除文件数据:

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "path=/oldboy/oldboy_dir/oldboy_soft_link  state=absent"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "path": "/oldboy/oldboy_dir/oldboy_soft_link",

    "state": "absent"

}

 

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "path=/oldboy/oldboy.txt  state=absent"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "path": "/oldboy/oldboy.txt",

    "state": "absent"

}

[root@m01 scripts]# ansible 172.16.1.7 -m file -a "path=/oldboy/oldboy_dir  state=absent"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "path": "/oldboy/oldboy_dir",

    "state": "absent"

}

  

4.stat

功能: 获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息。

 

[root@m01 ~]# ansible all -m stat -a "path=/etc/sysctl.con

 

 

05.cron   定时任务模块

cron 定时任务模块:

作用:批量添加设置定时任务信息 

*         *      *     *       *        定时任务信息  &>/dev/null

分       时     日    月      周

minute  hour   day   month  weekday  job='任务信息  &>/dev/null'

 

参数:

minute  hour   day   month  weekday  --- 时间参数

job     -- 指定定时任务信息

name    -- 添加注释信息

state   -- absent 删除定时任务 present 添加定时任务

disabled   -- 注释定时任务 yes  取消定时任务注释 no

 

批量编写定时任务: 每隔5分钟,时间同步

# ansible backup -m cron -a "name='date ntpdate crond02' minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null'"

172.16.1.41 | CHANGED => {

   "ansible_facts": {

       "discovered_interpreter_python": "/usr/bin/python"

   },

   "changed": true,

   "envs": [],

   "jobs": [

       "date ntpdate crond",

       "date ntpdate crond02"

   ]

}

 

批量删除定时任务信息:

[root@m01 ~]# ansible backup -m cron -a "name='date ntpdate crond' state=absent"

172.16.1.41 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "envs": [],

    "jobs": []

}

  

批量注释定时任务信息:

[root@m01 ~]# ansible backup -m cron -a "name='date ntpdate crond'  minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null' disabled=yes"

172.16.1.41 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "envs": [],

    "jobs": [

        "date ntpdate crond"

    ]

}

06.yum安装软件包模块

yum 批量下载安装软件

作用:安装部署软件

 

参数:

name:  指定软件名称

state: 指定动作信息  installed

  

安装软件

[root@m01 ~]# ansible backup -m yum -a "name=nmap state=installed"

172.16.1.41 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false,

    "msg": "",

    "rc": 0,

    "results": [

        "2:nmap-6.40-16.el7.x86_64 providing nmap is already installed"

    ]

}

07.service 服务管理模块

service 管理服务状态模块

作用:批量启动/停止服务程序  设置服务是否开机自动启动

 

参数:

    name:   定义服务名称

    state: 

started         ---是否启动

stopped        ---停止

restarted       ---重启

reloaded        ---平滑重启

    enabled:  设置服务是否开机自动启动

   

设置服务启动/停止:

启动:

ansible backup -m service -a "name=firewalld state=started enabled=yes"

 

停止:

ansible backup -m service -a "name=firewalld state=stopped enabled=no"

08.用户管理模块

user

user  ---远程批量创建用户信息

参数:

name       创建的用户名称

uid        指定用户的uid信息

group      指定属于主要组

groups     指定属于哪个附属组

password   设置用户密码信息???

shell       指定登录方式 /bin/bash  /sbin/nologin

create_home:yes   no

home        指定家目录创建在什么路径 默认/home

创建虚拟用户:

[root@m01 ~]# ansible backup -m user -a "name=Alex uid=250 group=root groups=oldboy shell=/sbin/nologin create_home=no"

172.16.1.41 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "comment": "",

    "create_home": false,

    "group": 0,

    "groups": "oldboy",

    "home": "/home/Alex",

    "name": "Alex",

    "shell": "/sbin/nologin",

    "state": "present",

    "system": false,

    "uid": 250

}

设置用户密码:

PS:密码信息必须是加密的

ansible backup -m user -a 'name=Alex02 password="$6$oldgirl$kAUTXVC2z1agr1HlmpFe9abFhWKwJ1fNyg64F95U3rVumwQfqOuhV3YkyZU9.H79TChzIKn5epl5M18B199qV1"'

 

如何生成密码信息:

==============================================================

ps: 密码密文生成方式:

    https://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module

 

方法一:

ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"

 

mypassword      --- 明文密码信息

sha512            --- 明文转换为密文加密方法

mysecretsalt       --- 用什么做算法依据生成密文信息

 

ansible all -i localhost, -m debug -a "msg={{ 'oldboy123' | password_hash('sha512', 'oldgirl') }}"

   

实践操作:

[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'oldboy123') }}"

localhost | SUCCESS => {

    "msg": "$6$oldboy123$W3jkmkkVTr.9UStm4S50RT2uIEjB/4GEtaAeVCSZ..uWVN1YGxHvluss9JVfAPV0gSJoGn1qAfxGyttIsTjcz0"

}

 

方法二:  在centos7中无法使用

  mkpasswd --method=sha-512

 

方法三:  利用python模块功能

  yum install python-pip

  pip install passlib              

  python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

 

 

group

远程批量创建用户组信息

参数:

gid         指创建的组ID信息

name      指创建组名称信息

state        删除指定的用户组

ansible web01 -m group -a "name=www gid=1003"

ansible web01 -m group -a "dkaiyun gid=1055 state=absent"

 

 

09.mount挂载模块

mount  挂载模块

作用:实现批量挂载操作

 

参数:

src:需要挂载存储设备信息

path: 挂载点路径信息

fstype:挂载类型信息

state:

挂载操作(mounted  present):

          mounted: 可以实现立即挂载  永久开机自动挂载

          present:                   永久开机自动挂载

     卸载操作(unmounted absent):

          unmounted: 可以实现立即卸载

          absent:    可以实现立即卸载  永久卸载

  

批量挂载操作:

ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted"

172.16.1.7 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": true,

    "dump": "0",

    "fstab": "/etc/fstab",

    "fstype": "nfs",

    "name": "/mnt",

    "opts": "defaults",

    "passno": "0",

    "src": "172.16.1.31:/data"

}

 

10.unarchive模块用于解压文件

模块包含如下选项:

– copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。

– creates:指定一个文件名,当该文件存在时,则解压指令不执行

– dest:远程主机上的一个路径,即文件解压的绝对路径。

– group:解压后的目录或文件的属组

– list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项

– mode:解压后文件的权限

– src:如果copy为yes,则需要指定压缩文件的源路径

– owner:解压后文件或目录的属主

---------------------

1.8.4 用脚本实现批量部署服务  

编写脚本:

一键化部署rsync服务:ansible命令

  

rsync服务部署流程:

服务端部署:

01. 安装软件程序

ansible 172.16.1.41 -m yum -a "name=rsync state=installed"

02. 编写配置文件

ansible 172.16.1.41 -m copy -a "src=/etc/rsyncd.conf dest=/etc/"

03. 创建虚拟用户

ansible 172.16.1.41 -m user -a "name=rsync shell=/sbin/nologin create_home=no"

04. 创建密码文件,并修改权限

ansible 172.16.1.41 -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600"

05. 创建备份目录,并修改权限

ansible 172.16.1.41 -m file -a "path=/backup state=directory owner=rsync group=rsync"

06. 启动程序服务

ansible 172.16.1.41 -m service -a "name=rsyncd state=restarted enabled=yes"

  

客户端部署:

01. 安装软件程序

ansible rsync_client -m yum -a "name=rsync state=installed"

02. 创建密码文件,并修改权限

ansible rsync_client -m copy -a "content='oldboy123' dest=/etc/rsync.password mode=600"

  

 

1.8.5 ansible软件剧本编写 *****

 

01.剧本的编写规范

模块--命令

剧本--脚本:汇总多个模块的批量操作

   

剧本如何编写: python yaml 语法规范

三种规范原则:

    空格:  缩进信息  两个空格 

            PS:编写剧本时,将tab键扣掉

    冒号:  key-value(键值关系)- hosts: 172.16.1.41

       冒号后面不需要有空格情况:

                01. 以冒号结尾

          02. 冒号信息出现在注释信息中

    短横线:- 生成列表信息 

    - hosts: 172.16.1.41

    - hosts: 172.16.1.31

 

剧本内容编写:(剧本 -- 人  事件)

mkdir -p /etc/ansible/ansible_playbook

vim /etc/ansible/ansible_playbook/test.yaml

 

- hosts: 172.16.1.41/oldboy/all

  tasks:

    - yum: name=rsync state=installed

    - copy: src=/etc/rsyncd.conf dest=/etc/

 

02.剧本格式编写方法:

第一种方法:ansible

- hosts: 172.16.1.31

  tasks:

    - name: 01:安装nfs程序软件和rpcbind

      yum: name=nfs-utils state=installed

      yum: name=rpcbind state=installed

 

第二种方法:ansible --> saltstack(状态模块/文件)

- hosts: 172.16.1.31

  tasks:

    - name: 01:安装nfs程序软件和rpcbind

      yum:

        name:

          - nfs-utils

          - rpcbind

        state:installed

 

 

 

03.剧本执行方法:

01. 检查剧本语法信息

ansible-playbook --syntax-check test.yaml

playbook: test.yaml

02. 剧本模拟执行

ansible-playbook -C test.yaml

03. 真实执行剧本

ansible-playbook  test.yaml

     

常见问题:

如果安装了cowsay

vim /etc/ansible/ansible.cfg

nocows = 1

 

04.简单剧本功能完成服务程序一键化部署

1.rsync服务程序一键化剧本

第一个历程:修改主机清单

vim /etc/ansible/hosts

[rsync_client]

172.16.1.7

172.16.1.31

  

第二个历程:创建所需分发文件

vim /etc/ansible/ansible_playbook/rsyncd.conf

  

第三个历程:编写剧本文件

[root@m01 ansible_playbook]# cat rsync_auto.yaml

- hosts: 172.16.1.41

 tasks:

   - name: 01:install rsync software

     yum: name=rsync state=installed

   - name: 02:push client

     copy: src=./rsyncd.conf dest=/etc/

   - name: 03:create user

     user: name=rsync shell=/sbin/nologin create_home=no

   - name: 04:create password file

     copy: content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600

    - name: 05:create backup dir

      file: path=/backup state=directory owner=rsync group=rsync

    - name: 06:重启rsync服务

      service: name=rsyncd state=restarted enabled=yes 

 

- hosts: rsync_client

  tasks:

    - name: 01:ceate password file

      copy: content='oldboy123' dest=/etc/rsync.password mode=600

 

第四个历程:测试剧本功能

  

 

 

2.nfs服务一键化部署剧本

- hosts: 172.16.1.31

  tasks:

    - name: 01:安装nfs程序软件和rpcbind

      yum:

        name:

          - nfs-utils

          - rpcbind

        state: installed

    - name: 02:分发配置文件

      copy:

        src: ./exports

        dest: /etc/

    - name: 03:创建目录信息并授权

      file:

        path: /data

        state: directory

        owner: nfsnobody

        group: nfsnobody

    - name: 04:启动服务程序

      service: name=rpcbind state=restarted enabled=yes

      service: name=nfs state=restarted enabled=yes

 

- hosts: nfs_client

  tasks:

    - name: 01:安装nfs软件

      yum: name=nfs-utils state=installed

    - name: 02:挂载共享目录

      mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted

 

 

  

 

05.编写剧本的重要功能介绍

1)在剧本中设置变量信息

方式一:直接在剧本文件编写   优先02

vars:

  oldboy01: data01

  oldboy02: data02

实践配置:

[root@m01 ansible_playbook]# cat test_变量功能.yaml

- hosts: 172.16.1.7

  vars:

    src_dir: /etc/hosts

    dest_dir: /opt

  tasks:

 

    - name: copy file

      copy: src={{ src_dir }}  dest={{ dest_dir }}

 

方式二:在命令行中进行指定   优先01

ansible-playbook --extra-vars=oldboy01=data01

实践操作:

ansible-playbook -e src_dir=/etc/hosts -e dest_dir=/opt test_变量功能.yaml

PS:剧本中可以不用设置变量

  

方式三:在主机清单文件编写   优先03

[oldboy:vars]

oldboy01=data01

oldboy02=data02

  

实践配置:主机清单配置

[nfs_client]

172.16.1.7

172.16.1.41

[nfs_client:vars]

src_dir=/etc/hosts

dest_dir=/opt

  

测试剧本文件:

[root@m01 ansible_playbook]# cat test_变量功能.yaml

- hosts: nfs_client

  #vars:

  #  src_dir: /etc/hosts

  #  dest_dir: /opt

  tasks:

    - name: copy file

      copy: src={{ src_dir }}  dest={{ dest_dir }}

 

三种变量设置方式都配置了

最优先:      命令行变量设置

次优先:      剧本中变量设置

  最后:        主机清单变量设置

  

2)在剧本中设置注册信息 ---执行时,显示输出命令结果信息  debug

- hosts: oldboy

  tasks:

    - name: check server port

      shell: netstat -lntup  --- 端口信息

      register: get_server_port<--端口信息

 

    - name: display port info

      debug: msg={{ get_server_port.stdout_lines }}

显示进程信息,表示服务已经正常启动

PS: 设置变量不能有空格信息

  

实践配置:

[root@m01 ansible_playbook]# cat test_注册功能.yaml

- hosts: 172.16.1.7

 tasks:

   - name: boot ssh server

     service: name=sshd state=started

   - name: check server status

     shell: netstat -lntup|grep sshd

     register: display_port_info

   - name: check port info

     debug: msg={{ display_port_info.stdout_lines }}

  

3)在剧本中设置判断信息 ---执行时,显示输出命令结果信息  setup

如何指定判断条件:

(ansible_hostname == "nfs01")

(ansible_hostname == "web01")

setup模块中显示被管理主机系统的详细信息

- hosts: oldboy

  remote_user: root

  tasks:

    - name: Check File

      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch

      when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")  

 

    - name: install httpd

      yum: name=httpd state=installed

      when: (系统情况 == "CentOS")

 

    - name: install httpd2

      yum: name=httpd2 state=installed

      when: (系统情况 == "ubuntu")

 

setup获取内置变量方法:(主机信息)

ansible oldboy -m setup -a "filter=ansible_hostname"

 

常见主机信息:

ansible_all_ipv4_addresses:                   仅显示ipv4的信息。

ansible_devices:                                    仅显示磁盘设备信息。

ansible_distribution:                             显示是什么系统,例:centos,suse等。

ansible_distribution_major_version:      显示是系统主版本。

ansible_distribution_version:                仅显示系统版本。

ansible_machine:                            显示系统类型,例:32位,还是64位。

ansible_eth0:                                         仅显示eth0的信息。

ansible_hostname:                                仅显示主机名。

ansible_kernel:                                      仅显示内核版本。

ansible_lvm:                                       显示lvm相关信息。

ansible_memtotal_mb:                          显示系统总内存。

ansible_memfree_mb:                     显示可用系统内存。

ansible_memory_mb:                     详细显示内存情况。

ansible_swaptotal_mb:                          显示总的swap内存。

ansible_swapfree_mb:                           显示swap内存的可用内存。

ansible_mounts:                                 显示系统磁盘挂载情况。

ansible_processor:                                 显示cpu个数(具体显示每个cpu的型号)。

ansible_processor_vcpus:               显示cpu个数(只显示总的个数)。

 

实践编写:

[root@m01 ansible_playbook]# cat test_判断功能.yaml

- hosts: rsync

  tasks:

    - name: create server password file

      copy: content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600

      when: (ansible_hostname == "backup")

    - name: create client password file

      copy: content='oldboy123' dest=/etc/rsync.password mode=600

      when: (ansible_hostname != "backup")

4)在剧本中设置循环信息

vim test04.yml

- hosts: all

  remote_user: root

  tasks:

    - name: Add Users

      user: name={{ item.name }} groups={{ item.groups }} state=present

      with_items:

        - { name: 'testuser1', groups: 'bin' }

        - { name: 'testuser2', groups: 'root' }

 

vim test05.yml

- hosts: all

  remote_user: root

  tasks:

    - name: Installed Pkg

      yum: name={{ item }}  state=present

      with_items:

        - wget

        - tree

        - lrzsz

 

实践配置:

[root@m01 ansible_playbook]# cat test_循环功能.yaml

- hosts: 172.16.1.7

 tasks:

   - name: 创建多个用户

     user: name={{ item.name }} shell={{ item.shell }} create_home={{ item.create_home }}

     with_items:

       - { name: 'oldboy01', shell: '/sbin/nologin', create_home: 'no' }

       - { name: 'oldboy02', shell: '/sbin/nologin', create_home: 'yes' }

       - { name: 'oldboy03', shell: '/bin/bash', create_home: 'yes' }

   - name: 创建多个用户

     user: name={{ item }} shell=/sbin/nologin create_home=no

     with_items:

       - oldboy04

       - oldboy05

       - oldboy06    

 

5)在剧本中设置忽略错误

默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行

可以加入ignore_errors: yes忽略错误

vim test06.yml

- hosts: all

  remote_user: root

  tasks:

    - name: Ignore False

      command: /bin/false

       ignore_errors: yes

    - name: touch new file

    file: path=/tmp/oldboy_ignore state=touch 

 

实践配置:

[root@m01 ansible_playbook]# cat test_忽略错误.yaml

- hosts: 172.16.1.7

  tasks:

    - name: create user

      shell: useradd oldboy01 -s /sbin/nologin -M

      ignore_errors: yes

    - name: create dir

      shell: mkdir /oldboy

      ignore_errors: yes

    - name: create file

      shell: touch /etc/oldboy.txt 

 

6)在剧本中设置标签功能

- hosts: oldboy

  ignore_errors: yes

  remote_user: root

  tasks:

    - name: Check File

      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch

      when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")

      tags: t1

 

    - name: bad thing

      command: echo 123

      #ignore_errors: yes

      tags: t2

 

    - name: install httpd

      yum: name=httpd state=installed

      when: (ansible_all_ipv4_addresses == ["172.16.1.7","10.0.0.7"])

      tags: t3

 

    - name: install httpd2

      yum: name=httpd2 state=installed

      when: (ansible_distribution == "ubuntu")

      tags: t4

    

指定执行哪个标签任务:

ansible-playbook --tags=t2 test05.yml

 

跳过指定标签任务:    

ansible-playbook --skip-tags=t2 test05.yml

 

实践配置:

[root@m01 ansible_playbook]# cat test_标签功能.yaml

- hosts: 172.16.1.7

  tasks:

    - name: create user

      user: name=oldboy01 shell=/sbin/nologin

      tags: test_create_user

    - name: create dir

      shell: mkdir /oldboy

      ignore_errors: yes

    - name: create file

      shell: touch /etc/oldboy.txt

    

应用标签功能:

ansible-playbook test_标签功能.yaml -i ./nfs_hosts -t test_create_user

ansible-playbook test_标签功能.yaml -i ./nfs_hosts --skip-tags test_create_user

 

7)在剧本中设置触发功能

- hosts: backup

  remote_user: root

  tasks:

    - name: 01 Install rsync

      yum: name=rsync state=present

    - name: 02 push config file

      copy: src=./file/{{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }}

      with_items:

        - { src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644" }

        - { src: "rsync.password", dest: "rsync.password", mode: "0600" }

      notify: restart rsync server

  handlers:

    - name: restart rsync server

      service: name=rsyncd state=restarted  

实践配置:

[root@m01 ansible_playbook]# cat test_触发功能.yaml

- hosts: 172.16.1.41

  tasks:

    - name: 分发配置文件

      copy: src=./rsyncd.conf dest=/etc

      notify: rsync_server_restart

    - name: 启动服务

      service: name=rsyncd state=started

  handlers:

    - name: rsync_server_restart

      service: name=rsyncd state=restarted

 

8)忽略远程主机采集功能

实践配置:

- hosts: 172.16.1.7

  gather_facts: no

  tasks:

    - name: create file

      file: path=/etc/oldgirl.txt state=touch

    - name: mount /data

      mount: src=172.16.1.31:/data path=/mnt state=mounted

PS:判断功能会失效 

ansible-playbook test_采集功能.yaml -i ./nfs_hosts -vvvv  

               

9)将多个剧本进行整合

方式一:include_tasks: f1.yml   --- roles 汇总多个剧本  

- hosts: all

  remote_user: root

  tasks:

    - include_tasks: f1.yml

    - include_tasks: f2.yml

  

方式二:include: f1.yml

- include:f1.yml

- include:f2.yml

 

方式三:- import_playbook:

[root@m01 ansible-playbook]# cat main.yml

- import_playbook: base.yml     

- import_playbook: rsync.yml   

- import_playbook: nfs.yml     

- import_playbook: sersync.yml

- import_playbook: web.yml

- import_playbook: php.yml

- import_playbook: mysql.yml

- import_playbook: lb.yml

- import_playbook: keepalived.yml

   ===================================

- import_playbook: zabbix.yml

- import_playbook: jumpserver.yml  跳板机

- import_playbook: vpn.yml

- import_playbook: ntpserver.yml

- import_playbook: nosql-redis.yml

 

详细的剧本扩展:

https://docs.ansible.com/ansible/latest/user_guide/playbooks.html

 

扩展:影响剧本执行速度

原因:需要下载软件 yum  php mysql zabbix

搭建本地yum仓库

 

 

  

06. ansible剧本规范化配置

剧本编写完问题: 使用ansible程序roles --- 规范

1)目录结构不够规范            OK

2)编写好的任务如何重复调用

3)管理端配置文件改动,被管理参数信息也自动变化(template---keepalived)

4)汇总剧本中没有显示主机角色信息

5)一个剧本内容信息过多,不容易进行阅读,如何进行拆分     OK

 

role -- 剧本更加规范

rsync角色目录:

vars:  main.yaml    设置变量信息

    tasks: main.yaml    剧本任务信息

    file:                分发文件信息           copy

    template            分发文件信息(模板)   template vs copy

    handlers main.yaml  编写触发器信息

 

 

第一个历程: 规范目录结构

cd /etc/ansible/roles

mkdir {rsync,nfs}                     --- 创建相应角色目录

mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files} ---创建角色目录下面的子目录

[root@m01 roles]# tree

├── nfs

│?? ├── files       --- 保存需要分发文件目录

│?? ├── handlers        --- 保存触发器配置文件信息

│?? ├── tasks       --- 保存要执行的动作信息文件   ok

│?? ├── templates    --- 保存需要分发模板文件 模板文件中可以设置变量信息  ???

│?? └── vars        --- 保存变量信息文件

└── rsync

    ├── files

    ├── handlers

    ├── tasks

    ├── templates

    └── vars

 

第二个历程: 在roles目录中创建相关文件

编写文件汇总流程图:

1)  编写tasks目录中的main.yml文件

汇总文件,要拆分成多个yml文件

- name: 01-copy conf file

  copy: src=exports dest=/etc

  notify: restart nfs server

- name: 02-create data dir

  file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody  

   #path: ['data01','data02','data03']   

   #state: directory   

   #owner: nfsnobody   

   #group: nfsnobody

- name: 03-boot server

  service: name={{ item }} state=started enabled=yes

  with_items:

    - rpcbind

    - nfs

拆分:

汇总tasks目录中的yml文件

vim main.yml

- include_tasks: copy_info.yml

- include_tasks: create_dir.yml

- include_tasks: boot_server.yml

编辑copy的yml文件

vim copy_info.yml      

- name: 01-copy conf file

  copy: src=exports dest=/etc

  notify: restart nfs server

编辑create_dir的yml文件

vim create_dir.yml

- name: 02-create data dir

  file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody

编辑服务启动的yml文件

vim boot_server.yml

- name: 03-boot server

  service: name={{ item }} state=started enabled=yes

  with_items:

    - rpcbind

    - nfs

 

2) 编写vars目录中的main.yml文件

[root@m01 vars]# vim main.yml

Data_dir: /data

 

3) 编写files目录中的文件

[root@m01 files]# ll

total 4

-rw-r--r-- 1 root root 29 May 17 15:23 exports

  

4) 编写handlers目录中的main.yml文件

vim main.yml

- name: restart nfs server

  service: name=nfs state=restarted

  

目录中文件编写好汇总结构

[root@m01 nfs]# tree

.

├── files

│?? └── exports

├── handlers

│?? └── main.yml

├── tasks

│?? └── main.yml

├── templates

└── vars

   └── main.yml

     

第三个历程: 编写一个主剧本文件

[root@m01 roles]# cat site.yml 

- hosts: nfs_server

  roles:

    - nfs-server

- hosts: rsync_server

  roles:

    - rsync

 

 

07.一键化汇总部署完成流程:

第一个历程:每个服务剧本编写完毕

第二个历程:主机清单配置完毕

第三个历程:多个剧本进行合并

第四个历程:进行剧本执行测试

  

08.剧本排查问题方法思路

剧本执行出现错误排查思路/步骤:

1) 利用调试功能找到剧本中出现问题关键点

2) 将剧本中的任务信息转换成模块命令进行测试

    - name: 分发   -->  ansible xx -m copy -a "xxxx"

     copy: xxx 

3) 将模块的功能操作转换成linux命令

ansible xx -m copy -a "xxxx"  --- rsync/scp

4)本地管理主机上执行命令测试或远程被管理主机上执行命令测试

     ansible-play -vvvv

 

- name: 01-install rsync

  yum:

    name: ['rsync', 'tree', 'wget']         --- saltstack

    state: installed

 

- name: xxx

  yum: name=xxx state=installed      --- ansible

 

扩展说明:单独加载指定主机清单文件

ansible-playbook nfs_auto.yaml -i ./nfs_hosts

-i  指定加载主机清单

 

 

09.扩展练习

1. 取出setup指定信息中的部分信息

[root@m01 ansible_playbook]# ansible 172.16.1.7 -m setup -a "filter=ansible_default_ipv4"

172.16.1.7 | SUCCESS => {

    "ansible_facts": {

        "ansible_default_ipv4": {

            "address": "10.0.0.7",

            "alias": "eth0",

            "broadcast": "10.0.0.255",

            "gateway": "10.0.0.254",

            "interface": "eth0",

            "macaddress": "00:0c:29:b2:e3:7e",

            "mtu": 1500,

            "netmask": "255.255.255.0",

            "network": "10.0.0.0",

            "type": "ether"

        },

        "discovered_interpreter_python": "/usr/bin/python"

    },

    "changed": false

}

 

只取出address地址信息: 

  ansible 172.16.1.7 -m setup -a "filter=ansible_all_ipv4_addresses "

 

 

2. 如何搭建yum仓库

第一个历程:收集软件信息 软件包

第二个历程:将软件放置到仓库目录

  find /var/cache/yum/$basearch/$releasever -type f -name "*.rpm"|xargs -i mv {} /yum

第三个历程:执行命令创建仓库目录清单列表

第四个历程:搭建web服务

第五个历程:编写yum源文件

  

1.9 实时同步服务

1.9.1 数据实时同步备份

1. 概念说明:

定时同步备份数据:缺点,备份的周期最短为1分钟   企业内部人员数据

实时同步备份数据:数据同步备份效率高            用户外部人员数据

 

2.同步原理:

01. 发现指定目录数据有变化   inotify

    02. 将变化数据进行传输备份   rsync

    03. 利用脚本实现实时同步     while循环(条件判断)-> sersync

  

1.9.2 实时监控软件

1)监控软件安装部署

yum install -y inotify-tools    ---epel源

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2)软件命令应用

rpm -ql inotify-tools

rpm -qc 服务            --- 查看服务程序配置文件保存路径

   

inotifywait              --- 监控目录变化的数据信息

inotifywatch           --- 监控变化事件次数

 

监控事件信息:增加信息  删除信息  修改信息  移动数据

 

inotifywait参数说明:

--exclude <pattern>    --- 排除指定数据信息,不做实时同步

    --excludei <pattern>   --- 排除指定数据信息(数据信息忽略大小写),不做实时同步

    -m|--monitor          --- 实时一直进行监控(默认只监控一次)

    -r|--recursive         --- 递归监控目录

    --format <fmt>         --- 设置监控输出信息的格式 (了解)

--timefmt <fmt>      --- 时间格式设定

-e|--event              --- 指定监控事件  (只监控目录中是否有新的数据创建)

-q|--quiet              --- 减少命令输出的信息

  

inotify事件信息:

access               file or directory contents were read

                          ---文件数据内容被读取

 

modify               file or directory contents were written

                           ---文件数据内容被写入

 

attrib             file or directory attributes changed

                           ---文件数据属性被修改

 

close_write        file or directory closed, after being opened in writeable mode                  ---文件或目录被关闭,在文件被修改后

 

close_nowrite       file or directory closed, after being opened in read-only mode               ---文件或目录被关闭,在文件没有被改动后

 

close             file or directory closed, regardless of read/write mode                        ---文件或目录被关闭,无论编写或者未修改

 

open              file or directory opened  ---文件被打开

 

moved_to       file or directory moved to watched directory

                          ---文件或目录移动到监控目录中

moved_from      file or directory moved from watched directory

---文件或目录从监控目录中移出

 

move             file or directory moved to or from watched directory                      ---文件或目录被移动了

 

create            file or directory created within watched directory

                           ---文件或目录在指定监控目录中进行创建

delete            file or directory deleted within watched directory

                           ---文件或目录在指定监控目录中进行删除

 

                 

实践操作演示:

[root@nfs01 data]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f 事件:%e'  /data

24/06/19 09:41 /data/oldboy06.txt 事件:CREATE

24/06/19 09:41 /data/oldboy06.txt 事件:OPEN

24/06/19 09:41 /data/oldboy06.txt 事件:ATTRIB

24/06/19 09:41 /data/oldboy06.txt 事件:CLOSE_WRITE,CLOSE

  

sed命令替换修改内容

24/06/19 09:44 /data/oldboy01.txt 事件:OPEN    打开源文件信息

24/06/19 09:44 /data/sedLDr3BA 事件:CREATE    创建一个临时文件

24/06/19 09:44 /data/sedLDr3BA 事件:OPEN      将临时文件打开

24/06/19 09:44 /data/oldboy01.txt 事件:ACCESS   访问源文件信息

24/06/19 09:44 /data/sedLDr3BA 事件:MODIFY    修改临时文件

24/06/19 09:44 /data/sedLDr3BA 事件:ATTRIB     修改临时文件属性

24/06/19 09:44 /data/oldboy01.txt 事件:CLOSE_NOWRITE,CLOSE  源文件不做任何改动

24/06/19 09:44 /data/sedLDr3BA 事件:CLOSE_WRITE,CLOSE  临时文件修改完毕保存

24/06/19 09:44 /data/sedLDr3BA 事件:MOVED_FROM 临时文件进行重命名操作

24/06/19 09:44 /data/oldboy01.txt 事件:MOVED_TO

  

1.9.3 脚本如何实现实时同步:

#!/bin/bash

 

只要监控产生变化的数据

inotifywait

data=/data/oldboy01.txt

data=/data/oldboy02.txt

 

#!/bin/bash

inotifywait /data -mrq --format '%w%f' -e "modify,close_write,move,create,delete"|\

while read line  

do

   rsync -avz --delete /data/  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password            #将数据进行推送

done

 

问题:

01. 脚本执行,有可能停不下来

crtl+z ---> 暂停脚本

 

如何停止脚本进程

          kill -9       ---强制停止脚本

          kill 进程     --- 停止进程

          killall 进程名 --- 停止进程,进程停止后会有提示

          pkill 进程名  --- 停止进程,模糊的杀手(sh),进程停止后没有提示

       fg           ---将进程放入前台

 

02. 脚本运行,远程关闭,脚本即停止

    sh inotify.sh &  --- 将脚本放入后台运行

   

1.9.4 利用sersync软件实现实时同步

1)sersync软件下载安装  --- 二进制(解压后直接使用) yum 编译 rpm 二进制

   官方资料:https://github.com/wsgzao/sersync

mkdir /server/tools

unzip sersync_installdir_64bit.zip

cd sersync_installdir_64bit/

mv sersync/ /usr/local/

2)编写sersync服务配置文件

cd /usr/local/sersync/conf

vim confxml.xml

<debug start="true"/>

       说明:将参数改为true,表示显示sersync程序执行过程

     6     <filter start="false">

   7         <exclude expression="(.*)\.svn"></exclude>

   8         <exclude expression="(.*)\.gz"></exclude>

   9         <exclude expression="^info/*"></exclude>

  10         <exclude expression="^static/*"></exclude>

  11     </filter>

      说明:排除指定信息不需要进行同步

 

  12     <inotify>

  13         <delete start="true"/>

  14         <createFolder start="true"/>

  15         <createFile start="false"/>

  16         <closeWrite start="true"/>

  17         <moveFrom start="true"/>

  18         <moveTo start="true"/>

  19         <attrib start="false"/>

  20         <modify start="false"/>

  21     </inotify>

    说明:指定监控事件信息

 

   24         <localpath watch="/opt/tongbu">

  25             <remote ip="127.0.0.1" name="tongbu1"/>

  26             <!--<remote ip="192.168.8.39" name="tongbu"/>-->

  27             <!--<remote ip="192.168.8.40" name="tongbu"/>-->

  28         </localpath>

  29         <rsync>

  30             <commonParams params="-artuz"/>

  31             <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>

  32             <userDefinedPort start="false" port="874"/><!-- port=874 -->

  33             <timeout start="false" time="100"/><!-- timeout=100 -->

  

3) sersync服务如何启动 

cd /usr/local/sersync/bin/

chmod a+x sersync

/usr/local/sersync/bin/sersync -help (-help --help -h --h man sersync)

 

sersync -dro  /usr/local/sersync/conf/confxml.xml

参数信息:

-d(daemon)  --- 让服务以守护进程方式运行

-r             --- 递归复制同步数据

-o             --- 读取加载指定同步文件

-o 配置文件(confxml.xml)  --- watch "/data"  --- /usr/local/sersync/conf/confxml.xml

-o 配置文件(confxml01.xml)--- watch "/data01"--- /usr/local/sersync/conf/confxml01.xml

  

     

1.9.5 inotify服务优化说明

在/proc/sys/fs/inotify/目录下有三个文件,对inotify机制有一定的限制

max_queued_events:   设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)

327679

max_user_instances: 设置每个用户可以运行inotifywait或inotifywatch命令进程数

128                 

max_user_watches:     设置inotify实例事件(event)队列可容纳的事件数量

root ---/data   oldboy01.txt  --- create事件

root ---/data   oldboy02.txt  --- create事件    -- 内存

oldboy ---/data   oldboy03.txt  --- delete事件  -- 内存

50000000

   

秒杀 -- 队列机制 -- 并发量  10万  开发人员解决并发问题

    01. 处理

    02. 请求 --- 内存 --- 处理

  03.      

 

1.10 网站服务原理/名词

1.10.1 用户访问网站的原理过程:

00. 用户输入域名点击回车

01. 完成域名DNS解析过程      DNS原理

02. 完成TCP三次握手建立

03. 向网站服务器访问请求信息(HTTP请求)

   网站架构接收用户请求    (负载均衡 web集群 存储 数据库 缓存...)

04. 向客户端响应数据信息    (HTTP响应)

05. 用户利用浏览器解析响应信息,显示最终页面

06. 完成TCP四次挥手过程

1.10.2 用户访问网站HTTP协议原理

什么是HTTP:超文本传输协议

 

HTTP协议请求:报文结构  4个部分

    1)请求行:    标题       1行

       请求方法:get(获取) post(提交)

       请求内容:默认index.html(首页文件)

       协议版本:HTTP1.0  HTTP1.1  HTTP2.0(高并发访问效率更高)

       TCP协议长连接和短连接概念:

         短连接:一次连接 一次请求  (HTTP1.0)

         长连接:一次连接 多次请求   (HTTP2.0)

 

    2)请求头:    中心思想   多行

       请求主机信息: 根据请求主机信息显示不同页面  www bbs blog

       请求user-agent信息:打开手机---腾讯浏览器APP---设置---浏览器UA:iphone

    3)空行       

    4)请求主体:  详细说明内容  多行

       使用get方法:没有请求主体

       使用post方法:产生请求主体(提交的信息 用户注册信息  用户登录信息) ???

  

HTTP协议响应:报文结构  4个部分

    1)响应行:

       响应状态码:响应结果  面试题

       200 OK    --- 正常结果信息

       301       --- 跳转 永久跳转  

       302       --- 跳转 临时跳转

       401       --- 认证失败了

       403       --- 用户禁止访问 爬虫  iptables

                 --- 网站首页文件不存在

       404       --- 你访问的页面不存在

                     网站服务端会进行优雅显示

       5xx       --- 网站架构服务有关    

    2)响应头部:

       响应的服务程序:web服务程序名称  nginx/tenginx/bfe/apache 

    3)空行

    4)响应主体:

       请求响应过来的代码信息:html代码信息

 

1.10.3 HTTP协议资源   url/uri

媒体资源类型:mime.types 媒体资源类型文件

媒体资源类型文件中有的信息:会直接解析,显示页面

媒体资源类型文件没有的信息:会进行下载,不会解析

 

 

访问网站地址类型:url/uri

www.oldboy.com      /oldboy.jj

    url                 uri       

 

url: 全称为Uniform Resource Location,中文翻译为统一资源定位符,也被称为网页地址

 

uri: 全称为Uniform Resource Identifier,中文翻译为统一资源标识符,是一个用于标识某一互联网资源名称的字符串  

1.10.4 访问资源分类:静态/动态/伪静态

1.静态资源: 所见即所得  见到的代码是什么样,浏览器解析就会解析成什么页面

1) 访问资源uri扩展名信息

每个页面都有一个固定的URL地址,且URI一般以.html、.htm、.shtml等常见形式为后缀,而且地址中不含有问号“?”或“&”等特殊符号。

 

2) 网页内容一经发布到网站服务器上,无论是否有用户访问,每个网页的内容都是保存在网站服务器文件系统上的,也就是说,静态网页是实实在在保存在服务器上的文件实体,每个网页都是一个独立的文件

 

*3)  网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)。

 

4) 因为网页没有数据库的支持,所以在网站制作和维护方面的工作量较大,当网站信息量很大时完全依靠静态网页比较困难(缺点)。

 

5) 网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)。

 

*6)  网页程序在用户浏览器端解析,如IE浏览器,程序解析效率很高,由于服务器端不进行解析,并且不需要读取数据库,因此服务器端可以接受更多的并发访问。当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不做任何解析)。待客户端拿到数据后,在浏览器端解析并展现出来(优点)。

 

用户请求 --> web服务器 --> index.html  oldboy.html oldboy.jpg --> 用户

  

2.动态资源: 会调取数据库资源,显示页面信息

1) 网页扩展名后缀常见为:.asp、.aspx、.php、.js、.do、.cgi。※

 

*2)  网页一般以数据库技术为基础大大降低了网站维护的工作量。  

 

*3)  采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、投票、用户管理、订单处理、发博文等。

 

*4)  动态网页并不是独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并可能通过读取数据库来返回一个完整的网页内容

 

5) 动态网页中的“”在搜索引擎的收录方面存在一定的问题,搜索引擎一般不会从一个网站的数据库中访问全部网页,或者出于技术等方面的考虑,搜索蜘蛛一般不会去抓取网址中“?”后面的内容,因此在企业通过搜索引擎进行推广时,需要针对采用动态网页的网站做一定的技术处理(伪静态技术),以便适应搜索引擎的抓取要求

 

6)  动态资源需要和数据库进行交互,网页面显示效率较低

用户请求 ---  web服务器 --- oldboy.php  ---> php服务处理    --> 数据库  --- php --- web --- 用户

 

用户请求 ---  web服务器 --- oldboy.js   ---> tomcat服务处理 --> 数据库

     

3.伪静态资源:

1)有数据库支持,可以进行交互

2)便于被搜索引擎收录    

 

1.10.5 网站度量方式:面试题

IP:根据用户访问的源IP地址  awk数组  ELK---access.log(记录用户源IP地址(公网IP地址))

     参考数据值:192.168(南方 10万)  10.0.0(北方 1万)  彩票

 

PV: 页面访问量

    参考数据值:用户点击网站页面的数量

 

UV:记录独立用户访客数量

 

cookie: 钥匙  会员卡     网站给用户分配身份标识信息,保存在主机本地

 

session:锁头  会员登记表 网站产生的用户访问记录信息,保存在网站服务器中程序代码进行统计

 

度量数值参考:http://alexa.chinaz.com/alexa_more.aspx

  

1.10.6 企业网站常见web服务

官方参考:https://w3techs.com/technologies/overview/web_server/all

 

处理静态资源网站:

    nginx     web服务软件:

    apache    web服务软件:zabbix

    Tengine

 

处理动态资源网站

    php        web服务软件:

    tomcat

 

1.10.1 总结:

1)用户访问网站的原理过程

   1.DNS解析域名

   2.tcp三次握手

   3.http发送访问请求

   4.http发送响应请求

   5.浏览器看到页面信息

   6.tcp四次挥手

 

2)HTTP协议原理(报文结构)

   HTTP请求报文

   请求行(请求方法 协议版本) 请求头(请求主机 请求UA空行 请求主体(post方法 可以有请求主体)

  

HTTP响应报文

   响应行(响应状态码) 响应头空行响应主体

   401 403 404 500 501 502

 

3)HTTP资源信息

   url/uri

   媒体资源类型

   静态资源/动态资源/伪静态资源    

 

4)网站度量方法

   IP       ---用户访问的源IP(度量 awk数组 ELK 日志易/百度监控宝)

   PV      ---页面访问量(度量 ELK 日志易/百度监控宝)

   UV      ---独立用户访客数量(度量 日志易/百度监控宝)cookie session

   https://www.umeng.com

 

5)网站服务软件

   nginx  apache  php  tomcat

1.11 网站web服务(nginx)

1.11.1 nginx程序软件概念功能介绍

1.特点:

nginx因具有高并发(特别是静态资源)、占用系统资源少等特性

 

2.功能:nginx程序功能强大

1)可以满足web服务应用    apache  蓝汛

2)可以满足负载均衡应用     LVS Haproxy

3)可以满足缓存应用         Squid

    局限:无法处理动态资源请求

 

3.盗链概念:

      用户访问:           用户访问:                    

          |                    |                         

          |                    |                         

    网站A                  网站B                        

    www.oldboy.com         www.oldgirl.com              

    oldboy.jpg             index.html                     

    oldboy.avi             调用 www.oldboy.com/oldboy.jpg

 

4.网站服务apache vs nginx

    01. 从特点进行说明

    02. 从功能方面说明

    03. 从软件网络模型   网络编程 socket

select:apache 

          事件01: 宿舍管理员  找人---一个一个房间进行查找(遍历)

          事件02:幼儿园阿姨  负责看住小孩上厕所---一个一个进行确认

epoll: nginx

      事件01: 宿舍管理员  找人---查找名单册

      事件02:幼儿园阿姨  负责看住小孩上厕所---有感觉就站到教室圈里

 

1.11.2 nginx软件部署安装:

1.利用yum安装软件:

官方源安装:最新稳定版软件  目录结构信息(企业环境相符

其他源安装:稳定版软件        目录结构信息(企业环境不太相符) 

 

2.利用编译方式安装:自定义安装功能自定义程序安装的目录

第一步:解决软件依赖关系

第二步:进行软件配置过程  配置软件目录  指定软件功能

第三步:进行软件编译过程  翻译解释的过程 C-gcc python-python解释器

第四步:进行软件编译安装

 

采用官方源安装

第一个历程:修改yum

官方参考:http://nginx.org/en/linux_packages.html#RHEL-CentOS

 [root@web01 ~]# vim /etc/yum.repos.d/nginx.repo

[nginx-stable]

name=nginx stable repo

baseurl=http://nginx.org/packages/centos/$releasever/$basearch/

gpgcheck=1

enabled=1

gpgkey=https://nginx.org/keys/nginx_signing.key

 

第二个历程:清除yum缓存信息

yum clean all

 

第三个历程:yum安装软件

yum install -y nginx

 

采用其他源安装

直接yum安装软件

yum install -y nginx

 

编译安装软件

第一步:下载源码包

mkdir /server/tools -p

cd /server/tools

wget http://nginx.org/download/nginx-1.16.0.tar.gz

 

补充:解决软件依赖:

yum install -y pcre-devel

说明:pcre-perl兼容正则表达式

未安装报错信息:

./configure: error: the HTTP rewrite module requires the PCRE library.

You can either disable the module by using --without-http_rewrite_module

option, or install the PCRE library into the system, or build the PCRE library

statically from the source with nginx by using --with-pcre=<path> option.

 

yum install -y openssl-devel

说明:openssl-devel 实现支持HTTPs  需要有私钥 公钥(证书)

未安装报错信息:

./configure: error: SSL modules require the OpenSSL library.

You can either do not enable the modules, or install the OpenSSL library

into the system, or build the OpenSSL library statically from the source

with nginx by using --with-openssl=<path> option.

 

yum install -y gcc*

说明:gcc c语言的解释器(nginx -- c语言 python)

checking for OS

 + Linux 2.6.32-642.el6.x86_64 x86_64

checking for C compiler ... not found

./configure: error: C compiler cc is not found

 

第二步:解压源码包

tar xf nginx-1.16.0.tar.gz

第三步:软件编译配置过程

cd nginx-1.16.0/

 

useradd www -s /sbin/nologin -M

 

./configure  --prefix=/application/nginx-1.16.0  --user=www --group=www --with-http_ssl_module  --with-http_stub_status_module

 

--prefix=PATH            set installation prefix

                         指定软件程序安装目录(不需要创建)

 

--user=USER              set non-privileged user for worker processes

                          为worker进程设置一个非特权用户(必须存在)

 

--group=GROUP           set non-privileged group for worker processes

                          为worker进程设置一个非特权用户组(必须存在)

 

--with-http_ssl_module      enable ngx_http_ssl_module

                           启用HTTPS功能

 

--with-http_stub_status_module   enable ngx_http_stub_status_module

                                启动nginx状态监控功能

第四步:编译过程

make

第五步:编译安装

make install

第六步:程序目录创建软链接

ln -s /application/nginx-1.16.0/ /application/nginx

 

1.11.3 nginx程序目录结构信息

参见图

/etc/nginx/nginx.conf     --- 主配置文件

/etc/nginx/*cgi(通用接口)  --- nginx(无法处理动态请求)

-fast_cgi  - php

                              -uwsgi   - python

 

 

1.11.4 nginx程序配置文件说明

准备工作:

cp nginx.conf nginx.conf.default

grep -v "^$" nginx.conf.default >nginx.conf

 

cat /etc/nginx/nginx.conf

user  nginx;                                          --- 指定worker进程管理用户

worker_processes  1;                                  --- 指定worker进程的数量,建议调整数量=服务器CPU核心数(2倍)

error_log  /var/log/nginx/error.log warn;     --- 指定错误日志保存路径

pid        /var/run/nginx.pid;               --- 指定程序pid文件保存路径

events {

worker_connections  1024;                          --- worker进程连接数 调整按照2的倍数,服务总的连接数=worker_processes*worker_connections<系统打开文件数

}

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  ;  --- 定义访问日志存储路径

    sendfile        on;                      --- 和nginx优化有关

    #tcp_nopush     on;                    --- 和nginx优化有关

    keepalive_timeout  65;                   --- 连接超时时间  默认单位秒

   #gzip  on;                                --- 和nginx优化有关

    include /etc/nginx/conf.d/*.conf;            --- 加载conf.d下面的所有.conf扩展配置文件

    }

 

疑问解答:

01. nginx程序worker进程是什么?

master process:控制服务可以正常运行  老板

worker process:处理用户访问请求      员工

02. nginx配置文件结构

1)核心配置部分     main      区域

2)事件配置部分     event     区域    

3)网站配置部分     http      区域   ---指定网站功能参数

4)主机配置区域     server   区域     ---指定每个网站信息(域名站点目录首页文件

5)location配置区域               ---指定网站特殊功能      

准备工作:

grep  -Ev "^$|#" default.conf >www.conf

 

cat /etc/nginx/conf.d/www.conf

server {

    listen       80;                     --- 指定服务监听信息  默认监听端口信息

    server_name  www.oldmeng.com;        --- 指定网站域名信息

    location / {                                  --- 匹配不同uri,进行不同的配置

        root   /usr/share/nginx/html;         --- 指定站点目录路径

        index  index.html index.htm;         --- 指定首页文件信息

    }

    error_page   500 502 503 504  /oldboy,jpg; --- 优雅显示错误信息

    location = /oldboy.jpg {                    --- 匹配指定50x.html的uri

        root   /html;                         --- 指定站点目录

    }

}

 

实践配置:

#vim www.conf

server {

    listen       80;

    server_name  www.oldmeng.com;

    location / {

        root   /usr/share/nginx/html;

        index  index.html index.htm;

    }

    error_page   404 500 502 503 504  /oldboy.jpg;

    location = /oldboy.jpg {

        root   /html;

    }

}

创建目录和数据信息:

  mkdir /html  --- 放入oldboy.jpg图片

 

本地域名解析:

C:\Windows\System32\drivers\etc\hosts

 

1.11.5 运维网站代码上线流程:

第一个历程:编写修改配置文件

 

vim /etc/nginx/conf.d/www.conf

server {

   listen       80;

   server_name  www.oldmeng.com;

   location / {

       root   /html/www;

       index  index.html index.htm;

}

systemctl restart nginx

 

第二个历程:根据配置文件调整系统环境

  mkdir /html/www

  

第三个历程:将开发人员写的代码上传到站点目录 

开发人员-- gitlab(版本控制服务)-- 运维人员将代码包放入站点目录---解压

代码更新,要进行备份(回退还原使用)

 

第四个历程:确认域名解析

aliyun进行域名配置

 

第五个历程:修改调整数据库

SQL语句

  

第六个历程:访问网站进行测试

 

 

 

 

1.11.6 nginx程序企业应用方法:

如何搭建多个网站  www bbs blog

第一个历程:创建多个网站主机文件

[root@web01 conf.d]# cat www.conf bbs.conf blog.conf

server {

    listen       80;

    server_name  www.oldmeng.com;

    location / {

        root   /html/www;

        index  index.html index.htm;

    }

}

server {

    listen       80;

    server_name  bbs.oldmeng.com;

    location / {

        root   /html/bbs;

        index  index.html index.htm;

    }

}

server {

    listen       80;

    server_name  blog.oldmeng.com;

    location / {

        root   /html/blog;

        index  index.html index.htm;

    }

}

 

第二个历程:创建不同网站站点目录/创建网站页面信息index.html

[root@web01 conf.d]# for name in {www,bbs,blog};do echo "$name.oldboy.com" >/html/$name/index.html;done

[root@web01 conf.d]# for name in {www,bbs,blog};do cat /html/$name/index.html;done

www.oldmeng.com

bbs.oldmeng.com

blog.oldmeng.com

 

第三个历程:配置DNS解析信息

10.0.0.7  www.oldmeng.com  bbs.oldmeng.com blog.oldmeng.com

 

第四个历程:重启nginx程序

方法一:使用systemctl命令重启nginx程序

systemctl restart/reload nginx

方法二:利用nginx命令重启nginx程序

nginx

nginx -s reload

nginx -t 检查配置文件语法

 

如何确认语法没问题

01:每个指令参数编写正确/位置放置正确

02:每个区域信息需要有一对花括号

03:每个指令参数最后有分号结尾           

PS:以上两种方式不要混用

  

补充:网站页面异常排错思路:

01:检查DNS解析信息

02:检查HTTP请求信息 抓包

03:检查HTTP响应信息 抓包

  

如何访问网站页面

基于域名访问

基于端口访问

server {

    listen       8080;    --- 修改端口号

    server_name  www.oldmeng.com;

    location / {

        root   /html/www;

        index  index.html index.htm;

    }

}

  

访问原理:

01. 和指定IP地址建立连接  --- 10.0.0.7

02. 向指定端口发出请求    --- 8080

03. 找寻匹配80端口的主机信息

04. 匹配用户的请求主机信息

      将配置的第一个主机信息进行显示

 

基于地址访问

[root@web01 conf.d]# cat www.conf

server {

    listen       172.16.1.7:80;   --- 修改地址信息

    server_name  www.oldmeng.com;

    access_log  /var/log/nginx/access_oldboy.log  oldboy;

    location / {

        root   /html/www;

        index  index.html index.htm;

    }

}

PS:nginx程序涉及到IP地址的修改,都需要重启服务(不是平滑重启)

 

 

利用nginx显示网站目录索引

第一个历程:将首页文件进行删除

 

第二个历程:修改配置文件添加指令,建立目录索引

server {

    listen       80;

    server_name  www.oldmeng.com;

    access_log  /var/log/nginx/access_oldboy.log  oldboy;

    location / {

        root   /html/www;

        index  index.html index.htm;

        autoindex  on;     --- 当首页文件不存在,会显示站点目录索引结构信息

          charset    UTF-8;

    }

}

 

利用nginx实现安全访问控制

1.基于用户访问信息进行控制 /images  /av

/images   允许  oldboy.jpg

/av       禁止  oldboy.html

第一个历程:部署站点目录环境

mkdir  /html/www/{images,av}

 

第二个历程:编辑配置文件

[root@web01 conf.d]# cat www.conf

server {

    listen       80;

    server_name  www.oldmeng.com;

    access_log  /var/log/nginx/access_oldboy.log  oldboy;

  root   /html/www;   --- 全局配置

    location / {

        root   /html/www;   --- 局部配置

        index  index.html index.htm;

    }

    location /images {

        allow all;

        root   /html/www;

        index  oldboy.jpg index.html index.htm;

    }

    location /av {

        allow  10.0.0.1;

        deny all;

        root   /html/www;

    }

}

 

2.基于用户认证信息进行控制

 

第一个历程:创建密码文件信息

[root@web01 conf.d]# htpasswd -bc /etc/nginx/nginx.password oldboy oldboy123

Adding password for user oldboy

[root@web01 conf.d]# cat /etc/nginx/nginx.password

oldboy:$apr1$.RxGBSH0$ePH61Rs8PuAuhv9boxvYz0

 

第二个历程:编写主机配置文件

[root@web01 conf.d]# vim www.conf

server {

    listen       80;

    server_name  www.oldmeng.com;

    access_log  /var/log/nginx/access_oldboy.log  oldboy;

    auth_basic  "oldboy61";

    auth_basic_user_file /etc/nginx/nginx.password;

    location / {

        root   /html/www;

        index  index.html index.htm;

        autoindex  on;

        charset  UTF-8;

    }

}

     

PS: 500 Internal Server Error

01. 编写代码信息不正确

02. web范围文件权限有问题

 

用户浏览器 --- nginx(www(oldboy:oldboy123))--- nginx.password

  

利用nginx实现网站状态监控 

第一个历程:编写监控网站主机配置文件

[root@web01 conf.d]# cat stat.conf

server {

    listen       80;

    server_name  stat.oldmeng.com;

    location / {

        stub_status;

    }

}

 

页面监控信息:

   Active connections        --- 总的激活并发连接数

   accepts                 --- 总的接收连接数信息   

   handled                 --- 总的处理连接数信息

   requests                 --- 总的请求数量

   Reading:                 --- 读取请求报文数量  

   Writing:                  --- 回复响应报文数量

   Waiting:                  --- 等待队列

 

取出指定信息进行监控:

curl -H host:stat.oldboy.com 172.16.1.7 2>/dev/null|awk 'NR==3{print $1}'

curl -H host:stat.oldboy.com 172.16.1.7 -s|awk 'NR==3{print $1}'

1.11.7 nginx程序日志配置说明

错误日志:记录服务常见错误

   1. 服务运行错误信息

   2. 用户访问页面的错误

 

错误日志如何配置:

   error_log  /var/log/nginx/error.log warn(记录错误级别);

错误级别:

   debug     --- 调试级别    产生的日志信息最多

   info       --- 信息级别

   notice     --- 通知级别

   warn     --- 警告级别

   error      --- 错误级别 

   crit        --- 严重级别

   alert       --- 非常严重级别

   emerg    --- 灾难级别    产生的日志信息最少

  

  

访问日志:记录用户访问信息

   01. 记录用户访问网站什么信息

   02. 记录访问访问网站用户信息

  

访问日志如何配置:

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_oldboy.log  oldboy;

nginx默认变量:

   $remote_addr:       --- 访问网站客户端源IP地址

   $remote_user         --- 表示认证用户名称信息

   [$time_local]           --- 显示响应时间信息

   $request             --- 显示请求行信息

   $status               --- 显示状态码

   $body_bytes_sent     --- 回复数据大小(流量)信息 字节

   $http_referer           --- 盗链人地址信息/用于推广

   $http_user_agent      --- 显示用户访问网站客户端程序 (电脑 手机)

 

  

 

1.11.8 nginx程序区域模块 - location (匹配uri)

功能:匹配不同的uri信息,做出相应处理

 

Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }    语法结构    

                       匹配        uri  {执行什么动作}

        awk       '模式{动作}'

Default:   —

Context:server, location   --- 可以配置在什么区域中

 

=:      精确匹配                   = /oldboy   www.oldboy.com  /oldboy

~:      模糊匹配(区分大小写)

~*:  模糊匹配(不区分大小写)

^~:  优先匹配 不识别uri信息中正则符号

location如何应用:

    location = / {                   01

        return  301;

    }

    location / {                     05   默认匹配

        return  302;

    }

    location /documents/ {         04

        return  404;

    }

    location ^~ /images/ {          02

        return  502;

    }

    location ~* \.(gif|jpg|jpeg)$ {   03

        return  520;

    }

  

样例:测试 ~ 和 ~*

    location ~ /test/ {

        return  301;

    }

    location ~* /test/ {

        return  302;

    }

 

规范站点目录结构信息:

[root@web01 conf.d]# cat www.conf

server {

    listen       80;

    server_name  www.oldmeng.com;

    location ~* \.jpg$ {

        root  /html/www/jpg;

    }

    location ~* \.png$ {

        root /html/www/png;

    }

    location / {

        root  /html;

        index index.html;

    }

}

 

1.11.9 nginx程序重写功能 (rewrite url/uri/伪静态)

Syntax:    rewrite regex          replacement   [flag];

              正则信息匹配   修改成的信息   标记

Default: —

Context: server, location(推荐), if

 

last:                  跳转完毕,会在执行其他动作

break:              跳转完毕,不在执行其他动作

redirect             302  临时跳转   *****

permanent:         301  永久跳转

 

1). 跳转配置中last与break区别对比示例

server {

   listen            80;

   server_name       www.oldmeng.com;

   root              /html;

   location  ~ ^/break/ {

       rewrite  ^/break/  /test/  break;

   }

   location  ~ ^/last/  {

       rewrite  ^/last/  /test/  last;

   }

   location   /test/ {

       default_type   application/json;

       return 200 'ok';

   }

}

 

2临时跳转和永久跳转配置

server {

   listen            80;

   server_name       www.oldmeng.com;

   root              /html;

   location  ~ ^/oldboy {

     rewrite  ^(.*)$  https://www.etiantian.org redirect;

      rewrite  ^(.*)$  https://www.etiantian.org permanent;

     #return 301 http://bbs.etiantian.org;

      #return 302 http://bbs.etiantian.org;

   }

}

永久跳转记录跳转信息:  301

临时跳转不记录跳转信息:302

 

301永久:用户浏览器--请求信息->www.360buy.com -->301-->www.jd.com

           客户端                              服务端

        用户浏览器--请求信息->www.360buy.com->www.jd.com-->服务端

 

总结:在浏览器上记录跳转的缓存信息

          www.jd.com/oldboy.jpg   ---   

          www.jd.com/2017/    404

 

302临时:用户浏览器--请求信息->www.360buy.com -->302-->www.jd.com

           客户端                              服务端

        用户浏览器--请求信息->www.360buy.com -->302-->www.jjd.com

           客户端                              服务端

 

总结:在浏览器上不记录跳转的缓存信息

          www.jd.com/oldboy.jpg   --- www.jd.com/2018/

 

补充:实现地址跳转的方法

第一种:利用rewrite  正则匹配

第二种:利用retrun

1.11.10 常见跳转示例情况测试说明(测验练习)

练习1):用户访问/abc/1.html实际上真实访问是/ccc/bbb/2.html

#http://www.oldboy.com/abc/1.html ==> http://www.oldboy.com/ccc/bbb/2.html

第一历程:准备真实的访问路径

[root@web01 ~]# mkdir /html/www/ccc/bbb -p

[root@web01 ~]# echo "ccc_bbb_2" > /html/www/ccc/bbb/2.html

 

第二个历程:Nginx跳转配置

[root@web01 conf.d]# cat ccbb.conf

server {

    listen 80;

    server_name   www.oldmeng.com;

    location / {

        root /html/www;

        index index.html;

    }

    location /abc/ {

        rewrite (.*) /ccc/bbb/2.html redirect;

        #return 302 /ccc/bbb/2.html;

    }

}

 

第三个历程:重启Nginx服务

[root@web01 ~]# systemctl restart nginx

 

练习2):用户访问/2018/ccc/bbb/2.html实际上真实访问是/2019/ccc/bbb/2.html

#http://www.oldboy.com/2018/ccc/bbb/2.html ==> http://www.oldboy.com/2019/ccc/bbb/2.html

 

第一次访问网站:

http://www.oldboy.com/2018/ccc/bbb/2.html  --> 跳转

第二次访问网站:

http://www.oldboy.com/2019/ccc/bbb/2.html

  

第一个历程:准备真实的访问路径

[root@web01 ~]# mkdir /html/www/2019/ccc/bbb -p

[root@web01 ~]# echo "2019_ccc_bbb_2" > /html/www/2019/ccc/bbb/2.html

 

第二个历程:Nginx跳转配置

[root@web01 conf.d]# cat www.conf

server {

    listen 80;

  server_name  www.oldboy.com;

    location / {

        root /html/www;

        index index.html;

    }

    location /2018 {

        rewrite ^/2018/(.*)$ /2019/$1 redirect;   

    }

}

  

第三个历程:重启Nginx服务

[root@web01 ~]# systemctl restart nginx

 

练习3):用户访问/test目录下任何内容, 实际上真实访问是http://www.oldboy.com

    location /test {

        rewrite (.*) http://www.oldboy.com redirect;

    }

 

  

练习4):用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html

#http://www.oldboy.com/course-11-22-33.html ==> http://www.oldboy.com/course/11/22/33/course_33.html 

   

第一个历程 准备真实的访问路径

[root@web01 ~]# mkdir /html/www/course/11/22/33/ -p

[root@web01 ~]# echo "docs.etiantian.org" > /html/www/course/11/22/33/course_33.html

 

第二个历程 Nginx跳转配置

[root@web01 conf.d]# cat www.conf

server {

    listen 80;

  server_name  www.oldboy.com;

    root /html/www;

    index index.html;

    location / {

        #灵活rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;

        #固定rewrite ^/course-(.*)  /course/11/22/33/course_33.html redirect;

    }

}

 

第三个历程 重启Nginx服务

[root@web03 ~]# systemctl restart nginx

 

练习5):将http请求,跳转至https   ???

server {

    listen 80;

    server_name oldboy.com;

    rewrite ^(.*) https://$server_name$1 redirect;

    #return 302 https://$server_name$request_uri;    ???

}

server {

    listen 443;

    server_name oldboy.com;

    ssl on;

}

 

练习6):终极测验-a.访问oldboy.com/oldboy.jpg  --->  www.oldboy.com/oldboy.jpg   临时

第一个历程:准备环境

将oldboy.jpg --- 放入站点目录

 

第二个历程:编写配置文件:

server {

  listen      80;

  server_name www.oldboy.com;

     root  /html/www;

     index index.html;

     rewrite ^/(.*)  http://www.oldboy.com/$1  redirect;

}

 

 

第三个历程:配置DNS解析

10.0.0.7   oldboy.com  www.oldboy.com

 

 

练习7):终极测验-b.访问www.etiantian.org  --->  www.oldboy.com   永久 

第一个历程:准备环境

将oldboy.jpg --- 放入站点目录

 

第二个历程:编写配置文件:

server {

  listen      80;

  server_name www.oldboy.com;

     root  /html/www;

     index index.html;

     if ($host ~ www.etiantian.org) {

        rewrite ^/(.*)  http://www.oldboy.com/$1  redirect;

     }

}

 

第三个历程:主配置文件编写

include /etc/nginx/conf.d/www.conf

include /etc/nginx/conf.d/*.conf;

 

第四个历程:配置DNS解析

10.0.0.7   oldboy.com  www.oldboy.com

 

练习8):打破循环问题:

第一种方式:多个server配置

server {

  listen   80;

  server_name  oldboy.com;

  rewrite ^/(.*)  http://www.oldboy.com/$1  redirect;

}

server {

  listen      80;

  server_name www.oldboy.com;

  root  /html/www;

  index index.html;

}

第二种方式:打破循环 if 内置变量

server {

  listen      80;

  server_name www.oldboy.com;

     root  /html/www;

     index index.html;

     if ($host ~ ^oldboy.com) {

        rewrite ^/(.*)  http://www.oldboy.com/$1  redirect;

     }   

}

1.11.11 nginx常用内置变量:

$host                     记录请求报文请求主体的host信息    

$server_name        当前用户配置server_name的域名信息

$request_filename     当前请求的文件路径名网站的主目录/html/www/images/test.jpg

$request_uri            当前请求的文件路径名不带网站的主目录/images/test.jpg

$scheme               用的协议,比如http或者https

 

nginx默认变量:

   $remote_addr:       --- 访问网站客户端源IP地址

   $remote_user         --- 表示认证用户名称信息

   [$time_local]           --- 显示响应时间信息

   $request             --- 显示请求行信息

   $status               --- 显示状态码

   $body_bytes_sent     --- 回复数据大小(流量)信息 字节

   $http_referer           --- 盗链人地址信息/用于推广

   $http_user_agent      --- 显示用户访问网站客户端程序 (电脑 手机)

 

 

1.12 LNMP架构 (网站web服务)

L linux系统:    防火墙/selinux关闭  chmod 1777 /tmp

N nginx程序:

M mysql程序:  mariadb    yum安装

P php程序:    编译安装    yum安装 7.1

 

 

1.12.1 安装部署LNMP架构

01.Linux系统进行安装( 防火墙关闭 selinux关闭 /tmp目录权限为1777)

 

02.Nginx服务程序安装( 利用yum官方源方式进行安装)

 

03.MySQL数据库服务安装

什么是数据库:

    将文本信息  === 转换为表格信息进行存储 (execl)

 

MySQL数据库服务安装方法:

    01. 利用yum进行安装软件*

    02. 利用编译方式安装软件

    03. 利用二进制包方式安装

 

mariadb安装过程:

 

第一个历程:yum安装数据库

  yum install mariadb-server mariadb -y

  

第二个历程:启动数据库服务

systemctl start mariadb.service

systemctl enable mariadb.service

  

第三历程:设置数据库服务登录密码

mysqladmin password oldboy123

mysql -uroot -poldboy123

 

简单SQL语句介绍

show databases;     --- 查看数据库服务中有哪些数据库信息

use mysql;          --- 切换数据库,到指定数据库中

show tables;        --- 查看指定数据库中的所有表信息

 

 

04.php部署安装过程:

 

第一个历程:移除其他版本php软件,解决PHP软件冲突

yum remove php-mysql php php-fpm php-common

  

第二个历程:更新yum源信息,用户安装php程序

 

# 准备yum安装软件扩展源信息

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

  

第三个历程:yum安装php服务相关软件

yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded  php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache  php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

php71w         --- 主程序软件

php71w-gd      --- 和显示图形相关的软件

php71w-mcrypt  --- 和数据传输加密相关

php71w-pdo     --- 让php和数据库建立联系

php71w-fpm     ---

 

重要文件和目录信息:

/etc/php-fpm.conf    ---php-fpm进程的配置文件

/etc/php-fpm.d       ---php-fpm进程加载配置文件的目录

/etc/php-fpm.d/www.conf

user = oldboy   --- 利用指定用户管理php工作进程,建议配置和nginx服务相同的用户

group = oldboy       --- 利用指定用户组管理php工作进程

listen = 127.0.0.1:9000   --- 指定php服务运行后, 监听的地址和端口信息

listen.allowed_clients = 127.0.0.1 --- 只允许本地访问php 9000端口服务

  

1.12.2 综合架构网站LNMP原理

    参见画图

1.12.3 综合架构网站LNMP配置应用

第一个历程:nginx + php   建立关系

 

vim /etc/nginx/conf.d/blog.conf

server {

  listen   80;

  server_name   www.etiantian.org;

  location / {

        root   /www;

        index  index.php index.html;

  }

  location ~ \.php$ {

        root /www;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_pass  127.0.0.1:9000;

        include fastcgi_params;

  }

}

说明:利用nginx的location区块实现动态请求与静态请求的分别处理

  

编写测试文件:

  echo '<?php phpinfo(); ?>'  >/application/nginx/html/blog/test_info.php

测试站点

curl  http://blog.etiantian.org/index.html       <-- 静态请求站点文件信息测试    

curl  http://blog.etiantian.org/test_info.php     <-- 动态请求站点文件信息测试

说明:当php服务停止时,9000端口信息消失,即停止PHP错误报502错误

 

linux系统测试完毕后,建议利用浏览器进行最终测试,测试效果更明显些

 

第二个历程:php   + mariadb  建立关系  代码信息

 

vim test_mysql.php

<?php

 $servername = "localhost";

 $username = "root";

 $password = "oldboy123";

 //$link_id=mysql_connect('主机名','用户','密码');

 //mysql -u用户 -p密码 -h 主机

 $conn = mysqli_connect($servername, $username, $password);

 if ($conn) {

       echo "mysql successful by root !\n";

    }else{

       die("Connection failed: " . mysqli_connect_error());

    }

?>

  

数据库存储数据:      字符串信息

存储服务器存储数据:  文件(图片 压缩包 文档 视频 音频)

  

设置数据库登录密码:

mysqladmin -u root password "oldboy123"

测试数据库登录密码:

mysql -u root -poldboy123

  

总结数据库常用SQL

==========================================================

 

 

create database oldboy;

创建新的数据库

show databases;

查看所有数据库信息

use  oldboy;

切换数据库

show tables;

查看指定数据库中表的信息

select * from oldboy.user

查看指定表中数据信息

show databases;

 

create database wordpress;

 

grant all on wordpress.* to 'wordpress'@'localhost' identified by 'oldboy123';

 

select user,host from mysql.user;

 

drop user ""@"localhost";

清理无用的用户及库

drop database oldboy;

删除无用数据库

use wordpress;

 

show databases;

 

quit

退出数据库

==========================================================

  

1.12.4 综合架构网站代码上线配置

博客网站代码:   

wordpress  https://cn.wordpress.org/download/

 

首页网站代码:

dedecms    http://www.dedecms.com/products/dedecms/downloads/

 

论坛网站代码:

discuz     http://www.discuz.net/thread-3796882-1-1.html

 

知乎网站代码:

wecenter   http://www.wecenter.com/downloads/

 

视频网站代码

  

  

博客网站如何部署代码,显示博客页面:

 

第一个历程:下载代码程序 上传服务器进行解压

修改目录权限

chown -R www.www blog

  

第二个历程:访问blog页面

 

创建新的数据库:      

create database wordpress;

创建数据库管理用户: 

grant all on wordpress.* to 'wordpress'@'localhost' identified by 'oldboy123';

select user,host from mysql.user;

 

第三个历程:修改php进程用户

  vim /etc/php-fpm.d/www.conf

  user = www

  group = www

  systemctl restart php-fpm

 

1.12.5 数据库如何进行数据迁移

第一个历程:数据备份

mysqldump  

    -A, --all-databases   整个数据全部进行备份

mysqldump -uroot -poldboy123 --all-databases > /tmp/mysql_bak.sql

  

第二个历程:将数据进行迁移

  rsync -avz /tmp/mysql_bak.sql 172.16.1.51:/tmp

  

第三个历程:恢复备份数据,并修改配置信息

  mysql -uroot -poldboy123 < /tmp/mysql_bak.sql

show databases;

select user,host from mysql.user;

  grant all on wordpress.* to 'wordpress'@'172.16.1.%' identified by 'oldboy123';

 

第四个历程:将web01服务器上数据库服务进行关闭

  

补充:

 

异常问题1:建立数据库连接时出错(排查)

第一历程:利用命令是否可以连接

mysql -uwordpress -poldboy123 -h 172.16.1.51

第二历程:检查网站代码文件配置

  vim /html/blog/wp-config.php

    /** MySQL主机 */

    define('DB_HOST', '172.16.1.51');

  

异常问题2:博客网站域名更新 http://blog.oldboy.com/ -- blog.oldboyedu.com

第一个历程:修改网站后台配置---修改数据库信息

   设置--常规--WordPress地址(URL)/站点地址(URL

 

第二个历程:修改配置文件信息

   修改配置文件  server_name   xxxx

   重启服务

第三个历程:修改域名解析信息

  

   1) HTML5 静态页面

   2) CSS   页面样式

   3) js    页面特殊效果

  

  

1.12.6 实现将用户上传的数据保存到NFS服务器中

第一个历程:获悉数据用户上传数据保存的位置

方法一:查看图片链接地址信息

  /html/blog/wp-content/uploads/   2019/07/oldboy-200x300.jpg

 

方法二:利用find命令查询最新上传的数据

  find /html/blog -type f -name "*.jpg" -mmin -1

 

方法三:利用inotify监控目录数据信息变化

  inotifywait -mrq /html/blog

 

方法四:查看访问日志

  /wp-content/uploads/2019/07/xxzhu-300x188.png

  

第二个历程:将目录中已有数据进行保存备份

  mkdir /tmp/nfs_bak/

  mv /html/blog/wp-content/uploads/*   /tmp/nfs_bak/

  

第三个历程:实现挂载操作

  mount -t nfs 172.16.1.31:/data /html/blog/wp-content/uploads/

PS:可以实现开机自动挂载

  

第四个历程:将备份的数据进行恢复

  cp /tmp/nfs_bak/*  /html/blog/wp-content/uploads/

  

第五个历程:上传数据进行测试

修改nfs相关权限:

创建存储目录管理用户   www

useradd -u 1003 www -s /sbin/nologin -M

修改共享存储目录权限  

chown -R www.www /data

修改配置文件权限信息  

vim /etc/exports ---

(rw,sync,anonuid=1001,anongid=1001)

  

 

 

1.13 负载均衡

 

1.13.1 负载均衡反向代理概念:

负载均衡:2点作用

1)实现访问请求进行调度处理  

2)实现访问压力负载分担

   

反向代理:nginx  外 -- 内

外网--用户访问网站(客户端)--->负载均衡设备(服务端)--->web服务器---内网

 

正向代理:内 -- 外 (FQ)

内网--服务器主机--->香港阿里云服务器--->谷歌网站--外网

 

集群概念完成相同工作的一组服务器

LB)负载均衡集群:多个web服务器,配置都是一模一样(站点目录代码配置  web服务配置文件)  web集群

   

HA)高可用集群: 多个负载均衡服务器  解决单点故障

    高性能运算集群:地质勘探

   

集群作用:

    1. 高性能(Performance)

    2. 价格有效性(Cost-effectiveness)

    3. 高可用性(Availability)

 

 

1.13.2 部署负载均衡服务

第一个历程:部署web服务集群 web01 web02 web03

1)同步web服务器配置文件  nginx.conf  conf.d/

 

2)同步web服务器站点目录  手动配置

mkdir -p /html/{www,bbs,blog}

for name in {www,bbs,blog};do echo "$(hostname -i) $name.oldboy.com" >/html/$name/oldboy.html;done

for name in {www,bbs,blog};do cat /html/$name/oldboy.html;done

 

3)利用负载均衡进行访问测试

for ip in {7,8,9};do curl -H host:www.oldboy.com 172.16.1.$ip/oldboy.html;done

for ip in {7,8,9};do curl -H host:bbs.oldboy.com 172.16.1.$ip/oldboy.html;done

for ip in {7,8,9};do curl -H host:blog.oldboy.com 172.16.1.$ip/oldboy.html;done

172.16.1.7 blog.oldboy.com

172.16.1.8 blog.oldboy.com

172.16.1.9 blog.oldboy.com

 

第二个历程:部署负载均衡服务器 lb01

安装负载均衡服务程序

yum install -y nginx

编写主配置文件

vim /etc/nginx/nginx.conf

 

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       /etc/nginx/mime.types;

    default_type  application/octet-stream;

    keepalive_timeout  0;

    upstream oldboy {              --- 指定负载均衡主机信息

        server  10.0.0.7:80;

        server  10.0.0.8:80;

        server  10.0.0.9:80;

    }

    server {

        listen        80;

        server_name   localhost;

    location / {

        proxy_pass http://oldboy;  --- 将请求反向代理发送给哪个集群

        }

    }

}

   

第三个历程:进行浏览器访问测试

DNS域名解析

10.0.0.5  www.oldboy.com  bbs.oldboy.com blog.oldboy.com

curl -H hosts:www.oldboy.com 10.0.0.5/oldboy.html

 

1.13.3 负载均衡模块详细说明

1)ngx_http_upstream_module

Syntax:   upstream name { ... }

Default:  —

Context: http

 

定义集群节点方式:

    server   172.16.1.7:80     --- 简单指定节点信息

    weight   权重            --- 按比例分配用户请求

 

实践配置:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream oldmeng {

         server  10.0.0.7:80 weight=3;

         server  10.0.0.8:80 weight=2;

         server  10.0.0.9:80 weight=1;

     }

     server {

         listen        80;

         server_name   localhost;

     location / {

         proxy_pass http://oldmeng;

         }

     }

}

 

健康检查参数:

max_fails=3            --- 最大尝试分配请求的最大次数

fail_timeout=30s        --- 多长时间之后再给一次新的机会

 

实践配置:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream oldmeng {

         server  10.0.0.7:80 max_fails=3 fail_timeout=30s;

         server  10.0.0.8:80;

         server  10.0.0.9:80;

     }

     server {

         listen        80;

         server_name   localhost;

     location / {

         proxy_pass http://oldmeng;

         }

     }

 

backup                       --- 类似于备胎 情侣备胎

实践配置:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream oldmeng {

         server  10.0.0.7:80;

         server  10.0.0.8:80;

         server  10.0.0.9:80 backup;

     }

     server {

         listen        80;

         server_name   localhost;

     location / {

         proxy_pass http://oldmeng;

         }

     }

}

定义集群调度算法:

    rr           --- 轮询算法

    wrr         --- 权重轮询算法

    ip_hash     --- 根据hash分配资源   缺陷:会造成负载不均

    least_conn --- 根据后端连接数,越少越有可能获得负载均衡分配的请求

  

提升用户访问网站体验:

Syntax:   proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;

Default: proxy_next_upstream error timeout;

Context: http, server, location

实践配置:

location / {

    proxy_pass http://oldboy;

    proxy_next_upstream error timeout http_404;

    }

}

 

2)ngx_http_proxy_module

Syntax:   proxy_pass URL;   将指令发送给指定集群

Default:  —

Context: location, if in location, limit_except

 

  

Syntax:   proxy_set_header field value;      --- 修改请求头信息

Default:  proxy_set_header Host $proxy_host;

            proxy_set_header Connection close;

Context: http, server, location

  

作用01:修改请求头host;显示不同网站页面

location / {

    proxy_pass http://oldboy;

    proxy_set_header  Host $host;

    }

}

  

作用02:在请求头中添加信息, 在日志显示客户端真实IP地址  awk

$http_x_forwarded_for    ---记录用户真实IP地址

location / {

    proxy_pass http://oldboy;

    proxy_next_upstream error timeout http_404;

    proxy_set_header  Host $host;

    proxy_set_header  X-Forwarded-For  $remote_addr;

    }

}

  

1.13.4 负载均衡反向代理企业应用

实现动静分离

部署规划:

upload集群  10.0.0.7  /html/www/upload/index.html  upload  web01

static集群   10.0.0.8  /html/www/static/index.html   static   web02

default集群  10.0.0.9  /html/www/index.html        default  web03

  

第一个历程:准备web节点环境

  #web01 

  mkdir /html/www/upload/

  echo "upload  web01" >/html/www/upload/index.html

  #web02

  mkdir /html/www/static/

  echo "static  web02" >/html/www/static/index.html

  #web03

  echo "default web03" >/html/www/index.html

  

第二个历程:修改lb负载均衡配置文件

worker_processes  1;

events {

    worker_connections  1024;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream upload {

        server  10.0.0.7:80;

    }

     upstream static {

        server  10.0.0.8:80;

    }

     upstream default {

        server  10.0.0.9:80;

    }

     server {

        listen        80;

        server_name   localhost;

     location / {

        proxy_pass http://default;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

     location /upload {

        proxy_pass http://upload;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

     location /static {

        proxy_pass http://static;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

    }

}

实现不同访问客户端,显示不同页面

部署规划:

 

客户端 手机 iphone----mobile集群----10.0.0.7----/html/www/index.html---手机用户访问页面

 

客户端 电脑 IE    ----IE集群     ----10.0.0.8----/html/www/index.html--- IE用户访问页面

 

客户端 电脑 其他  ----default集群 ----10.0.0.9----/html/www/index.html---默认用户访问页面 

  

第一个历程:按照规划部署web服务器

#web01

echo "手机用户访问页面" >/html/www/index.html

#web02

echo "IE用户访问页面" >/html/www/index.html

#web03

echo "默认用户访问页面" >/html/www/index.html

  

第二个历程:编写负载均衡配置文件

worker_processes  1;

events {

    worker_connections  1024;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream mobile {

        server  10.0.0.7:80;

     }

     upstream IE {

        server  10.0.0.8:80;

     }

     upstream default {

        server  10.0.0.9:80;

     } 

     server {

        listen        80;

        server_name   localhost;

     location / {

        if ($http_user_agent ~* iphone) {

           proxy_pass http://mobile;

        }

        if ($http_user_agent ~* IE) {

           proxy_pass http://IE;

        }

        proxy_pass http://default;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

     }

}

    

排错思路:

01. 测试每台节点是否正常

02. 检查负载均衡配置文件

    03. 网站域名解析配置是否正确

 

1.13.5 负载均衡反向代理总结:

1.负载均衡反向代理概念

   负载均衡  反向代理  集群(LB HA

 

2.负载均衡反向代理部署  *****

   部署nginx软件

   1)upstream   模块  功能参数(server max_fails timeout backup调度算法(rr weight ip_hash)

   2)proxy_pass 模块  功能指令 proxy_set_header  proxy_next_upstream

 

3.负载均衡企业应用案例

   1)实现架构动静分离  

   2)根据用户访问客户端,显示不同页面

 

 

1.14 高可用服务

 

1.14.1 高可用服务概念说明

解决服务器单点问题:

    利用高可用解决主备问题  解决主备切换问题

  

1.14.2 高可用服务如何实现

物理硬件:网络设备

软件程序:keepalived软件程序 

实现高可用原理  vrrp协议虚拟冗余路由协议  ****** 

   

keepalived程序服务是什么?

 

作用:

    1)配合LVS使用

    2)实现高可用功能

 

1.14.3 高可用服务部署流程:

第一个历程:环境准备

web集群     OK

lb-HA集群    OK

 

第二个历程:高可用服务部署安装 lb01 lb02

yum install -y keepalived

 

第三个历程:编写高可用服务配置文件

lb01 

  vim /etc/keepalived/keepalived.conf

3个部分

    1. 全局配置部分 

    2. VRRP参数配置

global_defs {

   notification_email {      --- 当高可用服务出现切换时,发送邮件通知

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from      douglas123456@163.com

   smtp_server smtp.163.com      --- 利用什么企业邮箱发送

   smtp_connect_timeout 30

   router_id lb01           --- HA集群 lb01,lb02 (***) HA集群 nfs01, nfs02

}

 

vrrp_instance oldboy {       --- 家族名称

    state MASTER             --- 家族身份标识 (MASTER(1) BACKUP(n)) 注释说明  (***)

    interface eth0           --- 指定vip地址出现在哪个外网网卡

    virtual_router_id 61      --- 家族标识

    priority 150             --- 优先级 优先级越高越有可能成为主(***)

    advert_int 5            --- 主发送组播包间隔时间

    authentication {        --- 认证口令

        auth_type PASS          

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3              --- 生成VIP地址信息

    }

}

 

lb01

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id lb01

}

vrrp_instance oldmeng {

    state MASTER

    interface eth0

    virtual_router_id 61

    priority 150

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3

    }

}

  

lb02

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id lb02

}

vrrp_instance oldboy {

    state BACKUP

    interface eth0

    virtual_router_id 61

    priority 100

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

 

    virtual_ipaddress {

        10.0.0.3

    }

}

  

高可用服务访问问题: 10.0.0.3

排查:

01. 检查负载均衡服务是否有问题 lb01 lb02 -- nginx

nginx服务没有正常启动  nginx服务配置有问题

curl -H host:www.oldboy.com 10.0.0.3/oldboy.html

02. 检查负载均衡节点是否有问题

curl -H host:www.oldboy.com 10.0.0.7/oldboy.html

curl -H host:www.oldboy.com 10.0.0.8/oldboy.html

curl -H host:www.oldboy.com 10.0.0.9/oldboy.html

03. 检查确认高可用服务是否有问题

  curl -H host:www.oldboy.com 10.0.0.5/oldboy.html

  curl -H host:www.oldboy.com 10.0.0.6/oldboy.html

确认服务配置文件  确认服务是否开启

检查keepalived服务日志:tail -f /var/log/messages

     

  

1.14.4 高可用服务异常问题

问题一:脑裂

出现的原因:备收不到组播包          解决思路

    1. 组播包通讯的线路出现问题       多根线路

    2. 软件安全程序阻止组播包发送     监控  报警

    3. 高可用服务配置问题            监控  报警

  

如何配置监控脚本

   思路:

   lb02上是否有 vip地址

1. 进行主备切换  

      2. 出现脑裂问题

  

lb02

cat >>/server/scripts/check_keepalived.sh<<EOF

#!/bin/bash

ip a|grep 10.0.0.3 &>/dev/null

if [ $? -eq 0 ]

then

   echo "高可用服务出现问题"|mail -s "error"  360471956@qq.com

fi       

EOF

 

[root@lb02 /etc/nginx]# vim /server/scripts/check_keepalived.sh

#!/bin/bash

ip a|grep 10.0.0.3 &>/dev/null

if [ $? -eq 0 ]

then

   echo "高可用服务出现问题"|mail -s "error"  360471956@qq.com

fi

vim /etx/mail.rc

set from=douglas123456@163.com smtp=smtp.163.com

set smtp-auth-user=douglas123456@163.com smtp-auth-password=mengwei702717952 smtp-auth=login

  

  systemctl restart postfix.service

 

问题二:nginx代理服务停止,不能实现高可用服务自动切换

nginx服务停止  keepalived也没有存在的价值

lb01

mkdir /server/scripts -p

cat >>/server/scripts/check_web.sh<<EOF

#!/bin/bash

 

Nginx_Num=$(ps -ef|grep -c [n]ginx)

if [ $Nginx_Num -lt 2 ]

then

   systemctl stop keepalived

   echo "$(date +%F_%T) nginx服务出现问题,keepalived服务停止" >>/var/log/keepalived.log

fi

EOF

 

[root@lb01 ~]# vim /server/scripts/check_web.sh

#!/bin/bash

 

Nginx_Num=$(ps -ef|grep -c [n]ginx)

if [ $Nginx_Num -lt 2 ]

then

   systemctl stop keepalived

   echo "$(date +%F_%T) nginx服务出现问题,keepalived服务停止" >>/var/log/keepalived.log

fi

 if判断:

-eq  相等    -ne    不等    -gt    大于   -ge     大于等于   -lt       小于    -le     小于等于

cd /server/scripts/

chmod +x check_web.sh

 

编写keepalived配置文件

! Configuration File for keepalived

 

global_defs {

   router_id lb01

}

vrrp_script check_web {

   script "/server/scripts/check_web.sh"===>定义keepalived服务要监控运行脚本(执                                                                      行权限)

   interval 2           ===>间隔时间

   weight 2

}

vrrp_instance oldmeng {

    state MASTER

    interface eth0

    virtual_router_id 61

    priority 150

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3

    }

    track_script {

       check_web===>  调用脚本

    }

}

 

1.14.5 高可用服务安全配置

大型网站公司:

网络安全配置,会做到不会让外网用户可以直接得知架构服务器的地址信息

 

配置nginx lb01 lb02 文件

     server {

         listen        10.0.0.3:80;

         server_name   www.oldmeng.com;

     location / {

        proxy_pass http://oldmeng;

        proxy_next_upstream error timeout http_404;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

配置文件配置完成,需要重启nginx服务,不能平滑重启

  

如何监听主机网卡上没有的地址:

修改内核信息:

   解决方法:

echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf

sysctl -p

  

1.14.6 高可用服务双主配置

第一个历程: 修改高可用服务配置文件

lb01

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id lb01

}

vrrp_script check_web {

   script "/server/scripts/check_web.sh"

   interval 2

   weight -60

}

vrrp_instance oldmeng {

    state MASTER

    interface eth0

    virtual_router_id 61

    priority 150

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3

    }

    track_script {

       check_web

    }

    }

vrrp_instance oldwei {

    state BACKUP

    interface eth0

    virtual_router_id 62

    priority 100

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.4

    }

  

}

重启服务

systemctl restart keepalived.service

lb02

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id lb02

}

vrrp_script check_web {

   script "/server/scripts/check_web.sh"

   interval 2

   weight -60

}

vrrp_instance oldmeng {

    state BACKUP

    interface eth0

    virtual_router_id 61

    priority 100

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3

    }

    }

vrrp_instance oldwei {

    state MASTER

    interface eth0

    virtual_router_id 62

    priority 150

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.4

    }

    track_script {

       check_web

    }

}

重启服务

  systemctl restart keepalived.service

重启keepalived服务,检查双主配置

    lb01:inet 10.0.0.3/32 scope global eth0

    lb02:inet 10.0.0.4/32 scope global eth0

 

第二个历程: 修改负载均衡配置文件

lb01

vim /etc/nginx/nginx.conf

user  www;

worker_processes  2;

error_log  /var/log/nginx/error.log warn;

pid        /var/run/nginx.pid;

events {

    worker_connections  2048;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream oldmeng {

         server  10.0.0.7:80;

         server  10.0.0.8:80;

         server  10.0.0.9:80;

     }

 

     server {

         listen        10.0.0.3:80;

         server_name   www.oldmeng.com;

     location / {

        proxy_pass http://oldmeng;

        proxy_next_upstream error timeout http_404;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

    }

     server {

         listen        10.0.0.4:80;

         server_name   bbs.oldmeng.com;

     location / {

        proxy_pass http://oldmeng;

        proxy_next_upstream error timeout http_404;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

    }

}

重启服务

  systemctl restart nginx

 

lb02

vim /etc/nginx/nginx.conf

user  www;

worker_processes  2;

error_log  /var/log/nginx/error.log warn;

pid        /var/run/nginx.pid;

events {

    worker_connections  2048;

}

http {

     include       /etc/nginx/mime.types;

     default_type  application/octet-stream;

     keepalive_timeout  0;

     upstream oldmeng {

         server  10.0.0.7:80;

         server  10.0.0.8:80;

         server  10.0.0.9:80;

     }

     server {

         listen        10.0.0.3:80;

         server_name   www.oldmeng.com;

     location / {

        proxy_pass http://oldmeng;

        proxy_next_upstream error timeout http_404;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

    }

     server {

         listen        10.0.0.4:80;

         server_name   bbs.oldmeng.com;

     location / {

        proxy_pass http://oldmeng;

        proxy_next_upstream error timeout http_404;

        proxy_set_header  Host $host;

        proxy_set_header  X-Forwarded-For  $remote_addr;

        }

    }

}

重启服务

  systemctl restart nginx

 

第三个历程:修改DNS解析记录

10.0.0.3  www.oldboy.com 

10.0.0.4  bbs.oldboy.com

  

1.14.7 在keepalived配置文件中weight参数有什么用?

作用说明:利用weight参数修改优先级 

weight数值  正数   优先级+weight数值  求和运算   成为主

weight数值  负数   优先级-weight数值  求差运算   成为备

 

计算原理:判断监控的监控执行结果是真还是假

真==返回值=0

假==返回值<>0

 

情况逻辑一:权重值为正数

    脚本执行成功:最终优先级==优先级+weight

    脚本执行失败:最终优先级==优先级

   

情况逻辑二:权重值为负数

    脚本执行成功:最终优先级==优先级

    脚本执行失败:最终优先级==优先级-weight

 

1.14.8 监控nginx程序脚本:

1.监控nginx程序是否开启

2.如果关闭,让程序的返回值为非0

if [ $nginx_num -lt 2 ]   条件不满足  程序开

then

   exit 0  / exit 1

fi

  

脚本           主 / 备

脚本执行结果: 真0 假 非0

 

目标:主服务 nginx程序坏了(主) 将keepalived主进行转移 降低优先级

方案:将原来优先级减少  优先级-weight

if [ $nginx_num -lt 2 ]

then

   exit 1

fi

目标:备服务 nginx程序坏了(主) 将keepalived主进行转移 提升优先级

方案:将原来优先级提升  优先级+weight

if [ $nginx_curl xxx ]   条件不满足  程序开

then

   exit 0

fi

监控nginx脚本:lb01作为主服务器  主nginx停止

    主服务器  nginx程序停止  权重值为负数   脚本返回值假不会0  求差运算降低优先级

   

备服务器  nginx程序停止  权重值为正数   脚本返回值真为0    求和运算提升优先级

 

 

1.15 HTTPS安全证书访问连接

 

1.15.1 网络安全涉及的问题:

 

①. 网络安全问题-数据机密性问题解决

   传输的数据可能会被第三方随时都能看到

a) 利用普通加密算法解决机密性

利用相应算法,对传输数据(明文数据)进行加密(密文数据);再利用对应算法,将加密数据解密变为真实数据

 

优点:实现了数据机密传输避免了明文传输数据的危险性

缺点:利用加密算法,将明文改密文,如果第三方获得加密算法,即可将传输密文再次变为明文

 

b)利用对称加密算法解决机密性

对称加密算法就好比将普通算法的规则手册放入到了保险柜里,只有获取保险柜和保险柜钥匙才能获取《算法手册》

   

优点:密钥加密算法计算速度非常快解决了普通加密算法的安全问题

    缺点:加解密过程的安全性完全依赖于密钥,并且对称加密密钥是公开的,当通讯加密对象过多时,无法解决密钥管理问题

   

    对称密钥对:      私钥--钥匙        公钥--锁头

    A 私钥 公钥        C 公钥         B 私钥 公钥

    ABCD--1234

    算法信息--公钥    算法信息--公钥    算法信息--公钥

 

②. 网络安全问题-数据完整性问题解决   VPN

    传输的数据不能随意让任何人进行修改

a) 利用单项加密算法(全网备份数据完整性)

根据数据生成特征码(数据指纹信息);接收数据方获取数据信息算出特征码验证是否与发送过来的特征码一致

    若特征码一致,表示数据完整性没被破坏;若特征码不一致,表示数据已被破坏,直接丢弃

 

****************************************************************************

扩展说明:

    01:不同数据的特征码(数据指纹信息)是不可能一致的

        单项加密算法特征:

          · 数据输入一样,特征码信息输出必然相同

       · 雪崩效应,输入的微小改变,将造成输出的巨大改变

        · 定长输出,无论源数据多大,但结果都是一样的

        · 不可逆的,无法根据数据指纹,还原出原来的数据信息。

****************************************************************************

优点:有效的解决了数据完整性问题

    缺点:没有考虑中间人攻击对数据信息的影响

 

b) 利用对称加密算法(加密特征码)

利用对称加密算法对数据加密的同时,也对特征码进行加密

    接收方拥有和发送方一样的密钥,才可以解密加密后的数据和特征码

中间人加密的特征码没有办法让接收方进行解密的,所以接收方获取不了特征码,直接丢弃数据

****************************************************************************

扩展说明:

    01:那么对称密钥如何有效的让通讯双方获取

       需要进行对称密钥协商过程,即通过密钥交换机制(Internet key exchange IKE)

          实现密钥交换机制的协议称为diffie-hellman协议

****************************************************************************           

 

③. 网络安全问题-身份验证问题解决

    第一次通讯时,需要确认通讯双方的身份正确

a)利用非对称密钥加密算法(公钥加密算法)

   发送方建立私钥和公钥,将公钥发送给接收方,从而实现发送数据方的身份验证

 

网络安全问题结论:实现网络安全性,需要解决问题的顺序为

1.解决身份验证问题

2. 解决数据完整性问题

3. 解决数据机密性问题

                

1.15.2 网络安全证书

网络安全证书由来:

确认证书是真实的证书CA证书颁发机构 (身份证--公安局)

根据上述结论可知,网络安全性最首先要解决的就是身份验证问题

解决身份验证问题,最主要的方式就是借助私钥和公钥

而最主要的公钥信息获取就变得尤为重要;利用第三方公正者,公正公钥信息

 

证书的类型(身份证件 20 护照 几百)

通配符DV型证书个人网站  --- 个人身份审核    ---   10分钟--24小时   免费

 

专业版OV型证书中小型企业--- 企业身份审核(基本)  --- 3-5个工作日   国内---几千国外---几百万美金

 

高级版EV型证书大型企业  --- 企业身份审核(全方位)--- 5-7个工作日   国内---几万国外---几百万美金

                  DV证书使用年限 1

                          OV证书使用年限 1年-2

                 EV证书使用年限 1年-3

           

使用证书注意事项:

1:确认证书可以支持几个网站实现HTTPS访问

   单个域名证书:www.oldboy.com  

   多个域名证书:www bbs blog

   通配符域名证书:*.oldboy.com

 

2: 证书是有年限,只能重新申请,不能续费

 

3:证书只支持二级域名,不支持三级域名挂载证书  www.etiantian.org  m.www.etiantian.org

 

1.15.3 网站单台服务器实现HTTPS访问

方法一:单台web服务器实现HTTPs访问

 

第一个历程: 检查网站环境是否满足

# nginx程序必须有支持证书功能的ssl模块

nginx -V

--with-http_ssl_module

# 创建存放ssl证书的路径

mkdir -p /etc/nginx/ssl_key

cd /etc/nginx/ssl_key

 

第二个历程:使用openssl命令充当CA权威机构创建私钥

PS生产不可能使用此方法生成证书,不被互联网CA权威承认的黑户证书 

openssl genrsa -idea -out server.key 2048 

 

第三个历程:生成自签证书,同时去掉私钥的密码

openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt

    req               --- 创建证书

    days              --- 指定证书有效期

    x509            --- 证书的格式信息

    -nodes -newkey  --- 去掉私钥文件密码信息

    -keyout          --- 加载私钥文件

    -out             --- 输出生成证书文件(假的)

  

第四个历程:证书申请完成后需要让nginx服务进行加载

# 是否开启证书功能

http_ssl_module

Syntax:         ssl on | off;

Default:  ssl off;

Context: http, server

  

# 加载ssl crt证书文件存放路径

Syntax:         ssl_certificate file;

Default:  —

Context: http, server

 

# 加载ssl key私钥文件存放路径

Syntax:       ssl_certificate_key file;

Default:  —

Context: http, server

 

# 实现基本的HTTPS访问效果

server {

   listen         443;

   server_name    ssl.oldboy.com;

   ssl on;

   ssl_certificate      ssl_key/server.crt;

   ssl_certificate_key ssl_key/server.key;

   location / {

       root   /html/ssl;

     index  index.html;

   }

}

 

# 实现HTTP到HTTPS跳转的访问效果

server {

   listen         80;

   server_name    ssl.oldboy.com;

   #rewrite   ^/(.*)  https://ssl.oldboy.com$1 redirect;

   http://ssl.oldboy.com/oldboy/oldboy.html  --> https://ssl.oldboy.com/oldboy/oldboy.html

      url^/                  (.*)uri

   return    302      https://$server_name$request_uri;

   http://ssl.oldboy.com /oldboy/oldboy.html -- 302 --- https://ssl.oldboy.com/oldboy/oldboy.html

}          $server_name   $request

server {

   listen         443;

   server_name    ssl.oldboy.com;

   ssl on;

   ssl_certificate      ssl_key/server.crt;

   ssl_certificate_key ssl_key/server.key;

   location / {

       root   /html/ssl;

     index  index.html;

   }

}

 

最终配置

[root@web01 conf.d]# vim ssl.conf

server {

   listen 80;

   server_name www.oldboy.com;

   return  302  https://$server_name$request_uri;

}

server {

  listen      443 ssl;

  server_name www.oldboy.com;

      #ssl on;

      ssl_certificate     /etc/nginx/ssl_key/server.crt;

      ssl_certificate_key /etc/nginx/ssl_key/server.key;

      location / {

     root  /html/www;

     index index.html;

    }

 }    

 

1.15.4 网站多台服务器实现HTTPS访问

user—>https-->lb-->https-->web 实现方式

 

第一个历程: 编写lb负载均衡配置文件

vim conf.d/ssl_proxy.conf

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;

keepalive_timeout  0;

upstream oldboy {

    server  10.0.0.7:443;

server {

   listen         80;

   server_name    www.oldboy.com;

   #rewrite   ^/(.*)  https://www.oldboy.com$1 redirect;

   return    302      https://$server_name$request_uri;

}

server {

    listen        10.0.0.3:443 ssl;

    server_name   www.oldboy.com;

    ssl_certificate     /etc/nginx/ssl_key/server.crt;

    ssl_certificate_key /etc/nginx/ssl_key/server.key;

location / {

    proxy_pass https://oldboy;

    proxy_set_header  Host $host;

    proxy_set_header  X-Forwarded-For  $remote_addr;

    }

}

 

第二个历程: 编写web后端服务器文件

server {

   listen         443 ssl;

   server_name    www.oldboy.com;

   ssl_certificate      ssl_key/server.crt;

   ssl_certificate_key ssl_key/server.key;

   location / {

       root   /html/www;

     index  index.html;

   }

}

#传送证书和私钥到网站服务器上

scp -rp /etc/nginx/{ssl_key,conf.d} 172.16.1.8:/etc/nginx/

scp -rp /html/ssl 172.16.1.8:/etc/nginx/

#修改index.html文件

web01  https-10.0.0.7

web02  https-10.0.0.8

  

#编写hosts解析文件

10.0.0.3  www.oldboy.com

 

user-->https-->lb-->http-->web 实现方式

 

第一个里程: 编写lb负载均衡配置文件

vim conf.d/ssl_proxy.conf

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;

keepalive_timeout  0;

upstream oldboy {

    server  10.0.0.7:80;

    #server  10.0.0.8:80;

    #server  10.0.0.9:80;

server {

   listen         80;

   server_name    www.oldboy.com;

   #rewrite   ^/(.*)  https://www.oldboy.com$1 redirect;

   return    302      https://$server_name$request_uri;

}

server {

    listen        10.0.0.3:443 ssl;

    server_name   www.oldboy.com;

    ssl_certificate     /etc/nginx/ssl_key/server.crt;

    ssl_certificate_key /etc/nginx/ssl_key/server.key;

location / {

    proxy_pass http://oldboy;

    proxy_set_header  Host $host;

    proxy_set_header  X-Forwarded-For  $remote_addr;

    }

}

  

第二个历程:修改web01服务配置

  # vim /etc/nginx/conf.d/www.conf

server {

      listen      80;

      server_name www.oldboy.com;

          location / {

         root  /html/www;

         index index.html;

          } 

}

说明:实现真实网站HTTPs访问  bbs www zhihu   blog css样式失效

 

#web服务器配置

[root@web01 ~]# cat /etc/nginx/conf.d/blog.conf

server {

    listen       80;

    server_name  blog.oldboy.com;

    location / {

        root   /html/blog;

        index  index.php index.html index.htm;

    }

    location ~ \.php$ {

        fastcgi_pass  127.0.0.1:9000;

        root   /html/blog;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_param HTTPS on;

        include fastcgi_params;

    }

}

  

补充:解决问题

01. 后端没有配置HTTPS功能时,前端如果是HTTPS有时加载后端页面会有问题

解决方式:

fastcgi_param HTTPS on;

     

02. 后端web节点有问题,但是并没有出现down机情况,会经过负载访问异常

    解决方式:

  Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;

    Default: proxy_next_upstream error timeout;

    Context: http, server, location

    负载均衡 404 --- web01 (404)

                  --- web02 (200)

 

1.15.5 wordpress网站如何实现伪静态:(了解)

第一个步骤:在wordpress后台修改页面配置

登录后台---设置---固定链接---自定义结构--/%post_id%.html

 

第二个步骤:实现nginx伪静态配置

blog.oldboy.com/oldboy.html

location / {

   try_files $uri $uri/ /index.php?$args==$uri;

}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

 

[root@web01 conf.d]# cat blog.conf

server {

  listen   80;

  server_name   blog.etiantian.org;

  rewrite /wp-admin$ $scheme://$host$uri/ permanent;

  location / {

        root   /html/blog;

        index  index.php index.html;

        try_files $uri $uri/ /index.php?$args==$uri;

  }

  location ~ \.php$ {

        root /html/blog;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_param HTTPS on;

        fastcgi_pass  127.0.0.1:9000;

        include fastcgi_params;

  }

}

 

1.15.6 综合架构述职说明

如何完成综合架构:

01. 制定综合架构计划 

    第一天:指定计划  备份服务  存储服务  全网备份  实时同步  总结

    第二天:web服务  LNMP   负载  keepalived

    第三天:扩展研究  总结

    第四天:扩展研究  总结

   第五天:扩展研究  总结

   第六天:一键化部署  剧本  备份 存储 全网 LNMP 负载均衡 keepalived

    第七天:一键化部署  剧本  备份 存储 全网 LNMP 负载均衡 keepalived

    第八天:项目文档整理总结  word 排版  ppt 主题  思维导图 

   第九天:处理小问题

 

02. 按照计划完成每天任务  总结信息 汇总 项目文档

 

 

 

03. 提前做好环境准备      地址规划 主机名称规划  目录规划  用户规划  初始优化  脚本规划

Ansible 一键化部署

 

 

 

04. 扩展知识研究学习      总结部署过程  问题

 

 

 

进行述职过程: 15分钟~30分钟

   01. 自我介绍

   02. 叙述架构组成  

    03. 进行操作演示   网站页面 上传  存储  备份里面  定时备份  ansible 

                      ansible 一键化

   04. 扩展知识说明

    05. 异常问题总结   分享

    06. 最终总结       架构不足之处 完善之处  

  

   07. 排错提问环节

  

  

  

1.16 搭建yum本地仓库

 

1.16.1 服务端

系统:centos7

安装centos7系统

进行基础优化

 

 

1 #收集rpm软件信息

vim /etc/yum.conf

keepcache=1

cachedir=/yum/cache/yum/$basearch/$releasever

 

yum install -y iftop 

 

2 # 利用nginx配置yum网站

 

第一个历程:修改yum

官方参考:http://nginx.org/en/linux_packages.html#RHEL-CentOS

[root@yum01 ~]# vim /etc/yum.repos.d/nginx.repo

[nginx-stable]

name=nginx stable repo

baseurl=http://nginx.org/packages/centos/$releasever/$basearch/

gpgcheck=1

enabled=1

gpgkey=https://nginx.org/keys/nginx_signing.key

 

第二个历程:清除yum缓存信息

yum clean all

 

第三个历程:yum安装软件

yum install -y nginx

  

3 #创建yum仓库配置文件

vim /etc/nginx/conf.d/yum.conf

server {

  listen  80;

  server_name www.yum.com;

  location / {

      root /yum;

      autoindex  on;

      index  index.html index.html;

  }

}

 

4 # 创建仓库目录

  mkdir -p /yum/cache/centos7_rpm

 

5 #下载创建yum仓库工具

  yum install createrepo -y

 

6 #创建仓库索引信息

createrepo -p /yum/cache/centos7_rpm/

 

7 #创建yum源文件

echo '[oldmeng]

name = oldmeng

baseurl = http://www.yum.com/cache/centos7_rpm/

gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

gpgcheck = 0

priority=1

'>/yum/cache/Lan7.repo

 

8 # 配置hosts解析信息

  10.0.0.101   www.yum.com

 

9 #编写yum下载和更新 脚本并添加执行权限

 

echo '#!/bin/sh

[ $# = 0 ] && {

echo "更新源"

/usr/bin/createrepo --update -p /yum/cache/centos7_rpm/

} || {

echo "yum下载"

yum install --downloadonly --downloaddir=/yum/cache/centos7_rpm/ -y $*

echo "更新源"

/usr/bin/createrepo --update -p /yum/cache/centos7_rpm/

}

'>/yum/cache/yumd.sh

 

chmod +x /yum/cache/yumd.sh

 

10 #创建下载命令

ln -s  /yum/cache/yumd.sh   /usr/bin/yumd

 

1.16.2 客户端

#配置本地hosts解析

vim /etc/hosts

172.16.1.101   yum01     www.yum.com

 

#更新客户端使用源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://www.yum.com/cache/Lan7.repo

 

#清除yum缓存信息

yum clean all

 

#客户端测试

yum install htop -y

 

 

 

 

 

 

 

 

 

 

 

 

 

sudo yum makecache

yum update -y

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

 

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

posted on 2020-05-14 11:51  逐梦oldboy  阅读(994)  评论(0编辑  收藏  举报

导航