day10 负载均衡
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 负载均衡的更多相关文章
- day10 nfs服务,nginx负载均衡,定时任务
==================nginx 负载均衡==================== 实现nginx负载均衡的效果,并运用nfs服务共享目录,使所有nginx服务拥有共同的http目录 n ...
- 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...
- Windows平台分布式架构实践 - 负载均衡
概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...
- 微软Azure 经典模式下创建内部负载均衡(ILB)
微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...
- 前端学HTTP之重定向和负载均衡
前面的话 HTTP并不是独自运行在网上的.很多协议都会在HTTP报文的传输过程中对其数据进行管理.HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器.Web代理和缓存的网络世界中,HTT ...
- Windos环境用Nginx配置反向代理和负载均衡
Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...
- 负载均衡——nginx理论
nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势. nginx架构? ...
- Supermap iCloudManager -负载均衡
Supermap icm负载均衡理解: 应用场景:地图出图 子节点1和子节点2中的服务保持一致,一般情况下设置的是匿名用户通过nginx访问服务信息,所以不需要登录. 1.通过nginx分发请求,(轮 ...
随机推荐
- redis 集群环境搭建
原理: 1,每个Redis群集的节点都需要打开两个TCP连接,由于这两个连接就需要两个端口,分别是用于为客户端提供服务的常规Redis TCP命令端口(例如6379)以及通过将10000和命令端口相加 ...
- 文件挂载swap
根目录使用率超过79%,根目录总共45G,/home目录下有文件6G的swap,在新加的300G分区/OracleDB中建立4个G的swap替代/home下在swap文件 1.创建4个G的空文件 # ...
- QuantumTunnel:Netty实现
接上一篇文章内网穿透服务设计挖的坑,本篇来聊一下内网穿透的实现. 为了方便理解,我们先统一定义使用到的名词: UserClient:用户客户端,真实的请求发起方: UserServer:内网穿透-用户 ...
- java+selenium+testNG+Allure报表【新增截图到报表功能】
1.pom.xml配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://w ...
- dart系列之:dart语言中的内置类型
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
- MacOS升级到Monterey后python SSL握手失败问题
MacOS升级到Monterey 12.0.1后,忽然发现原来工作正常的python3请求华为restconf API报错失败,提示 ssl.SSLError: [SSL: SSLV3_ALERT_H ...
- MyBatis Plus中使用and和or
如图:show me the code 参考: https://mp.baomidou.com/guide/wrapper.html#or
- celery ValueError: invalid literal for int() with base 10: '26379;sentinel'
celery使用redis sentinel作为broker的时候,因为redis sentinel配置字符串格式解析报错 ValueError: invalid literal for int() ...
- k8s endpoints controller分析
k8s endpoints controller分析 endpoints controller简介 endpoints controller是kube-controller-manager组件中众多控 ...
- (五)MySQL函数
5.1 常用函数 5.2 聚合函数(常用) 函数名称 描述 COUNT() 计数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 .... .... 想查询一 ...