linux负载均衡反向代理
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 ~]