10反向代理和负载均衡
1、Nginx + Python的流程
1、安装基础环境
python3 pip django uwsgi
2、准备源代码
3、使用uwsgi启动Django
python3 manage.py runserver 0.0.0.0:8000
4、Nginx 代理 uwsgi 服务
5、测试
2、什么叫四层负载均衡什么叫七层负载均衡
四层负载均衡是基于TCP/IP的 代理TCP(MySQL)
七层负载均衡是基于HTTP的 代理HTTP(Nginx,Uwsgi)
2、反向代理
1、什么是正向代理,什么是反向代理?
正向代理:客户端去找服务端
反向代理:代理去找服务端
2、反向代理
upstream [链接池名称] {
server [ip]:[端口] [分发策略];
}
proxy_pass http://[连接处名称];
[root@lb01 conf.d]# cat game.conf
upstream game {
server 172.16.1.8:80;
server 172.16.1.7:80;
}
server {
server_name game.test.com;
listen 80;
location / {
proxy_pass http://game;
}
}
通过负载均衡访问web服务,由于通过IP访问,导致负载均衡错误。
解决:
将域名携带到后端的web服务器中去。
怎么携带?
# 用户请求的时候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代理与后端服务器连接超时时间(代理连接超时)
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
#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
[root@lb01 conf.d]# cat ../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;
3、负载均衡
1、什么是负载均衡
通过反向代理实现多台web服务器共同工作。
2、负载均衡的算法(策略)
1、轮询(默认)
2、权重
weight的值越大,权重越高。
server 172.16.1.8:80 weight=1;
server 172.16.1.7:80 weight=10;
3、ip_hash
某一个客户端,固定访问某一个服务端。
4、备用节点
当正常的节点全部丧失服务能力,备用节点立即顶上。
backup;
3、负载均衡的后端服务状态
1、标记为下线状态
down
2、配置错误容忍度
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
#interval 检测间隔时间,单位为毫秒
#rise 表示请求2次正常,标记此后端的状态为up
#fall 表示请求3次失败,标记此后端的状态为down
#type 类型为tcp
#timeout 超时时间,单位为毫秒
4、会话保持
1、创建一个django项目
[root@web02 opt]# django-admin startproject pysession
2、创建一个应用
[root@web02 pysession]# django-admin startapp application
3、修改配置文件
[root@web02 pysession]# vim pysession/settings.py
ALLOWED_HOSTS = ['*']
DATABASES = {}
4、测试
知识储备:
session使用来存储数据。
5、设置session
[root@web02 pysession]# pwd
/opt/pysession
[root@web02 pysession]# vim pysession/settings.py
# 设置session存储方式,这里指定使用文件的方式存储session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 指定session保存的路径
SESSION_FILE_PATH = '/tmp/'
6、使用session
1、设置session
request.session['code'] = 'web02'
2、获取session
request.session.get('code')
[root@web02 pysession]# pwd
/opt/pysession
[root@web02 pysession]# >application/views.py
[root@web02 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}")
[root@web02 pysession]# pwd
/opt/pysession
[root@web02 pysession]# vim pysession/urls.py
[root@web02 pysession]# >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、测试
8、基础环境
yum install python3 -y
pip3 install uwsgi
pip3 install django==2.2.2
在负载均衡中,操作文件不同步(会话不保持)
NFS
1、创建挂载点
[root@nfs /]# vim /etc/exports
/session 172.16.1.0/20(rw,all_squash,sync,anonuid=996,anongid=996)
[root@nfs /]# mkdir /session
[root@nfs /]# chown www.www /session/
[root@nfs /]# systemctl restart nfs-server rpcbind
[root@nfs /]# showmount -e
/session 172.16.1.0/20
/data 172.16.1.0/20
[root@nfs /]# setenforce 0
2、挂载
[root@web02 ~]# mount -t nfs 172.16.1.31:/session /tmp/
[root@web04 ~]# mount -t nfs 172.16.1.31:/session /tmp/