ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux代理与负载均衡

2022-01-06 23:03:36  阅读:115  来源: 互联网

标签:负载 http server nginx proxy 均衡 Linux 80 root


一、代理

1.1 什么是代理

代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等),如下图所示:

img

1.2 没有代理

在没有代理模式的情况下,客户端和Nginx服务端,都是客户端直接请求服务端,服务端直接响应客户端。

img

1.3 有代理

那么在互联网请求里面,为了安全客户端往往无法直接向服务端发起请求,就需要用到代理服务,来实现客户端和服务端通信,如下图所示

img

1.4 Nginx代理服务常见模式

Nginx作为代理服务,按照应用场景模式进行总结,代理分为:

  • 正向代理
  • 反向代理
  1. 正向代理

    正向代理,(内部上网) 客户端 <—> 代理 -> 服务端

    img

  2. 反向代理

    反向代理,用于公司集群架构中,客户端 -> 代理 <—> 服务端

    img

  3. 正向代理与反向代理的区别

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

二、Nginx代理服务支持协议

2.1 支持的协议

img

2.2 反向代理使用协议

img

2.3 模块总结

反向代理模式与Nginx代理模块总结如表格所示:

反向代理模式 Nginx*配置模块*
http、websocket、https、tomcat(java程序) ngx_http_proxy_module
fastcgi(php程) ngx_http_fastcgi_module
uwsgi(python) ngx_http_uwsgi_module
grpc(go程序)golang ngx_http_v2_module

三、Nginx代理实践

3.1 环境准备

主机 IP 身份
lb01 172.16.1.5 代理
web01 172.16.1.7 web服务端

3.2 部署web01

[root@web01 conf.d]# cat game5.conf 
server {
    listen 80;
    server_name 192.168.15.7;
    location / {
        root /opt/Super_Marie;
		  index index.html;
    }
    location ~ /images {
        root /opt/image;
    }
}

3.3 部署lb01

  1. 部署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 
    
  2. 部署反向代理

    [root@lb01 conf.d]# cat /etc/nginx/conf.d/game.conf 
    server {
        listen 80;
        server_name _;
        location / {
            proxy_pass http://172.16.1.7:80;
        }
    }
    

四、Nginx代理常用参数

4.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;

4.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

4.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

4.4 配置代理优化文件

[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;

4.5 代理调用优化文件

[root@lb01 ~]# vim /etc/nginx/conf.d/linux.proxy.com.conf 
server {
    listen 80;
    server_name linux.proxy.com;
 
    location / {
        proxy_pass http://10.0.0.7:80;
        include proxy_params;
    }
}

五、负载均衡

5.1 什么是负载均衡

即将请求平均地分配给后端服务器

5.2 为什么要使用负载均衡

当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现负载的分发。那么会大大提升系统的吞吐率、请求性能、高容灾

往往我们接触的最多的是SLB(Server Load Balance)负载均衡,实现最多的也是SLB、那么SLB它的调度节点和服务节点通常是在一个地域里面。那么它在这个小的逻辑地域里面决定了他对部分服务的实时性、响应性是非常好的。

所以说当海量用户请求过来以后,它同样是请求调度节点,调度节点将用户的请求转发给后端对应的服务节点,服务节点处理完请求后在转发给调度节点,调度节点最后响应给用户节点。这样也能实现一个均衡的作用,那么Nginx则是一个典型的SLB

img

5.3 负载均衡的叫法

  1. 负载均衡
  2. 负载
  3. LB
  4. Load Balance

5.4 公有云中常见的负载均衡

  1. SLB #阿里云产品
  2. LB #青云产品
  3. CLB #腾讯云产品
  4. ULB #Ucloud产品

5.5 负载均衡软件

  1. nginx

  2. Haproxy

  3. LVS

5.6 负载均衡类型

  • 四层负载均衡
    所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑

  • 七层负载均衡
    七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB

  • 四层和七层负载均衡的区别
    四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。
    但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。
    注意:四层负载均衡不识别域名,七层负载均衡识别域名

六、负载均衡的实现

6.1 实现

将后端服务打包成一个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]# cat 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;
    }
}

6.2 负载均衡的比例

  • 轮询

    # 默认情况下,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;
    }
    

6.3 负载均衡的后端状态

状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
  • down

    # 暂时不分配流量
    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

    # 只有当所有的机器全部宕机,才能启动。
    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 ~]# cat /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;
        }
    }
    
    
    
    
    注意:proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; 
    
    error             # 与服务器建立连接,向其传递请求或读取响应头时发生错误;
    timeout           # 在与服务器建立连接,向其传递请求或读取响应头时发生超时;
    invalid_header    # 服务器返回空的或无效的响应;
    http_500          # 服务器返回代码为500的响应;
    http_502          # 服务器返回代码为502的响应;
    http_503          # 服务器返回代码为503的响应;
    http_504          # 服务器返回代码504的响应;
    http_403          # 服务器返回代码为403的响应;
    http_404          # 服务器返回代码为404的响应;
    http_429          # 服务器返回代码为429的响应(1.11.13);
    non_idempotent    # 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求;
    off               # 禁用将请求传递给下一个服务器。
    

七、负载均衡部署BBS

7.1 部署后端服务(web02,web03)

  1. 部署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
    
  2. 部署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@web03 bbs]# pwd
    /opt/bbs
    [root@web03 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
    
  3. 配置并启动

    5、编辑项目配置文件
    [root@localhost ~]# cat /opt/bbs/myweb_uwsgi.ini
    [uwsgi]
    # 端口号
    socket          = :8002
    # 指定项目的目录
    chdir           = /opt/bbs
    # wsgi文件路径
    wsgi-file       = bbs/wsgi.py
    # 模块wsgi路径
    module          = bbs.wsgi
    # 是否开启master进程
    master          = true
    # 工作进程的最大数目
    processes       = 4
    # 结束后是否清理文件
    vacuum          = true
    
    6、启动uwsgi
    [root@web01 linux]# uwsgi -d --ini myweb_uwsgi.ini --uid 888
    
    -d 	  : 以守护进程方式运行
    --ini : 指定配置文件路径
    --uid : 指定uid
    
    TCP 服务
    
    7、编辑Nginx配置文件
    [root@localhost ~]# cat /etc/nginx/conf.d/python.conf 
    server {
        listen 80;
        server_name bbs.test.com;
        location / { 
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8002;
            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配置
    systemctl restart nginx
    

7.2 部署负载均衡

[root@lb01 conf.d]# cat 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 bbs.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;
    }
}


#访问测试
http://bbs.test.com/

标签:负载,http,server,nginx,proxy,均衡,Linux,80,root
来源: https://www.cnblogs.com/JZjuechen/p/15773254.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有