day10 负载均衡
阅读原文时间:2023年07月09日阅读:1

day10 负载均衡

正向代理:即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端。
# (内部上网) 客户端 <—> 代理 -> 服务端

反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端。
# 反向代理,用于公司集群架构中,客户端 -> 代理 <—> 服务端

正向代理的用途:
    1、访问原来无法访问的资源,如google
    2、可以做缓存,加速访问资源
    3、对客户端访问授权,上网进行认证
    4、代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理的用途:
    1、保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
    2、负载均衡,通过反向代理服务器来优化网站的负载

正向代理和反向代理的区别:
    1、区别在于形式上服务的”对象”不一样
    2、正向代理代理的对象是客户端,为客户端服务
    3、反向代理代理的对象是服务端,为服务端服务

    格式:
        upstream [连接池名称] {
            server [ip]: [端口] [分布策略]
        }
        proxy_pass http://[连接池的名字]     # 调用

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)测试