linux负载均衡反向代理

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 #可以先用python的manae.py测试一下django代码,报错很有可能是因为django有问题 记得要启动mysql :systemctl start mariadb(在数据库服务器)
    	#编辑项目启动配置文件
    	vim /opt/[项目名字]/myuwsgi.ini 
    	# 编辑项目启动配置文件
            [root@localhost ~]# vim /opt/gailun/myuwsgi.ini 
            [uwsgi]
            #上面的是跟yum源一样
            # 端口号socket django启动之后的端口号
            socket            = :8000
            # 指定项目的目录 指的是项目名称
            chdir           = /opt/gailun
            # wsgi文件路径
            wsgi-file       = gailun/wsgi.py
            # 模块wsgi路径 和外面的民资一样
            module          = gailun.wsgi
            # 是否开启master进程
            master          = true
            # 工作进程的最大数目
            processes       = 4
            # 结束后是否清理文件
            vacuum          = true
		# 启动uwsgi
            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 / { 
                        #加载nginx代理uwsgi的配置项
                        include uwsgi_params;
                        #指定uwsgi访问地址  netstat -nutlp 产看端口信息
                        uwsgi_pass 127.0.0.1:8000;
                        #超时时间
                        uwsgi_read_timeout 2;
                        #自定义uwsgi代理项目的路径以及配置项
                        uwsgi_param UWSGI_SCRIPT gailun.wsgi;
                        #指定python项目的路径
                        uwsgi_param UWSGI_CHDIR /opt/gailun;
                        #索引文件
                        index  index.html index.htm;
                        #客户端上传文件最大值(可要可不要)
                        client_max_body_size 35m;
                    }
                }
            # 重启Nginx
            	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
 
# 用户请求的时候HOST的值是cjml.com, 也会向后端传送一个cjml.com,他就会寻找解析这个域名的ip对应的游戏
proxy_set_header Host $http_host; #反向代理域名时,可以向后端传送域名
----------------------------------------------------------------------------------------
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip,这个和下边这个一般一起连用
proxy_set_header X-Real-IP $remote_addr;#记录客户端真实IP(无代理)
----------------------------------------------------------------------------------------
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址,如果有代理的情况,真实IP会存在$http_x_forwarded_for这个变量里,他会在日志最后一个位置输出
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录客户端真实IP(有代理)

代理后端tcp连接、响应、返回等超时时间

#nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
#配置里加  这个可以看作打电话等对方接电话时间
proxy_connect_timeout 10s;
----------------------------------------------------------------------------------------
#nginx代理等待后端服务器的响应时间
Syntax:    proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location
#配置里加  可以看作接通电话,对方不说话时间,比如吵架,对方接电话但是不说话
proxy_read_timeout 10s;
 ----------------------------------------------------------------------------------------
#后端服务器数据回传给nginx代理超时时间	
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
#配置里加  可以看作接通电话,网络不好,对方说了好几句 一句没听到,数据太大传不过来
proxy_send_timeout 10s;
上面这三个时间 一般一起用 

缓冲区

#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

proxy_buffering on;
---------------------------------------------------------------------------------------- 
#设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

proxy_buffer_size 8k; 保存http头信息
---------------------------------------------------------------------------------------- 
#proxy_buffers 缓冲区
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;   #这个和下面这个一起用 ,记录本机ip(无代理情况下)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录本机ip(有代理情况下)日志最后一个是
proxy_connect_timeout 10s;  #连接时间,网页打开时间
proxy_read_timeout 10s;    #响应时间  连上服务端也要响应你
proxy_send_timeout 10s;		#超时时间,内容太多传输慢
proxy_buffering on;			#开启缓冲区 默认就是开启
proxy_buffer_size 8k;		#缓冲区头大小为8k 不能太大
proxy_buffers 8 8k;			#实际缓冲区八个,每个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;#写在proxy_params里面

3、健康检测(也必须要标记)(基本用不到)
#标记在全局的指定IP下面
	check interval=3000 rise=2 fall=3 timeout=1000 type=tcp
    #interval  检测间隔时间,单位为毫秒
    #rise      表示请求2次正常,标记此后端的状态为up
    #fall      表示请求3次失败,标记此后端的状态为down
    #type      类型为tcp
    #timeout   超时时间,单位为毫秒

会话保持

1,创建一个django项目pysession
	[root@web02 opt]# django-admin startproject pysession
2.创建一个应用application
	cd pysession
	[root@web02 pysession]# django-admin startapp application
3.修改配置文件settings
	['*']
	DATABASES删掉
4.测试在那个根目录下执行
	python3 manage.py runserver 0.0.0.0:8001

session

1.设置session /opt/pysession/pysession/settings
#设置session的存储方式,使用指定文件方式存储session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'
    SESSION_FILE_PATH = '/tmp' #指定session保存路径

2.使用session  #修改/opt/application/views.py
	2.1设置session   ;request.session['code'] = 'web02'
		#先清空内容
[root@web02 pysession]# vim application/views.py 
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页面  # vim /opt/pysession/pysession/urls.py  先清空

[root@web02 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),
]

4、测试
	[root@web02 pysession]# python3 manage.py runserver 0.0.0.0:8001
	4.1把myuwsgi.ini复制过来并编写,然后把/opt/pysession通过scp传给web01 web03
            cp ../gailun/myuwsgi.ini ./
            [uwsgi]
            #上面的是跟yum源一样
            # 端口号socket django启动之后的端口号
            socket            = :8001
            # 指定项目的目录 指的是项目名称
            chdir           = /opt/pysession
            # wsgi文件路径
            wsgi-file       = pysession/wsgi.py
            # 模块wsgi路径 和外面的名字一样
            module          = pysession.wsgi
            # 是否开启master进程
            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 /]# 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、挂载 记得安装nfs-utils
[root@web02 ~]# mount -t  nfs 172.16.1.31:/session /tmp/
[root@web03 ~]# mount -t  nfs 172.16.1.31:/session /tmp/

posted @ 2021-10-31 12:09  迪迦张  阅读(38)  评论(0编辑  收藏  举报