Nginx - 反向代理

负载均衡

image

Round-Robin

upstream name {...} 指定一组上游服务器
功能:依次轮询挨个进行的方式。在加权(4C8G 8C16G权重不同)轮询的方式访问。

基于客户端ip地址的hash

功能:以客户端的IP地址作为hash算法的关键字,映射到特定的上游服务器。

基于任意关键字实现hash

hash key [consistent]

一致性hash

之前的两种Hash,当上游服务器发生变化时(宕机或扩容),原有的hash算法可能引发大量的路由变更(原来hash%5, 因为有5台,现在hash%4),产生严重后果(如缓存大范围失效)。

扩容前

image

扩容后

image

最少连接算法least-connection

功能:从所有上游服务器中,找出当前并发连接数最少的一个,将请求转发到它。
least_conn [upstream]

反向代理与缓存

image

HTTP反向代理流程

image

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自动选择其他另外的上游服务,来屏蔽这个错误。

浏览器缓存

image

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:* 则不缓存

image

Websocket反向代理

image

image

HTTP 2.0

主要特性:

  • 传输数据量大幅减少
    • 以二进制方式传输
    • 标头压缩
  • 多路复用及相关功能
    • 消息优先级
  • 服务器消息推送
    • 并行推送

连接Connection:1个TCP连接,包含一个或者多个Stream
数据流Stream: 一个双向通讯数据流,包含多个Message
消息Message:对应HTTP1中的请求或者响应,包含一条或者多条Frame
数据帧Frame:最小单位,以二进制压缩格式存放HTTP1中的内容

image

协议分层

image

多路复用

image

传输时无序,接收时组装

image

Frame格式

image

posted @ 2023-08-07 16:03  rachel_aoao  阅读(52)  评论(0编辑  收藏  举报