• 为 client 代理多个服务器
    • 可以隐藏真实服务器
    • 便于扩展后端服务器
    • 适合动静分离

定义上流服务信息

指令

  • upstream <style_name>

    • 段名,中间定义上游服务 URL 等信息
    • 上下文 http
    • 默认值 nothing
  • server <address> [<paramters>]

    • 定义上游服务器地址
    • 上下文 upstream
    • 默认值 nothing
    • 参数
      • address 上游服务器地址
      • paramter,可以逗号分割
        • weight=<number> 设置权重值,默认 1
        • max_conns=<number> 上游服务器的最大并发连接数
          • 可以用于限流
        • fail_timeout=<time> 服务器不可用的判断时间,不可用时,在该时间段后会重新尝试
        • max_fails=<number> 服务器不可用的检查次数
        • backup 标记为备份服务器,仅当其他服务器不可用时使用
        • down 标记服务器长期不可用,离线维护
  • zone <style_key> [size]

    • 定义共享内存,用于跨 worker process
    • 上下文 upstream
    • 默认值 nothing
  • keepalive <connections>

    • 每个 worker process 与上游服务器空闲长连接的最大数量
    • 上下文 upstream
    • 默认值 nothing
  • keepalive_requests <number>

    • 设置一个长连接最多 http 请求个数
    • 上下文 upstream
    • 默认值 100
  • keepalive_timeout <time>

    • 空闲时,一个长连接的超时时长
    • 上下文 upstream
    • 默认值 60s

负载均衡算法指令

  • hash <variable> [consistent]

    • 根据给定变量进行哈希负载均衡
    • 上下文 upstream
    • 默认值 nothing
  • ip_hash

    • 依据 ip 进行 hash 计算的负载均衡
    • 上下文 upstream
    • 默认值 nothing
  • least_conn

    • 最少连接数负载均衡算法
      • 默认编译了nginx_http_upstream_least_conn_module
      • 需要配合 zone <style_key> [size] 保存上游服务器的连接信息
    • 上下文 upstream
    • 默认值 nothing
  • least_time

    • 最短响应时间负载均衡算法
    • 上下文 upstream
    • 默认值 nothing
  • random

    • 随机负载均衡算法
    • 上下文 upstream
    • 默认值 nothing

反向代理

  • http_proxy_module,http 代理
  • 默认编译进 nginx

主要指令

  • proxy_pass <URL> | Syntax: | **proxy_pass**URL; | | :—- | —- | | Default: | — | | Context: | location, if in location, limit_except | | Desc: | 设置请求转发地址 | | Params: |
    - URL
    - 必须 http https 开头, 可以使用 upstream 的名称
    - 可以携带变量
    - 注意: URL 是否带 / ,会直接影响发往上游请求的 URL
    - 不带,nginx 会原样发往上游服务器
    - 带,nginx 会将发往上游服务器的 URL 中 剔除 location
    - 比如 location /test/ {}, URL 是 /test/a.html,发往上游服务器的 URL 会被改为 a.html
    |

处理 request body 的指令

  • proxy_request_buffering on | off | Syntax: | **proxy_request_buffering**on|off; | | :—- | —- | | Default: | proxy_request_buffering on; | | Context: | http, server, location | | Desc: |
    - 是否开启 request body 缓存
    - 其他配置项 proxy_buffer sizeproxy_buffersproxy_busy_buffers_size
    | | Params: |
    - on, nginx 会接收完整的 request body 再转发
    - 适合高并发,nginx 处理快
    - 适合上游服务器并发能力不足
    - off, nginx 会一边接收 request body 一边转发
    - 及时的响应
    - 减少 nginx 磁盘IO
    |

This directive appeared in version 1.7.11.
ngx_http_core_module

  • client_max_body_size <size> | Syntax: | **client_max_body_size**size; | | :—- | —- | | Default: | client_max_body_size 1m; | | Context: | http, server, location | | Desc: |
    - 可以处理请求体最大大小,上传文件也有关
    - request body 过大,nginx 会返回 413
    |

ngx_http_core_module

  • client_body_buffer_size <size> | Syntax: | **client_body_buffer_size**size; | | :—- | —- | | Default: | client_body_buffer_size 8k|16k; | | Context: | http, server, location | | Desc: |
    - proxy_request_buffering 开启时,设置缓存大小
    - 如果 request body 小于 client_max_body_sizeclient_body_buffer_size,会存储到内存中
    - 如果 request body 大于缓存,会存储到 client_body_temp_path <path> 指定目录中,造成磁盘IO
    |

ngx_http_core_module

  • client_body_in_single_buffer on | off | Syntax: | **client_body_in_single_buffer**on|off; | | :—- | —- | | Default: | client_body_in_single_buffer off; | | Context: | http, server, location | | Desc: | proxy_request_buffering 开启时,request body 会尽可能存储到连续的内存空间中,但是如果 request body 超过 client_body_buffer_size,会写入磁盘文件,该指令就无效了 |

ngx_http_core_module

  • client_body_temp_path <path> [level1] [level2] [level3]
Syntax: **client_body_temp_path**path[level1[level2[level3]]];
Default: client_body_temp_path client_body_temp;
Context: http, server, location
Desc: 如果 request body 大于 client_body_buffer_size 设置的缓存,会存储到指定目录中,造成磁盘IO

ngx_http_core_module

  • client_body_in_file_only on | clean | off | Syntax: | **client_body_in_file_only**on|clean|off; | | :—- | —- | | Default: | client_body_in_file_only off; | | Context: | http, server, location | | Desc: | request body 是否会存储到磁盘文件中,无视 proxy_request_buffering 的判断 | | Params: |
    - on,写入 client_body_temp_path 设置的磁盘文件中,接收完毕不删除文件
    - clean,写入 client_body_temp_path 设置的磁盘文件中,接受完毕删除文件
    - off, 不开启该功能
    |

ngx_http_core_module

  • client_body_timeout <time> | Syntax: | **client_body_timeout**time; | | :—- | —- | | Default: | client_body_timeout 60s; | | Context: | http, server, location | | Desc: | request body 接收超时时间 |

ngx_http_core_module

修改 request

修改请求行

  • proxy_method <method>

    • 修改 request 方法
    • 上下文 http server location
    • 默认值 nothing
  • proxy_http_version 1.0 | 1.1

    • 修改 request http 版本
      • 1.1 才能支持长连接
    • 上下文 http server location
    • 默认值 1.0

修改请求头

  • proxy_set_header <field> <value>

    • 修改 request header 的字段
    • 上下文 http server location
    • 默认值
      • proxy_set_header Host $proxy_host
      • proxy_set_header Connection close
        • 长连接需要设置为 keepalive 并且 proxy_http_version 1.1
  • proxy_pass_request_header on | off

    • 是否全部 request header 原样转发
    • 上下文 http server location
    • 默认值 on

修改请求体

  • proxy_set_body <value>

    • 设置 request body 内容
    • 上下文 http server location
    • 默认值 nothing
  • proxy_pass_request_body on | off

    • 是否全部 request body原样转发
    • 上下文 http server location
    • 默认值 on

keepalive

client -> nginx

  • keepalive_timeout <time>

nginx -> 上游服务器

upstream module

  • keepalive <connections>
  • keepalive _request <number>
  • keepalive_timeout <time>

proxy module

  • proxy_connect_timeout <time>

    • proxy nginx 和上游服务器 tcp 连接的超时时间
    • 上下文 http server location
    • 默认值 60s
  • proxy_socket_keepalive on | off

    • 是否复用 os 的 socket 长连接
    • 上下文 http server location
    • 默认值 off
  • proxy_send_timeout <time>

    • proxy nginx 向上游服务器的超时时间
    • 上下文 http server location
    • 默认值 60s
  • proxy_ignore_client_bort on | off

    • 是否开启忽略客户端主动放弃 keepalive
    • 上下文 http server location
    • 默认值 off

容错

  • proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off

    • 出现问题,可以转发到其他上游服务器
      • 可以写多个值
    • 上下文 http server location
    • 默认值 proxy_next_upstream error timeout
    • 参数
      • error 传输请求或者读取响应头发生错误
      • timeout 传输请求或者读取响应头发生超时
      • invalid_header 上游服务器返回无效的响应
      • http_xxx 响应状态码为xxx 时
      • non_idempotent 非幂等请求失败时是否需要转发下一台上游服务器
        • 比如 POST 请求
      • off 禁用请求失败转发功能
  • proxy_next_upstream_timeout <time>

    • 尝试调度超时时间
    • 上下文 http server location
    • 默认值 0 ,无限制等待
  • proxy_next_upstream_tries <times>

    • 尝试调度次数, 超过次数直接返回 client 错误
    • 上下文 http server location
    • 默认值 0 ,允许转发无限次
  • proxy_intercept_errors on | off

    • 当上游服务器返回响应状态码大于 300 时
      • on 按照 error_page 处理
      • off 将该响应返回客户端
    • proxy_next_upstream http_xxx 有冲突
    • 上下文 http server location
    • 默认值 on