connect和request区别

  • connect 是 tcp 连接过程
  • request 是 http 请求

http-limit-conn-module

  • 对 client connection 数做限制,善用此模块能够对 cc、ddos等此类的攻击进行有效的防御。
  • 默认编译进 nginx
  • 使用共享内存,对所有 worker process 起作用

指令

  • limit_conn_zone <key> zone=<name>:<size>
Syntax: **limit_conn_zone**key`zone=_name_:_size_;`
Default:
Context: http
Desc: 设置限速会话状态存储区域
Params:
- key 是一个唯一性标识,一般可以用内置变量,比如 $binary_remote_addr
- name 是一个名称,随意设置
- size 是共享内存的大小
  • limit_conn_status <code>

    • 限速行为发生后的返回状态码
    • 上下文: http server location
    • 默认值 503
  • limit_conn_log_level info | notice | warn | error

    • 限速行为发生后的日志记录等级
    • 上下文: http server location
    • 默认值 error
  • limit_conn <zone> <number>

    • 限速阈值设置
    • 上下文: http server location
    • 默认值 nothing
    • 参数介绍
      • zone: limit_conn_zone 中设置的 name \
      • number: 限速阈值

http_limit_req_module

  • 用于限制 client 处理 request 平均速率
  • 默认编译进 nginx
  • 使用共享内存,对所有 worker process 进程生效
  • 限流算法: leaky_bucket(漏桶算法)

指令

  • limit_req_zone key zone=<name>:<size> rate=<rate>

    • 设置限速会话状态存储区域、以及处理速率
    • 上下文 http
    • 默认值 nothing
    • 参数介绍
      • key 是一个唯一性标识,一般可以用内置变量,比如 $binary_remote_addr
      • name 是一个名称,随意设置
      • size 是共享内存的大小
      • rate 是处理请求平均速率,比如 2r/m(每分钟平均2次,一次请求处理后 30s 后才处理,因为平均)
  • limit_req_status <code>

    • 限速行为发生后的返回状态码
    • 上下文: http server location
    • 默认值 503
  • limit_conn_log_level info | notice | warn | error

    • 限速行为发生后的日志记录等级
    • 上下文: http server location
    • 默认值 error
  • limit_req zone=<name> [burst=<number>] [nodelay | delay=<number>]

    • 限速阈值设置
    • 上下文: http server location
    • 默认值 nothing
    • 参数介绍
      • zone: limit_req_zone 中设置的 name
      • number: 限速阈值,桶的大小

access module

  • 限制 ip 和网段访问
    • 根据 $remote_addr 做限制
  • 下面的可以组合、多次使用

指令

  • allow address | CIDR | UNIX | all

    • 放行访问地址
    • 上下文: http server location limit_except
    • 默认值 nothing
    • 参数
      • address: ip/网段地址
      • CIDR:
      • UNIX:
      • all: 所有可访问
  • deny address |CIDR | UNIX | all

    • 拒绝访问地址
    • 上下文: http server location limit_except
    • 默认值 nothing
    • 参数
      • address: ip/网段地址
      • CIDR:
      • UNIX:
      • all: 所有可访问
    • 可以配合 allow 指令多次使用,最后用 deny all 拒绝

局限性

  1. 该模块通过判断 $remote_addr 来进行空值,如果客户端经过了代理,可能导致无法通过、

解决方式

  1. 采用别的 HTTP 请求头空值访问,比如 HTTP_X_FORWARD_FOR
    1. http_x_forwarded_for = Client_IP,Proxy(1)_IP,Proxy(2)_IP
  2. 结合 geo 模块
  3. 通过 HTTP 自定义变量传递

auth_basic_module

  • 限制特定用户的访问
    • 基于 http basic authentication 协议进行用户名密码认证
  • 默认编译进 nginx

指令

  • auth_basic <string> | off

    • 上下文: http server location limit_except
    • 默认值 off
    • 参数
      • string: 开启,并且用于设置提示用户的语句
      • off: 关闭
  • auth_basic_user_file <file>

    • 上下文 http server location limit_exept
    • 默认值 nothing
    • 参数
      • file: 密钥文件,存储用户和密码
    • 密钥文件
      • httpd-tools 软件包下的 htpasswd 命令
      • 生成新的密码文件 htpasswd -b -c
      • 添加新用户密码 htpasswd -b

auth_request_module

  • 基于子请求收到的 http 响应码做访问控制
  • 用户访问服务时,nginx 会先访问指定的鉴权服务器,如果通过鉴权(返回 200),nginx 才会响应源内容
  • 默认未编译进 nginx
    • 通过 —with-http_auth_request_module 启用

命令

  • auth_request <uri> | off

    • 是否开启请求鉴权
    • 上下文 http server location
    • 默认值 off
    • 参数
      • uri: 鉴权服务器的 uri
  • auth_request_set $variable <value>


    • 上下文 http server location
    • 默认值 nothing