- 为 client 代理多个服务器
- 可以隐藏真实服务器
- 便于扩展后端服务器
- 适合动静分离
定义上流服务信息
- upstream 模块
- 默认编译入 nginx 中
- http://nginx.org/en/docs/http/ngx_http_upstream_module.html
指令
upstream <style_name>
- 段名,中间定义上游服务 URL 等信息
- 上下文 http
- 默认值 nothing
server <address> [<paramters>]
- 定义上游服务器地址
- 上下文 upstream
- 默认值 nothing
- 参数
- address 上游服务器地址
- paramter,可以逗号分割
weight=<number>
设置权重值,默认 1max_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 size
、proxy_buffers
、proxy_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_size
和client_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
- 修改 request http 版本
修改请求头
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
- 长连接需要设置为 keepalive 并且
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
- 当上游服务器返回响应状态码大于 300 时