每日分享
What would life be if we had no courage to attempt anything?
如果我们没有勇气尝试任何事情,生活会怎样?
小闫语录:
机会不是偏执于那些成功的人,只是成功的人看到并把握住了机遇。如果你连尝试的勇气都没有,那么生活注定平庸。
项目部署(二)
1.负载均衡
我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?解决办法就是负载均衡了,负载均衡是一种特殊的反向代理。负载均衡简单点说,就是人多力量大。一台服务器不行,来两台......
1.1osi七层模型
物理层、数据链路层、网络层(ip)、传输层(port)、会话层、表示层、应用层(url - http)
负载均衡分类四层负载(port 传输层),七层负载(url 应用层)
1.2负载均衡
upstream 主要是定义一个后端服务地址的集合列表,每个后端服务使用一个server命令表示。
upstream {} 和 Server {} 两部分内容属于平级关系
upstream
的格式:
upstream 主机群名称 { server 主机1; server 主机2; ... server 主机3; } server { location / { proxy_pass 主机 } }
关键点:
配置关键字:upstream。
主机群名用在哪里?proxy_pass后面指定主机。
主机列表如何来制作? 使用server指令。
1.3属性详解
down
:表示当前server主机暂时不参与负载均衡 。(当主机故障时候,直接进行隔离。)
backup
:后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器。(此主机有能力完成,但是作为储备,平时不用,只有紧急情况或繁忙时使用。)
max_fails
:允许请求的最大失败数,默认为1,配合fail_timeout一起使用。(重试次数,当重试失败次数达到一定程度,就终止给该主机发送请求。)
fail_timeout
:经历max_fails次失败后,暂停服务的时间,默认为10s。(当重试失败停止后,等待一段时间,继续进行尝试。)
扩展命令:
安装curl来演示效果,不用使用浏览器。
使用 curl
命令来检查Nginx的页面展示效果。语法:
curl <option><url>
还可以使用循环,多次执行。
for i in{1..10};do curl 192.168.xx.xx;done
1.4负载均衡调度算法
1.4.1内置策略
Nginx自带算法:
雨露均沾型:轮询、加权轮询、哈希
轮询(默认):请求按顺序逐一分配到不同的后端服务器 。
加权轮询weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况 。
定向服务型:iphash、leastconn、cookie、route、lean
ip_hash:按访问 IP 的哈希结果分配请求,比如同一个ip都让其访问固定一台服务器。分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题 。
商业类型:ntlm、least_time、queue、stick(都是收费的,使用量少)
1.4.2扩展策略
第三发开发的算法:fair、url_hash
fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问 URL 的哈希结果分配请求,使同 URL 定向到同一台后端服务器,可提高后端缓存服务器的效率。
也可以自定义算法。
1.4.3实践
加权轮训 upstream backends { server 192.168.8.15:10086 weight=1; server 192.168.8.15:10087 weight=3; server 192.168.8.15:10088 weight=1; } ip_hash算法 upstream backends { ip_hash; server 192.168.8.15:10086 weight=1; server 192.168.8.15:10087 weight=3; server 192.168.8.15:10088 weight=1; }
2.日志解析
默认日志地址:
/var/log/nginx/
下面默认有两个日志文件:access.log和error.log。我们除了可以使用默认日志格式之外,还可以自定义日志格式。
2.1日志定制
日志定制是工作中很重要的意向内容,特别是监控网站的运行状态。我们可以在 /etc/nginx/nginx.conf 文件中配置。
日志格式定制:
log_format 日志格式名'内置变量组成的日志格式 ';
日志格式使用:
access_log 日志文件所在路径采用日志格式名;
err_log 日志文件所在路径采用日志格式名;
nginx常用的内置变量:
$remote_addr 前一台主机的ip地址,不一定是真实的客户端IP
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_referer 可以记录用户是从哪个链接访问过来的
$http_user_agent 用户所使用的代理(一般为浏览器)
其他常用变量:
$request_uri 包含请求参数的原始 URI,不包含主机名
$uri 不带请求参数的当前 URI,不包含主机名
$http_x_forwarded_for 可以记录客户端 IP,通过代理服务器来记录客户端的 ip 地址
$http_x_real_ip 可以记录客户端 IP,通过代理服务器来记录客户端的 ip 地址
$args 这个变量等于请求行中的参数,同$query_string
$host 请求主机头字段,否则为服务器名称。
$scheme HTTP 方法(如 http, https)
$document_uri 与$uri 相同
$document_root 当前请求文件配置文件中 html 的根目录即 root 值
$request_filename 当前请求的文件路径,由 root 或alias指令与 URI 请求生成
2.2获取客户端真实ip
2.2.1需求
获取真实的客户端ip地址
2.2.2步骤
1.要有相应的请求属性值。
X-Real-IP
X-Forwarded-For
2.要在后端主机上获取这些属性值。
$http_x_forwarded_for
$http_x_real_ip
2.2.3方法
2.2.3.1方法一
在所有的主机上及后端主机上获取下面的参数:
$http_x_forwarded_for
2.2.3.2方法二
在第一台代理主机上设置:
x_real_ip
然后再最后一台提供服务的backend主机上获取:
$http_x_real_ip
2.3日志定制案例
1.定制日志格式。
2.在第一个代理上 设置两个真是的报文头:X-Real-IP和X-Forwarded-For。
3.方法
方法一:在所有的主机上获取 $httpxforwarded_for
方法二:在最后一台主机上设置 $httpxreal_ip
4.在后端主机上使用定制日志
root@itcast:/etc/nginx/conf.d# cat upstream.conf backends.conf upstream backends { server 192.168.8.15:10086; } server{ listen 80; location / { proxy_pass http://backends; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 192.168.8.15:10086; root /var/www/html/huang; index index.html; access_log /var/log/nginx/huang.log proxy_format; real_ip_header X-Forwarded-For; location / { try_files $uri $uri/ =404; } }
3.Docker
3.1Docker是什么?
我们先引入一个场景,就是我们在自己电脑上开发项目完成后,要部署到不同的服务器上去运行,因为涉及到负载均衡,那么服务器超多,每一台都需要从零搭建相关环境,保证项目运行正常。好不容易都弄完了,有台主机崩了,你说惊喜不惊喜?如果我们可以直接将环境和项目完整的复制移植到服务器上会多么省事,只需要一次构建,即可多次使用,这就是docker。简单的说,Docker是一种快速解决生产问题的技术手段。它由镜像、仓库、容器三大部分组成。由此引出docker的理念:构建(build)、运输、运行。
3.2优缺点
优点:适用场景比较多;环境部署快、更新快;省钱省力,非常流行,人们都在选择。
缺点:依赖操作系统;依赖网络;有限制条件,那就是银行u盾等场景不能使用。
3.3部署docker
安装依赖软件:
apt-get update apt-get install apt-transport-https ca-certificates curl software-properties-common -y
使用阿里云的源:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_re lease -cs) stable"
检查:
apt-get update
查看支持的docker版本:
apt-cache madison docker-ce
安装docker:
apt-get install docker-ce -y
指定安装的版本:
apt-get install docker-ce=<VERSION>-y
启动docker:
systemctl start docker # 查看docker的状态 systemctl status docker
Ubuntu安装完成之后默认就开启了服务。
测试docker:
docker version
docker启动之后,使用ifconfig命令查看IP,会发现网卡多了一个docker0网卡,网卡地址是172.17.0.1
docker服务命令:
docker start | stop | restart docker
删除docker命令:
yum remove docker-ce rm -rf /var/lib/docker/ rm -rf /etc/docker
docker的基本目录:
/etc/docker/ # docker的认证目录 /var/lib/docker/ # docker的应用目录
3.4docker加速器
在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用 daoclo ud 的方法进行加速配置。
访问 daocloud.io网站,登录 daocloud 账户,点击右上角的加速器,在新窗口显示的命令记下来,我们使用该命令进行配置:
窗口显示的命令
加速器配置:
修改daemon.json文件
# cat /etc/docker/daemon.json {"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": []}
修改完之后重启一下docker:
systemctl restart docker
3.5镜像
特点:镜像是一个只读文件,和我们安装Windows系统的iso镜像文件一样。
搜索镜像:
docker search [image_name]
先在本地的仓库找,如果找不到会去网上仓库找。
获取镜像:
docker pull [image_name]
查看镜像:
查看本地仓库的镜像信息。
docker images
# 查看某一个镜像
docker images [image_name]
查看镜像的历史信息:
docker history nginx
会查看历史操作过的命令以及产生文件大小。
重命名,打标签:
docker tag [old_image]:[old_version][new_image]:[new_version]
里面的版本号如果不指定,默认是latest。
删除镜像:
docker rmi [IMAGE ID]# 方法一
docker rmi [image]:[image_version]# 方法二
当一个image id指向多个镜像名的时候,就不能使用方法一image id删除了。
docker的家目录:
/var/lib/docker
将docker的镜像导出,进行备份:
docker save -o [包文件][镜像]
导入镜像:
docker load <[image.tar_name]
docker load --input [image.tar_name]
docker load不能指定镜像的名称。
3.6容器管理
特点:在docker中我们可以为所欲为的地方,与外界完全隔离。
查看正在运行的容器:
docker ps
查看所有运行过的容器:
docker ps -a
启动容器:
docker run <参数,可选> [docker_image] [执行的命令] # 让docker容器在后台以守护形式运行 docker run -d [docker_image] # 启动已经终止的容器 docker start [container_id]
创建并进入到容器里面:
docker run --name [container_name]-it [docker_image]/bin/bash
--name给容器定义一个名字
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
/bin/bash执行一个命令
进入到容器里面
docker exec-it <容器id>/bin/bash
关闭容器:
docker stop [container_id]
删除容器:
docker rm [container_id] # 删除已经关闭的容器 docker rm -f [container_id] # 强制删除正在运行的容器
获取到所有的容器id
docker ps -a -q
强制删除所有的容器:
docker rm -f $(docker ps -a -q)
$(xxx)表示先执行括号里面的命令。
退出容器:
exit
也可以直接ctrl+D
基于容器创建镜像:
docker commit -m <注释> -a <作者> [container_id] [new_image]:[new_version]
查看系统号:
netstat -tnulp
查看容器的所有的详细信息:
docker inspect [container_name]
二次开发要好好了解inspect命令的结果内容,十分的主要
查看容器运行日志:
docker logs [container_id]
3.7仓库管理
此处将的仓库就是镜像存储的地方。
docker仓库分类(安全角度):安全仓库、不安全仓库。
Docker仓库分类:共有仓库、私有仓库、本地仓库。
私有仓库:registry(轻量级)、harbor(企业级)
3.7.1相关命令
docker login [仓库名称] docker pull [镜像名称] docker push [镜像名称] docker search [镜像名称]
3.7.2私有仓库部署
创建仓库的流程:
1.获取仓库镜像并运行。
2.配置仓库权限。
3.提交镜像到私有仓库。
4.推送拉取测试。
实施方案:
下载registry镜像:
docker pull registry
启动仓库容器:
docker run -d -p 5000:5000 --restart=always registry
--restart代表的是什么时间重启
docker-proxy将容器里的端口映射到外面
检查容器效果:
curl 127.0.0.1:5000/v2/_catalog
配置容器权限:
vim /etc/docker/daemon.json {"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14: 5000"]}
注意:私有仓库的ip地址是宿主机的ip,而且ip两侧都有双引号
重启docker服务:
systemctl restart docker
systemctl status docker
效果查看:
启动容器:
docker start [container_id]
标记镜像:
ddocker tag ubuntu-mini 192.168.8.14:5000/ubuntu-14.04-mini
提交镜像:
docker push 192.168.8.14:5000/ubuntu-14.04-mini
下载镜像:
docker pull 192.168.8.14:5000/ubuntu-14.04-mini
注意事项
1.运行仓库的时候,添加 --restart
参数。
2.推送镜像的时候,镜像的名称应该携带仓库地址。
3.8数据管理
数据卷:将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储。缺点是太单一了 。
数据卷容器:将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
3.8.1数据卷简介
宿主机和容器间共享数据的一种机制
-v 宿主机文件:容器文件路径
3.8.2数据卷实践
目录
docker run -d -v /tmp:/test1 nginx
文件
docker run -d --name hah -v /tmp/nihao.txt:/nicai/h.py nginx
需求:
如果我准备启动10个容器每个容器我都同时挂载2个文件
思路1:
一个数据卷操作的命令执行10遍
3.8.3数据卷容器简介
场景:
批量数据卷的操作
步骤:
1 创建数据卷容器
注意:数据卷容器不会启动
2 启动应用容器的时候,挂载数据卷容器
3.8.4数据卷容器实践
docker create -v /tmp/:/test -v /suzhuji:/jizhusu -v /su:/us --name vc-test nginx docker ps docker ps -a docker inspect 5d8526a2abe9 docker ps -a docker run --volumes-from vc-test --name nginx-test1 nginx docker run -d --volumes-from vc-test --name nginx-test1 nginx docker run -d --volumes-from vc-test --name nginx-test2 nginx docker run -d --volumes-from vc-test --name nginx-test3 nginx docker ps docker exec -it nginx-test2 /bin/bash docker exec -it nginx-test3 /bin/bash
3.8.5容器里面的数据备份和还原(扩展)
3.9网络管理
3.9.1端口映射详解
随机端口的起始端口号是:32768。
每次使用随机端口映射,都会在之前的端口号基础上+1。
好处:
1.无需关心容器的端口号和宿主机上的端口号。
2.所有的容器永远不可能冲突。
3.9.2随机映射实践
docker run -d -P nginx
3.9.3指定映射实践
-p [宿主机ip]:[宿主机port]:[容器端口]
注意:
1.宿主机ip不写表示0.0.0.0;宿主机port不写,表示随机端口。
2.容器端口必须写。
3.生产中在使用指定端口映射的时候,一定要合理的安排端口的分配。
docker run -d -p 192.168.8.15:999:80 nginx docker run -d -p :999:80 nginx docker run -d -p :998:80 nginx docker run -d -p ::80 nginx
3.9.4拓展
1.docker的网络模型 (5种)
docker自带的网络模型:bridge(默认) none host
docker其他的网络模型:container overlay
2.docker 网络模型简单实践
3.docker overlay网络模型实践
weave、flannel、calico、canel、openswitch