day10 负载均衡反向代理
1.复习
1 .nginx+python的流程
1.1 安装基础环境
yum install python3
pip3 install django == 2.2 .2
安装uwsgi之前先安装依赖软件yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
pip3 install uwsgi
1.2 上传python源代码到/opt/
1.3 使用uwsgi 启动django
python3 manage.py runserver 0.0 .0.0:8000
vim /opt/[ 项目名字] /myuwsgi.ini
[ root@localhost ~]
[ uwsgi]
socket = :8000
chdir = /opt/gailun
wsgi-file = gailun/wsgi.py
module = gailun.wsgi
master = true
processes = 4
vacuum = true
cd /opt/gailun
uwsgi -d --ini myuwsgi.ini
1.4 nginx 代理uwsgi服务
cat /etc/nginx/conf.d/python.conf
server {
listen 80 ;
server_name py.test.com;
location / {
include uwsgi_params;
uwsgi_pass 127.0 .0.1:8000;
uwsgi_read_timeout 2 ;
uwsgi_param UWSGI_SCRIPT gailun.wsgi;
uwsgi_param UWSGI_CHDIR /opt/gailun;
index index.html index.htm;
client_max_body_size 35m;
}
}
systemctl restart nginx
四层负载均衡和七层负载均衡
四层负载均衡是基于TCP/IP的 代理TCP(MySQL)( 不支持域名)
七层负载均衡是基于HTTP的 代理HTTP(Nginx,Uwsgi)(支持域名)
正向代理和反向代理
1 、什么是正向代理,什么是反向代理?
正向代理:客户端去找服务端( 中介告诉你地址,你自己去找服务端)
反向代理:代理去找服务端( 相当于中介,中介帮你去找服务端)
2 、反向代理
upstream [ 链接池名称] {
server [ ip] :[ 端口] [ 分发策略] ;
}
proxy_pass http://[ 连接处名称] ;
通过负载均衡指向的三台机器,如果三台机器都指向了各自的游戏,那么他就会三个来回跳转,可以将域名携带到web服务器
通过下面发送头部信息可以解决
nginx代理常用参数
后端服务器发送头部信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $http_host ;
proxy_set_header Connection close;
Context: http, server, location
proxy_set_header Host $http_host ;
----------------------------------------------------------------------------------------
proxy_set_header X-Real-IP $remote_addr ;
----------------------------------------------------------------------------------------
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
代理后端tcp连接、响应、返回等超时时间
Syntax: proxy_connect_timeout time ;
Default: proxy_connect_timeout 60s;
Context: http, server, location
proxy_connect_timeout 10s;
----------------------------------------------------------------------------------------
Syntax: proxy_read_timeout time ;
Default: proxy_read_timeout 60s;
Context: http, server, location
proxy_read_timeout 10s;
----------------------------------------------------------------------------------------
Syntax: proxy_send_timeout time ;
Default: proxy_send_timeout 60s;
Context: http, server, location
proxy_send_timeout 10s;
上面这三个时间 一般一起用
缓冲区
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
proxy_buffering on;
----------------------------------------------------------------------------------------
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k| 8k;
Context: http, server, location
proxy_buffer_size 8k; 保存http头信息
----------------------------------------------------------------------------------------
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k| 8k;
Context: http, server, location
proxy_buffers 8 8k; 保存实际数据的地方
由于上面都是优化部分可以写成一个文件
proxy_set_header Host $http_host ;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_connect_timeout 10s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403 http_429;
负载均衡(就是反向代理,反向代理只是代理一个服务器)
1 .什么是负载均衡
通过反向代理,实现多态web机器同时提供服务
2 .负载均衡的算法
2.1 轮询(默认,一人一个排队)
一个页面访问一次
2 .2weight(谁的责任大,谁执行的机会大) 连接池的ip后面加weight= [ 数字1-10]
server 172.16 .1.8:80 weight = 1 ;
server 172.16 .1.7:80 weight = 10 ;
2 .3ip_hash( 固定访问)
某一个客户端(IP),固定访问某一个服务端。
server 172.16 .1.8:80;
server 172.16 .1.7:80;
ip_hash;
2.4 备用节点backup
优点:服务器宕机,备用的顶上,不会出现比较大的问题
缺点:backup这个节点始终没有流量,除了全部机器宕机时,他才会运行
server 172.16 .1.7:80 backup;
负载均衡算法(策略) 概述 轮询 按时间顺序逐一分配到不同的后端服务器(默认) weight(常用) 加权轮询,weight值越大,分配到的访问几率越高 ip_hash 每个请求按访问IP的hash结果分配.这样来自同一IP的固定访问一个后端服务器 url_hash(不常用) 按照访问URL的hash结果来分配请求是每个URL定向到同一个后端服务器 least_conn(不常用) 最少链接数,哪个机器链接数少就分发
负载均衡的后端服务状态
1 、标记为下线状态,
down
server 172.16 .1.7:80 down;
2 、配置错误容忍度
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;
3 、健康检测(也必须要标记)(基本用不到)
check interval = 3000 rise = 2 fall = 3 timeout = 1000 type = tcp
会话保持
1 ,创建一个django项目pysession
[ root@web02 opt]
2 .创建一个应用application
cd pysession
[ root@web02 pysession]
3 .修改配置文件settings
[ '*' ]
DATABASES删掉
4 .测试在那个根目录下执行
python3 manage.py runserver 0.0 .0.0:8001
session
1 .设置session /opt/pysession/pysession/settings
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/tmp'
2 .使用session
2.1 设置session ; request.session[ 'code' ] = 'web02'
[ root@web02 pysession]
from django.shortcuts import render, HttpResponse
def create( request) :
request.session[ 'code' ] = 'web02'
return HttpResponse( "设置成功" )
2.2 获取session ; request.session.get( 'code' )
def getSession( request) :
code = request.session.get( 'code' )
return HttpResponse( f"获取SESSION:{code}" )
----------------------------------------------------------------------------------------
3 .加入url页面
[ root@web02 pysession]
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) ,
]
4 、测试
[ root@web02 pysession]
4.1 把myuwsgi.ini复制过来并编写,然后把/opt/pysession通过scp传给web01 web03
cp .. /gailun/myuwsgi.ini ./
[ uwsgi]
socket = :8001
chdir = /opt/pysession
wsgi-file = pysession/wsgi.py
module = pysession.wsgi
master = true
processes = 4
vacuum = true
5 、基础环境web02 web03需要安装
yum install python3 -y
yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
pip3 install uwsgi -i https://pypi.douban.com/simple/
pip3 install django == 2.2 .2 -i https://pypi.douban.com/simple/
6 .测试没问题在执行
uwsgi --ini myuwsgi.ini
uwsgi -d --ini myuwsgi.ini
7 .nginx代理uwsgi 修改 /etc/nginx/conf.d/bbs.conf
在负载均衡中,操作文件不同步(会话不保持)可以使用NFS共享文件夹
NFS
1 、创建挂载点
[ root@nfs /]
/session 172.16 .1.0/20( rw,all_squash,sync,anonuid= 996 ,anongid= 996 )
[ root@nfs /]
[ root@nfs /]
[ root@nfs /]
[ root@nfs /]
/session 172.16 .1.0/20
/data 172.16 .1.0/20
[ root@nfs /]
2 、挂载 记得安装nfs-utils
[ root@web02 ~]
[ root@web03 ~]