day10 负载均衡

负载均衡反向代理

正向代理:即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端。
# (内部上网) 客户端 <—> 代理 -> 服务端 反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端。
# 反向代理,用于公司集群架构中,客户端 -> 代理 <—> 服务端 正向代理的用途:
1、访问原来无法访问的资源,如google
2、可以做缓存,加速访问资源
3、对客户端访问授权,上网进行认证
4、代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息 反向代理的用途:
1、保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
2、负载均衡,通过反向代理服务器来优化网站的负载 正向代理和反向代理的区别:
1、区别在于形式上服务的”对象”不一样
2、正向代理代理的对象是客户端,为客户端服务
3、反向代理代理的对象是服务端,为服务端服务 格式:
upstream [连接池名称] {
server [ip]: [端口] [分布策略]
}
proxy_pass http://[连接池的名字] # 调用

Nginx代理常用参数

1、添加发往后端服务器的请求头信息

Syntax:    proxy_set_header field value;
Default: proxy_set_header Host $http_host;
proxy_set_header Connection close;
Context: http, server, location # 用户请求的时候HOST的值是linux.proxy.com, 那么代理服务会像后端传递请求的还是linux.proxy.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2、代理到后端的TCP连接、响应、返回等超时时间

# nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location # nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location # 后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location # nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 10s;
# nginx代理等待后端服务器的响应时间
proxy_read_timeout 10s;
# 后端服务器数据回传给nginx代理超时时间
proxy_send_timeout 10s;

3、proxy_buffer代理缓冲区

# nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location # 设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location # proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location # nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
proxy_buffering on;
# 设置nginx代理保存用户头信息的缓冲区大小
proxy_buffer_size 8k;
# proxy_buffers 缓冲区(前面设置几个缓冲区,后面设置大小)
proxy_buffers 8 8k;

4、配置代理优化文件

[root@lb01 ~]# vim /etc/nginx/proxy_params    # 把这些配置放到一个文件,然后在加载文件
-----------------------------------------------------------------------------------------------------
# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 10s;
# nginx代理等待后端服务器的响应时间
proxy_read_timeout 10s;
# 后端服务器数据回传给nginx代理超时时间
proxy_send_timeout 10s;
# nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
proxy_buffering on;
# 设置nginx代理保存用户头信息的缓冲区大小
proxy_buffer_size 8k;
# proxy_buffers 缓冲区(前面设置几个,后面设置大小)
proxy_buffers 8 8k;
# 状态标记
proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403 http_429;
-----------------------------------------------------------------------------------------------------

5、代理调用优化文件

[root@lb01 ~]# vim /etc/nginx/conf.d/mqq.conf
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
} server {
server_name mqq.test.com;
listen 80; location / {
proxy_pass http://mqq; # 导入nginx代理配置文件
include proxy_params;
}
}

环境准备

主机 IP 身份
lb01 172.16.1.5 负载均衡
web01 172.16.1.7 web服务端
web03 172.16.1.9 web服务端

负载均称遇到的bug

[root@lb01 conf.d]# cat mqq.conf
-----------------------------------------------------------------------------------------------------
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
} server {
server_name mqq.test.com;
listen 80; location / {
# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.com
proxy_set_header Host $http_host;
proxy_pass http://mqq;
}
}
-----------------------------------------------------------------------------------------------------
bug1:当代理的ip中的配置文件的名称优先级高,就代理谁的
[root@web03 conf.d]# ll
-rw-r--r-- 1 root root 181 Oct 28 14:23 agame.conf # 最上面,优先代理,域名不起作用
-rw-r--r-- 1 root root 283 Oct 27 19:52 autoindex.conf.gz
-rw-r--r-- 1 root root 654 Oct 29 15:31 bbs.conf
-rw-r--r-- 1 root root 438 Oct 28 19:12 BBS.conf.gz
-rw-r--r-- 1 root root 441 Oct 28 16:57 python.conf.gz 通过负载均衡访问web服务,由于通过IP访问,导致负载均衡错误。
# 解决:
将域名携带到后端的web服务器中去。 通过配置代理携带域名来解决这个问题:
# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.com
proxy_set_header Host $http_host; 1、添加到/etc/nginx/nginc.conf里
$http_host # 加上它日志会输出访问的域名

负载均衡

什么是负载均衡?

通过反向代理实现多台web服务器共同工作。

负载均衡的调度算法

1、轮询		  :按时间顺序逐一分配到不同的后端服务器(默认)
2、weight :加权轮询,weight值越大,分配到的访问几率越高
3、ip_hash :每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
4、url_hash :按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
5、least_conn :最少链接数,哪个机器链接数少就分发
调度算法 概述
轮询 按时间顺序逐一分配到不同的后端服务器(默认)
weight 加权轮询,weight值越大,分配到的访问几率越高
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn 最少链接数,哪个机器链接数少就分发

轮询的配置方法

# 默认是轮训,一人轮一次
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
}

weight权重的配置方法

# weight的值越大,权重越高。比如性能好的服务器设置高,反之设置小的。
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80 weight=1;
server 172.16.1.9:80 weight=10;
}

ip_hash的配置方法

# 某一个客户端,固定访问某一个服务端。
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80 weight=1;
server 172.16.1.9:80 weight=10;
ip_hash;
}

负载均衡后端状态

状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数

down:标记下线状态

# 标记下线状态。
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80 down; # 不使用这个服务器。
}

backup(备用节点)

# 当正常的节点全部丧失服务能力,备用节点立即顶上。
upstream mqq {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80 backup;
}

max_fails+fail_timeout:限制失败次数(一起使用)

upstream mqq {
server 172.16.1.7:80 max_fails=3 fail_timeout=10s;
server 172.16.1.8:80 max_fails=3 fail_timeout=10s;
server 172.16.1.9:80 max_fails=3 fail_timeout=10s;
}
proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403 http_429;

会话保持

1、创建一个django项目
[root@web03 opt]# django-admin startproject pysession 2、创建一个应用
[root@web03 pysession]# pwd
/opt/pysession
[root@web03 pysession]# django-admin startapp application 3、修改配置文件
[root@web03 pysession]# vim pysession/settings.py
ALLOWED_HOSTS = ['*']
DATABASES = {} 4、测试
[root@web03 pysession]# python3 manage.py runserver 0.0.0.0:8000
在浏览器输入:http://192.168.15.9:8000/ 5、设置session
[root@web03 pysession]# vim pysession/settings.py
-----------------------------------------------------------------------------------------------------
# 设置session存储方式,这里指定使用文件的方式存储session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 指定session保存的路径
SESSION_FILE_PATH = '/tmp/'
----------------------------------------------------------------------------------------------------- 6、使用session
1)、设置session
[root@web03 pysession]# >application/views.py
[root@web03 pysession]# vim application/views.py
-----------------------------------------------------------------------------------------------------
from django.shortcuts import render, HttpResponse
def create(request):
request.session['code'] = 'web02'
return HttpResponse("设置成功") def getSession(request):
code = request.session.get('code')
return HttpResponse(f"获取SESSION:{code}")
----------------------------------------------------------------------------------------------------- 2)、获取session
[root@web03 pysession]# >pysession/urls.py
[root@web03 pysession]# vim pysession/urls.py
-----------------------------------------------------------------------------------------------------
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from application import views urlpatterns = [
path('admin/', admin.site.urls),
url(r'^create/', views.create),
url(r'^getSession/', views.getSession),
]
-----------------------------------------------------------------------------------------------------
7、测试
[root@web03 pysession]# python3 manage.py runserver 0.0.0.0:8000

测试会话保持

1、设置测试环境
[root@web03 pysession]# pwd
/opt/pysession
[root@web03 pysession]# cp /opt/linux/myweb_uwsgi.ini /opt/pysession
-----------------------------------------------------------------------------------------------------
[uwsgi]
# 端口号
socket = :8000
# 指定项目的目录
chdir = /opt/pysession
# wsgi文件路径
wsgi-file = pysession/wsgi.py
# 模块wsgi路径
module = pysession.wsgi
# 是否开启master进程
master = true
# 工作进程的最大数目
processes = 4
# 结束后是否清理文件
vacuum = true
-----------------------------------------------------------------------------------------------------
[root@web03 opt]# scp -r pysession 172.16.1.7:/opt
[root@web03 opt]# scp -r pysession 172.16.1.8:/opt 1)、安装软件包
[root@web01 pysession]# yum install python3 -y
[root@web01 pysession]# pip3 install uwsgi -i https://pypi.douban.com/simple/
[root@web01 pysession]# pip3 install django==2.2.2 -i https://pypi.douban.com/simple/
[root@web01 pysession]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y 2)、设置后台管理
[root@web01 pysession]# uwsgi -d --ini myweb_uwsgi.ini
[uWSGI] getting INI configuration from myweb_uwsgi.ini 3)、修改/etc/nginx/conf.d/bbs.conf
4)、去浏览器输入bbs.test.com 2、创建挂载点(来实现信息同步)
1)增加挂载点
[root@nfs ~]# vim /etc/exports # 修改挂载点
/session 172.16.1.0/20 2)创建目录并加权限
[root@nfs ~]# mkdir /session # 创建目录
[root@nfs ~]# chown www.www /session # 加上权限 3)重启服务
[root@nfs ~]# systemctl restart nfs-server rpcbind # 重启服务 4)测试
[root@nfs ~]# showmount -e
/session 172.16.1.0/20
/data 172.16.1.0/20 3、挂载
1)安装软件包
[root@web03 ~]# yum install nfs-utils 2)挂载到nfs
[root@web03 ~]# mount -t nfs 172.16.1.31:/session /tmp
[root@web01 tmp]# mount -t nfs 172.16.1.31: /session /tmp 3)查看挂载
[root@web01 tmp]# df -h 4)测试

day10 负载均衡的更多相关文章

  1. day10 nfs服务,nginx负载均衡,定时任务

    ==================nginx 负载均衡==================== 实现nginx负载均衡的效果,并运用nfs服务共享目录,使所有nginx服务拥有共同的http目录 n ...

  2. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

  3. Windows平台分布式架构实践 - 负载均衡

    概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...

  4. 微软Azure 经典模式下创建内部负载均衡(ILB)

    微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...

  5. 前端学HTTP之重定向和负载均衡

    前面的话 HTTP并不是独自运行在网上的.很多协议都会在HTTP报文的传输过程中对其数据进行管理.HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器.Web代理和缓存的网络世界中,HTT ...

  6. Windos环境用Nginx配置反向代理和负载均衡

    Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...

  7. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  8. 负载均衡——nginx理论

     nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势.  nginx架构? ...

  9. Supermap iCloudManager -负载均衡

    Supermap icm负载均衡理解: 应用场景:地图出图 子节点1和子节点2中的服务保持一致,一般情况下设置的是匿名用户通过nginx访问服务信息,所以不需要登录. 1.通过nginx分发请求,(轮 ...

随机推荐

  1. arduino 使用 analogRead 读取不到数据,digitalRead 却可以正常读取

    项目场景: 最近在使用安信可的 ESP32S P14 引脚(ADC 16)读取一个电路状态的时候遇到一个问题,电路状态不是很稳定,在高电平的时候,会突然出现毫秒级的波动,出现短暂的低电平,造成设备状态 ...

  2. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...

  3. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  4. 在Ubuntu下的C语言编程

    以运行在虚拟机下的Ubuntu为例: mkdir fenchen 来创建一个文件夹 cd fenchen 切换到这个文件夹下面 vi test.c 创建并编辑一个test.c文件 按 i 编辑,之后把 ...

  5. git push超过100M文件处理方法

    git push超过100M文件处理方法 github 会在你上传文件大于50M的时候,给予警告 ; 大于100M的时候给出 server reject(拒绝上传) 解决方法 保持单个文件在 100 ...

  6. Mysql - 如何存储 10位、13位的 unix 时间戳?

    背景 前面有讲过存日期时间可以用  datetime.timestamp 类型:https://www.cnblogs.com/poloyy/p/15546735.html 格式是: YYYY-MM- ...

  7. IDEA 设置Java项目使用的JDK版本 最全篇

    1. File -> Project Setting -> Project : 2. File ->Project Setting -> Modules 3. File -&g ...

  8. Linux下搭建FFmpeg开发调试环境

    背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可.但是如果你想调试FFmpeg内部相关的逻辑,或者 ...

  9. 通过小乌龟从本地主机删除远端svn服务器端的代码或图片文件

    先说解决方案,如果通过windows的右键删除,再次Commit还是会下拉下来,所以需要通过小乌龟的删除来删除这个文件,在删除的那个文件夹里再次提交即可. 图片 1. 选中要删除的文件 2. 右键通过 ...

  10. [bzoj1106]立方体大作战

    先贪心,容易发现如果两个点中间没有点对,那么一定可以先把这两个点消掉分析一下,就可以发现这样两个点的答案就是这两个点对中间不成对的点数量扫描过去,线段树维护每一个点的权值(是否会被算入答案)即可 1 ...