反向代理的基本概念

客户机再发送请求时不会直接发送到目的主机,而是先发送给代理服务器,代理服务器接受客户机请求后,再向主机发出,并接受目的主机返回的数据,存放再代理服务器硬盘中,再返回给客户机

数据流向如下:

client----send----->代理server----send----->目标server

client<----send-----代理server<----send-----目标server

反向代理的优点避免用户直接访问到业务主机,可以节省IP,避免业务主机直接再公网提供服务,提高一定的安全性。

一般情况下使用中间代理服务器处理静态页面的请求,降低业务主机的压力,增加访问速度,客户体验度高。

反向代理实现

准备

客户端 web访问测试
代理端 反向代理功能
业务端 提供业务数据

配置:

修改配置文件server中得location

        location / {
            proxy_pass http://IP:port;
        }

通过客户端做访问测试,与设置得web页面相同即可

常用优化配置:

        location / {
            proxy_pass http://IP:port;##请求转向的服务器列表    
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;##提取用户IP
            client_max_body_size 10m;#允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数
            proxy_connect_timeout 90;#nginx和后端服务器连接超时时间
            proxy_send_timeout 90;#后端服务器数据回传超时时间
            proxy_read_timeout 90;#连接成功后后端服务器响应超时时间
            proxy_buffer_size 4k;#代理服务器保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;#缓冲区网页平均在32k以下
            proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值将从upstream服务器传
            }

限速

生活中常见的用到限速的有百度网盘、迅雷等软件

从运维角度来说,限速的特性可以限制某个用户在一个给定的时间内产生的htpp请求数,请求可以简单到就是一个对于主页的get请求或者一个登陆表格的pst请求

限速也可以用于安全目的上,比如暴力密码破解***,通过限制进来的请求速率,并且(结合)日志标记出目标URLs来帮助防范DDOS***,一般来说限流用在保护上游应用服务器不被在同一时刻的大量用户请求淹没。

限速的原理(漏桶原理)

算法思想:

  • 水(请求)从上方放入水桶

  • 水从出水口流出(被处理)

  • 来不及流出的水存在水桶中(缓冲),以固定速率流出

  • 水桶满后水溢出(丢弃)

  • 算法的核心:缓存请求、匀速处理、多余的请求直接丢弃

限速实现方式:

nginx限制IP连接和并发的方法有两个模块:

limit_req_zone 用来限制单位时间内的请求数,即访问速率限制

limit_req_conn 用来限制同一时间的连接数,即并发数

模块使用方法:

  • limit_req_zone 参数配置

  • syntax :limit_req_zone=name [bursh=num] [nodelay];

  • Default :-

  • context:http,server.location

示例一:访问限速

配置文件如下:

#基于IP对下载速率做限制,限制每秒处理1次请求,对突发超过5个以后的请求放入缓存区

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    #表示通过remote_addr标识来做限制,"binary"的目的是缩写内存占用量,是限制同一客户端IP地址
    #zone=test:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
    #rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/s
    limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
    server {
        listen       81;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /a {
            #zone=test 设置使用那个配置区域来做限制,与上面limit_req_zone中的name对应
            #burst=5 burst是爆发的意思,设置一个大小为5的缓冲区当有大量请求(过来时),超过访问频次限制的请求先放入缓冲区内
            #nodelay 如果设置,超过访问频次且缓冲区满额,返回503,如果没有设置,则请求会排队
            limit_req zone=test burst=5 nodelay;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

测试快速进行多次访问,使用netstat查看是否有访问等待

示例二:下载限速

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server {
        listen       81;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /a {
              #同一IP同一时间下载连接数
            limit_conn addr 1;
            #下载最大速率
            limit_rate 100k;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在html/a下生成一个大文件,不更新配置尝试下载查看下载速率和可以同时下载是否有限制

reload配置文件后:

测试:

[root@loclhost conf]# wget http://10.16.0.9:81/a/bigfile
--2019-02-17 11:32:47--  http://10.16.0.9:81/a/bigfile
Connecting to 10.16.0.9:81... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: ‘bigfile’
2% [>                                                             ] 2,150,400    100KB/s  eta 16m 42s

针对流媒体视频流,一般的视频都比较大采用这种方式,示例如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server {
        listen       81;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /a {
              #同一IP同一时间下载连接数
            limit_conn addr 1;
            #下载最大速率
            limit_rate 100k;
            #下载到多少时开始限速
            limit_rate_after 250m;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}