代理与负载均衡

代理与负载均衡

 

代理

  简介

    将流量平均分配

 

  代理方式  

    正向代理

      找完代理之后,还需要找服务器

      应用:VPN

    反向代理

      只需要找代理,不需要找服务器

      应用:负载均衡

 

  Nginx代理服务支持的协议

    ngx_http_uwsgi_module   : Python

    ngx_http_fastcgi_module    : PHP

    ngx_http_scgi_module           : Java

    ngx_http_v2_module        : Golang

    ngx_http_proxy_module        : HTTP

 

  Nginx代理实践

    部署web01

      [root@web01 conf.d]# vim game5.conf

server {
    listen 80;
    server_name 192.168.15.7;
    location / {
        root /opt/Super_Marie;
    index index.html;
    }
    location ~ /images {
        root /opt/image;
    }
}

 

    部署lb01

      部署Nginx

        # 下载Nginx源代码包

          [root@lb01 ~]# wget https://nginx.org/download/nginx-1.20.2.tar.gz

 

        # 解压

          [root@lb01 ~]# tar -xf nginx-1.20.2.tar.gz

 

        # 进入源代码目录

          [root@lb01 ~]# cd nginx-1.20.2

 

        # 安装依赖包

          [root@lb01 nginx-1.20.2]# yum install openssl openssl-devel zlib zlib-devel -y

 

        # 设置编译参数

          [root@lb01 nginx-1.20.2]# ./configure --with-http_gzip_static_module --with-stream --with-http_ssl_module

 

        # 编译

          [root@lb01 nginx-1.20.2]# make

 

        # 安装

          [root@lb01 nginx-1.20.2]# make install

 

 

        # 优化

          [root@lb01 nginx]# mkdir /etc/nginx

          [root@lb01 nginx]# mv /usr/local/nginx/conf/* /etc/nginx/

          [root@lb01 nginx]# mkdir /etc/nginx/conf.d

          [root@lb01 nginx]# groupadd www -g 666

          [root@lb01 nginx]# useradd www -u 666 -g 666 -M -r -s /sbin/nologin

 

          [root@lb01 nginx]# vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

 

          [root@lb01 sbin]# ln -s /etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf

          [root@lb01 sbin]# mv /usr/local/nginx/sbin/nginx /usr/sbin/

          [root@lb01 sbin]# mkdir /var/log/nginx

          [root@lb01 sbin]# systemctl start nginx

 

      部署反向代理

        [root@lb01 conf.d]# vim /etc/nginx/conf.d/game.conf 

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://172.16.1.7:80;
    }
}

 

  Nginx代理常用参数

    添加发往后端服务器的请求头信息

      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;

 

    代理到后端的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

proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

 

    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

 

    配置代理优化文件

      [root@lb01 ~]# vim /etc/nginx/proxy_params

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;

 

      [root@lb01 conf.d]# vim game.conf

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://172.16.1.7:80;
        include /etc/nginx/proxy_params;
    }
}

 

负载均衡 

  负载均衡的架构

    通过代理将流量按照一定的比例,转发到后端

 

  负载均衡的实现

    实现

      将后端服务打包成一个IP连接池

 

    1.反向代理

server {
       listen 80;
       server_name _;
       location / {
        proxy_pass http://[连接池];
       }
}

 

    2.IP连接池

      upstream [连接池名称] {

        server [ip]:[port];

        server [ip]:[port];

        server [ip]:[port];

      }

      [root@lb01 conf.d]# vim game.conf

upstream supermarie {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        include /etc/nginx/proxy_params;
    }
}

 

    负载均衡的比例

    轮询

      # 默认情况下,Nginx负载均衡的轮询状态

upstream supermarie {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}

    权重

      # Nginx中的权重0-100,数字越大,权重越高

upstream supermarie {
    server 172.16.1.7:80 weight=9;
    server 172.16.1.8:80 weight=5;
    server 172.16.1.9:80 weight=1;
}

    ip_hash

      # 每一个IP固定访问某一个后端

upstream supermarie {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
    ip_hash;
}

 

  负载均衡后端状态

  

    down

      # 暂时不分配流量

      [root@lb01 ~]# vim /etc/nginx/conf.d/game.conf

upstream supermarie {
    server 172.16.1.7:80 down;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        include /etc/nginx/proxy_params;
    }
}

 

    backup

      # 只有当所有的机器全部宕机,才能启动

      [root@lb01 ~]# vim /etc/nginx/conf.d/game.conf

upstream supermarie {
    server 172.16.1.7:80 backup;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        include /etc/nginx/proxy_params;
    }
}

 

    max_fails、fail_timeout

      # max_fails

      # proxy_next_upstream 后端错误标识

      [root@lb01 ~]# vim /etc/nginx/conf.d/game.conf

upstream supermarie {
    server 172.16.1.7:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.8:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.9:80 max_fails=3 fail_timeout=3s;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; 
        include /etc/nginx/proxy_params;
    }
}

 

 

 

  负载均衡部署BBS

    部署后端服务

      部署Python

      1.创建用户

        [root@web01 opt]# groupadd django -g 888

        [root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh

 

      2.安装依赖软件

        [root@web01 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y

 

      部署Django和uwsgi

      3.安装Django和uwsgi

        [root@web01 opt]# pip3 install django==1.11

        [root@web01 opt]# pip3 install uwsgi

        [root@web01 opt]# pip3 install pymysql

      4.创建项目

        [root@web01 opt]# unzip bbs.zip

        [root@web01 bbs]# pwd

          /opt/bbs

        [root@web01 bbs]# vim bbs/settings.py

ALLOWED_HOSTS = ['*']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bbs',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '172.16.1.61',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}

      # 启动测试

        [root@web01 bbs]# python3 manage.py runserver 0.0.0.0:8000

 

      配置并启动

      5.编辑项目配置文件

        [root@web01 bbs]# vim /opt/linux/myweb_uwsgi.ini

[uwsgi]
# 端口号
socket          = :8000
# 指定项目的目录
chdir           = /opt/bbs
# wsgi文件路径
wsgi-file       = bbs/wsgi.py
# 模块wsgi路径
module          = bbs.wsgi
# 是否开启master进程
master          = true
# 工作进程的最大数目
processes       = 4
# 结束后是否清理文件
vacuum          = true

      6.启动uwsgi

        [root@web01 bbs]# uwsgi -d --ini myweb_uwsgi.ini --uid 666

 

      7.编辑Nginx配置文件

        [root@web01 bbs]# vim /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 bbs.wsgi;
        uwsgi_param UWSGI_CHDIR /opt/bbs;
        index  index.html index.htm;
        client_max_body_size 35m;
    }
}

 

      8.重启Nginx配置

        [root@web01 bbs]# systemctl restart nginx

 

    部署负载均衡

      [root@lb01 conf.d]# vim python.conf

upstream bbs {
    server 172.16.1.7:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.8:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.9:80 max_fails=3 fail_timeout=3s;
}

server {
    listen 80;
    server_name py.test.com;
    location / {
        proxy_pass http://bbs;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; 
        include /etc/nginx/proxy_params;
    }
}

 

      

END

 

posted @ 2022-01-06 19:49  Snails蜗牛  阅读(79)  评论(0)    收藏  举报