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)测试
最新文章
- javascript,从库到框架再到平台
- JavaWeb 学习006-4个页面,5条sql语句(添加、查看、修改、删除)
- Android Sqlite数据库相关——实现将 Sqlite 数据库复制到SD 卡
- Windows7如何在安全模式下卸载驱动(亲测)
- Ucenter注册后,需要二次登录才能同步登录的解决方案
- 批量转换cue文件编码
- angular.js之作用域scope&#39;@&#39;,&#39;=&#39;,&#39;&;&#39;
- 函数iconv_substr和mb_substr
- Java之继承深刻理解
- sql的sum函数(与group by,having子句混合使用)
- SAP MM 实施项目里Open PO 迁移思路探讨
- OO第9-11作业总结
- 网络协议 反扒机制 fidder 抓包工具
- Matplotlib中plt.rcParams用法(设置图像细节)
- linux搭建DHCP
- [AH2017/HNOI2017]大佬(动态规划 搜索)
- 我们为什么以及是如何从 Angular.js 迁移到 Vue.js?
- windows系统中 利用kibana创建elasticsearch索引等操作
- Linux上用户之间对话
- 【MySQL解惑笔记】忘记MySQL数据库密码
热门文章
- 寻找下一个结点 牛客网 程序员面试金典 C++ java Python
- When overwhelmed, take a break
- OSI模型 &; TCP/IP模型
- git stash 存储命令
- Java学习(十四)
- FZU ICPC 2020 寒假训练 3
- vue 快速入门 系列 —— 使用 vue-cli 3 搭建一个项目(下)
- Django笔记&教程 4-3 模型(models)主键外键
- java web 在线编辑Excel -- x-spreadsheet
- 菜鸡的Java笔记 第十三 String 类的两种实例化方法