zoukankan      html  css  js  c++  java
  • 006.Nginx访问控制

    一 Nginx 连接限制

    1.1 HTTP协议的连接与请求

    HTTP是建立在TCP, 一次HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上再进行HTTP请求。
    HTTP请求建立在一次TCP连接基础上,对于HTTP会话,一次TCP连接可以建立多次HTTP请求。
    HTTP协议版本
    连接关系
    HTTP1.0
    TCP不能复用
    HTTP1.1
    顺序性TCP复用
    HTTP2.0
    多路复用TCP复用

    1.2 相关模块

    Nginx自带的limit_conn_module模块(TCP连接频率限制模块)和limit_req_mudule模块(HTTP请求频率限制模块)支持对连接频率以及请求频率、来源进行限制,通常可可以用来防止DDOS攻击。
    配置语法:
    语法
    范围
    说明
    limit_conn_zone 标识 zone=空间名:空间大小;
    http
    用于声明一个存储空间
    limit_conn 空间名 并发限制数;
    http、server、location
    用于限制某个存储空间的并发数量
    limit_conn_log_level 日志等级;
    http、server、location
    当达到最大限制连接数后, 记录日志的等级
    limit_conn_status 状态码;
    http、server、location
    当超过限制后,返回的响应状态码,默认是503
    limit_req_zone key zone=空间名:空间大小 rate=每秒请求数;
    http
    用于声明一个存储空间
    limit_req zone=空间名 [burst=队列数] [nodelay];
    http、server、location
    用于限制某个存储空间的并发数量

    1.3 配置方式

    limit_conn_zone和limit_req_zone会声明一个zone空间来记录连接状态, 才能限制数量。
    zone是存储连接状态的空间, 以键值对存储, 通常以客户端地址$binary_remote_addr作为key来标识每一个连接。
    当zone空间被耗尽,服务器将会对后续所有的请求返回503(Service Temporarily Unavailable) 错误。

    1.4 常见策略

    示例如下:
      1 http {
      2     limit_req_zone $binary_remote_addr zone=req_zone:1m rate=10r/s;
      3 }
     
    释义:定义一个req_zone的zone,设定1m空间大小,每秒10个请求数。
    提示:burst和nodelay对并发请求设置了一个缓冲区和是否延迟处理的策略。
     
    场景一:limit_req zone=req_zone;(即连接数等于请求数)
    • 若第1秒发送10个请求, 正常响应。
    • 若第1秒发送13个请求, 前10个请求正常响应, 后3个请求返回503(Service Temporarily Unavailable)。
    提示:不加brust和nodelay的情况下, rate=10r/s每秒只能执行10次请求, 多的直接返回503错误。
     
    场景二:limit_req zone=req_zone brust=5;(即添加brust=5)
    • 第1秒发送10个请求, 正常响应。
    • 第1秒发送13个请求, 前10个请求正常响应, 后3个请求放入brust等待响应。
    • 第1秒发送20个请求, 前10个请求正常响应, 后5个请求放入brust等待响应, 最后5个请求返回503(Service Temporarily Unavailable), 第2秒执行brust中的5个请求。
    • 第1秒发送20个请求, 前10个请求正常响应, 后5个请求放入brust等待响应, 最后5个请求返回503(Service Temporarily Unavailable), 第2秒发送6个请求, 执行brust中的5个请求, 将5个请求放入brust等待响应, 剩下的1个请求返回503(Service Temporarily Unavailable)。
    提示:加brust=5不加nodelay的情况下, 有一个容量为5的缓冲区, rate=10r/s每秒只能执行10次请求, 多的放到缓冲区中, 如果缓冲区满了, 就直接返回503错误。而缓冲区在下一个时间段会取出请求进行响应, 如果还有请求进来, 则继续放缓冲区, 多的就返回503错误。
     
    场景三:limit_req zone=req_zone brust=5 nodelay;(同时添加brust=5和nodelay)
    • 第1秒发送10个请求, 正常响应。
    • 第1秒发送13个请求, 13个请求正常响应。
    • 第1秒发送20个请求, 前15个请求正常响应, 后5个请求返回503(Service Temporarily Unavailable)。
    • 第1秒发送20个请求, 前15个请求正常响应, 后5个请求返回503(Service Temporarily Unavailable), 第2秒发送6个请求, 正常响应。
    提示:加brust=5和nodelay的情况下, 有一个容量为5的缓冲区, rate=10r/s每秒能执行15次请求, 15=10+5。多的直接返回503错误。

    1.5 连接限制配置

      1 [root@nginx01 ~]# mkdir /usr/share/nginx/limit/
      2 [root@nginx01 ~]# echo '<h1>Limit</h1>' > /usr/share/nginx/limit/index.html
      3 
      4 [root@nginx01 ~]# vi /etc/nginx/nginx.conf
      5 ……
      6 http {
      7     limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
      8     limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
      9 ……
     10 }
     
    提示:$binary_remote_addr和$remote_addr代表的含义是一样的(远程主机的IP),只是使用$binary_remote_addr存储一个IP会比remote_addr省10个字节。
      1 [root@nginx01 ~]# vi /etc/nginx/conf.d/limit.conf
      2 server {
      3     server_name  limit.linuxds.com;
      4     location / {
      5         root   /usr/share/nginx/limit;
      6         index  index.html;
      7         limit_conn conn_zone 1;		#引用全局中的连接限制zone,并设置同一时刻只允许一个客户端连接
      8         limit_req zone=req_zone;	#引用全局中的请求限制zone
      9         #limit_req zone=req_zone burst=3 nodelay;	#参考场景三,此处注释
     10     }
     11 }
     
      1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
      2 [root@nginx01 ~]# nginx -s reload			#重载配置文件
     
    释义:
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m:http段定义一个连接限制zone;
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s:http段定义一个请求限制zone, rate为限制速率,限制一秒钟最多一个请求;
    注意:多个请求可以建立在一次的TCP连接之上,因此通过对请求的限制,可以实现更精细的控制,粒度更细。因此请求限制相对比连接限制更优。

    1.6 测试验证

      1 [root@client ~]# yum -y install httpd-tools
      2 [root@client ~]# ab -n 50 -c 10 http://limit.linuxds.com/index.html
     
    clipboard

    二 Nginx IP限制

    2.1 相关模块

    http_access_module:该模块可实现基于IP的访问控制,但通过代理可以绕过限制。
    语法
    范围
    说明
    allow IP地址 | CIDR网段 | unix: | all;
    http、server、location、limit_except
    允许IP地址、CIDR格式的网段、unix套接字或所有来源访问
    deny IP地址 | CIDR网段 | unix: | all;
    http、server、location、limit_except
    禁止IP地址、CIDR格式的网段、unix套接字或所有来源访问
    提示:allow和deny会按照顺序,从上往下,找到第一个匹配规则,判断是否允许访问,因此一般把all放最后。

    2.2 IP访问控制配置

      1 [root@nginx01 ~]# mkdir /usr/share/nginx/ipaccess/
      2 [root@nginx01 ~]# echo '<h1>Ipaccess</h1>' > /usr/share/nginx/ipaccess/index.html
      3 
      4 [root@nginx01 ~]# vi /etc/nginx/conf.d/ipaccess.conf
      5 server {
      6     server_name  ipaccess.linuxds.com;
      7     location / {
      8         root   /usr/share/nginx/ipaccess;
      9         index  index.html;
     10         deny 115.205.87.7;			#拒绝特定IP
     11         allow all;				#允许其他所有
     12     }
     13 }
     
      1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
      2 [root@nginx01 ~]# nginx -s reload			#重载配置文件
     

    2.3 测试验证

    浏览器访问:ipaccess.linuxds.com。
    clipboard
    [root@client ~]# curl ipaccess.linuxds.com
    <h1>Ipaccess</h1>
    注意:nginx的访问控制限制是针对客户端的IP来进行限制的,但是nginx并不确定真正的客户端是哪个,凡是和nginx进行交互的都被当做是客户端。即remote_addr是直接和nginx通信的IP,若不是直接访问到服务端而是由中间代理进行,访问控制这时就会失效。
    clipboard
    优化方法:
    方法一:采用http头信息控制访问,如HTTP_X_FORWARD_FOR
    方法二:结合geo模块
    方法三:通过HTTP自定义变量传递
    http_x_forwarded_for头信息控制访问会更好的解决该问题,它要求访问时必须带上所有用到的ip的地址信息,如下图所示:
    clipboard

    三 Nginx 账号限制

    3.1 相关模块

    http_auth_basic_module:基于文件匹配用户密码的登录。
    语法
    范围
    说明
    auth_basic 请输入你的帐号密码 | off;
    (默认关闭)
    http、server、location、limit_except
    显示用户登录提示 (有些浏览器不显示提示)
    auth_basic_user_file 存储帐号密码的文件路径;
    http、server、location、limit_except
    从文件中匹配帐号密码
    提示:密码加密方式有多种,通常可使用htpasswd来生成密码文件,htpasswd需要安装yum install -y httpd-tools。

    3.2 账号访问控制设置

      1 [root@nginx01 ~]# mkdir /usr/share/nginx/account/
      2 [root@nginx01 ~]# mkdir /etc/nginx/passwd/
      3 [root@nginx01 ~]# echo '<h1>Account</h1>' > /usr/share/nginx/account/index.html
     
     
      1 [root@nginx01 ~]# vi /etc/nginx/conf.d/account.conf
      2 server {
      3     server_name  account.linuxds.com;
      4     location / {
      5         root   /usr/share/nginx/account;
      6         index  index.html;
      7         auth_basic "Auth access test! input your password!";
      8         auth_basic_user_file /etc/nginx/passwd/auth_conf;
      9     }
     10 }
     
      1 [root@nginx01 ~]# yum -y install httpd-tools
      2 [root@nginx01 ~]# htpasswd -c /etc/nginx/passwd/auth_conf xhy
      3 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
      4 [root@nginx01 ~]# nginx -s reload				#重载配置文件
     
    提示:htpasswd -c 创建新文件, -b可在参数中直接输入密码。

    3.3 测试验证

    浏览器访问:account.linuxds.com。
    clipboard
    输入xhy及密码。
    clipboard
    提示:
    通过账户控制存在如下局限性:
    • 用户信息依赖文件;
    • 操作管理机械,配置效率低。
    优化方法:
    方法一:nginx结合LUA实现高效验证;
    方法二:nginx配合LDAP打通,利用nginx-auth-ldap模块。

    四 Nginx 流量限制

    4.1 相关模块

    http_core_moduleblock:设置除了指定的http methods外其他method将被限制,允许GET就自动允许HEAD方法。
    语法
    范围
    说明
    limit_rate rate;
    默认值为0,即关闭限速。
    http、server、location
    限制向客户端传送响应的速率限制。
    limit_rate_after size;
    默认值为0,即关闭限速。
    http、server、location
    设置不限速传输的响应大小。
    提示:limit_rate 参数 rate 的单位是字节/秒,设置为 0 将关闭限速。 nginx 按连接限速,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的 2 倍。limit_rate_after设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。

    4.2 限速设置

    设置《005.Nginx配置下载站点》中的下载站点速度:
      1 server {
      2 ……
      3     limit_rate_after 3m;
      4     limit_rate 20k;
      5     }
      6 }
     
      1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
      2 [root@nginx01 ~]# nginx -s reload				#重载配置文件
     

    4.3 测试验证

    浏览器访问:http://download.linuxds.com/down/,然后下载相应文件测试速度限制。
    参考:
    https://www.cnblogs.com/cheyunhua/p/9640281.html
    https://www.cnblogs.com/crazymagic/p/11012991.html
  • 相关阅读:
    Oracle 推出 ODAC for Entity Framework 和 LINQ to Entities Beta版
    Entity Framework Feature CTP 5系列文章
    MonoDroid相关资源
    MSDN杂志上的Windows Phone相关文章
    微软学Android Market推出 Web Windows Phone Marketplace
    使用 Visual Studio Agent 2010 进行负载压力测试的安装指南
    MonoMac 1.0正式发布
    Shawn Wildermuth的《Architecting WP7 》系列文章
    使用.NET Mobile API即51Degrees.mobi检测UserAgent
    MongoDB 客户端 MongoVue
  • 原文地址:https://www.cnblogs.com/itzgr/p/13277903.html
Copyright © 2011-2022 走看看