负载均衡
Round-Robin
upstream name {...}
指定一组上游服务器
功能:依次轮询挨个进行的方式。在加权(4C8G 8C16G权重不同)轮询的方式访问。
基于客户端ip地址的hash
功能:以客户端的IP地址作为hash算法的关键字,映射到特定的上游服务器。
基于任意关键字实现hash
hash key [consistent]
一致性hash
之前的两种Hash,当上游服务器发生变化时(宕机或扩容),原有的hash算法可能引发大量的路由变更(原来hash%5, 因为有5台,现在hash%4),产生严重后果(如缓存大范围失效)。
扩容前
扩容后
最少连接算法least-connection
功能:从所有上游服务器中,找出当前并发连接数最少的一个,将请求转发到它。
least_conn
[upstream]
反向代理与缓存
HTTP反向代理流程
buffering on/off 考虑:nginx的并发能力强,上游服务的并发能力弱,客户端公网网速慢,和上游服务内网网速快;proxy_buffering 默认是on, off的话,边读边发,由于受限于客户端网速,就会一直占用上游服务器的连接,而上游服务器的并发能力是比较弱的。
proxy_request_buffering on|off
on:
- 客户端网速慢
- 上游服务并发处理能力弱
- 适应高吞吐量的场景
off: - 更及时的相应
- 降低nginx读写磁盘的消耗
- 一旦开始发送内容,proxy_next_upstream功能失败
proxy_pass url
URL参数规则:
- URL必须以http://或者https://开头,接下来是域名,IP,socket地址或者upstream的名字
- 当URL参数中携带URI与否会导致向上游请求的URL不同
- URL必须以http://或者https://开头,接下来是域名,IP,socket地址或者upstream的名字
- 当URL参数中携带URI与否会导致向上游请求的URL不同
- 不携带URI: 原封不动
- 携带URI,将location参数中匹配上的一段替换为该URI
e.g.
server {
listen 8012;
default_type text/plain;
return 200 '8012 response. uri: $uri\n'
}
conf1:
upstream proxyups {
server 127.0.0.1:8012 weight=1;
}
server {
server_name proxy.aoao.tech;
location /a {
proxy_pass http://proxyups;
#...
}
}
curl proxy.aoao.tech/a/b/c
-> 8012 response. uri:/a/b/c
conf2:
upstream proxyups {
server 127.0.0.1:8012 weight=1;
}
server {
server_name proxy.aoao.tech;
location /a {
proxy_pass http://proxyups/www;
#...
}
}
curl proxy.aoao.tech/a/b/c
-> 8012 response. uri:/www/b/c
- 该URL参数中可以携带变量
- 更复杂的URL替换,可以在location内的配置添加rewrite break语句
向上游服务器建立连接
proxy_connect_timeout time
[http, server, location] 与上游服务器的三次握手
超时后,会向客户端生成http响应, 响应码为502
-
上游连接启用TCP keepalive
TCP层是操作系统做的,keepalive会发心跳包
proxy_socket_keepalive on|off
[http, server, location] -
上游连接启用HTTP keepalive
keepalive connections
[upstream]
keepalive_requests numbser
[upstream]
上游出现错误的容错方案
proxy_next_upstream error|timeout|invalid_header|http_500|...
[http, server, location]
e.g. proxy_next_upstream error
当上游服务返回错误时,nginx自动选择其他另外的上游服务,来屏蔽这个错误。
浏览器缓存
Nginx缓存
proxy_cache zone|off
[http, server, location]
proxy_cache_path
指令:
- inactive 在inactive时间内没有被访问的缓存,会被淘汰掉;默认10分钟
- max_size 最大缓存文件大小,超出后由cache manager进程按照LRU链表淘汰
- ...
通过响应头部控制缓存时长 - X-Accel-Expire 单位秒,为0时禁止nginx缓存内容
- 响应头中若含有Set-Cookie则不缓存
- 响应头中含有Vary:* 则不缓存
Websocket反向代理
HTTP 2.0
主要特性:
- 传输数据量大幅减少
- 以二进制方式传输
- 标头压缩
- 多路复用及相关功能
- 消息优先级
- 服务器消息推送
- 并行推送
连接Connection:1个TCP连接,包含一个或者多个Stream
数据流Stream: 一个双向通讯数据流,包含多个Message
消息Message:对应HTTP1中的请求或者响应,包含一条或者多条Frame
数据帧Frame:最小单位,以二进制压缩格式存放HTTP1中的内容