nginx学习记录

监听端口

假设代码中,我监听8003端口,意味着我可以通过访问8003端口来获得数据

  • 将所有请求进行转发,即访问8003端口,nginx会将“访问8003端口”这一请求,转发到设定的地址
  • 这就实现了,访问的是8003端口,实际上访问的却是转发的地址

nginx缓冲和缓存

缓冲

client端到server端(nginx和服务器端在同一片服务器)的网速慢,可以通过NGINX缓冲buffer来异步发送获取信息

  • 缓冲是存在内存中的
  1. 发送请求到nginx
  2. nginx发送请求到server
  3. server返回连接所需信息到nginx的缓冲buffer中
  4. buffer中的数据慢慢发送给client,此时server的连接就被解放,可以给其他连接使用
server
| |...| 50mb/s
nginx(buffer)
| |...| 10kb/s
client

优点与作用

  • 优化nginx到后端连接的响应时间(使用内部连接网速快)
  • 通过更快释放server端的连接,来解决server端连接同时过多的问题,保证稳定向客户端传递响应
  • 动态请求启用缓冲,来进行优化

缓存

可以通过NGINX缓存cache来发送获取信息

  • 缓存是存在磁盘中的
  1. 发送请求到nginx
  2. nginx发送请求到server
  3. server一次返回所有信息到nginx的缓存cache中
  4. cache中的数据发送给client
  5. 此时若有其他连接发送相同请求,也无需再进行上述步骤,而是直接缓存cache中获取信息
server
|
nginx(cache)
| |...| 10kb/s
client

优点与作用

  • 减少server端的请求数量
  • client发送相同请求时可以直接访问nginx缓存,因此提高了client端的响应速度
  • 所以nginx一般将静态文件等需要多次访问的文件放入缓存(动态也可以,但动态一般放到Redis分布式缓存)
    • Redis作为内存数据库,其读写性能远高于Nginx。
    • 如果使用Nginx作为动态缓存,你需要在Nginx层面进行配置,并且可能需要编写特定的模块来处理动态内容的缓存。而Redis通常有成熟的客户端库,可以用来管理缓存,并且可以通过Redis的数据结构来控制缓存的策略。
    • 而静态缓存方面,Nginx专门设计用于处理静态内容的分发,将这些内容放入Redis可能会增加不必要的复杂性和性能开销。

nginx负载均衡

  • 轮循机制(负载均衡默认采用)

    • 我们给监听的8003端口,配置了两个后台应用8080和8088

    • 而第一次请求假设访问的是8080,登录后又将请求转发给8088

    • 而在8088上没有登录,因此显示登录超时

  • 最小连接:下一个请求分配给活动连接数最少的服务器(较为空闲的机器)

    • 依然可能会出现上述问题
  • Ip-hash

    • Ip作为key,同一Ip发送的请求分配给同一服务器

权重

能者多劳:有的服务器内存大,转发给它的请求就多

健康检查

反向代理中,如果某个后端服务器某个时间段内响应失败次数超过规定值,nginx将这个服务器标记为失败,并在之后一个周期内不再将请求发送给该失败的服务器

通用哈希 - 哈希一致性

  • 可以定义哈希的key

  • IP-hash存在问题:上游服务器宕机或扩容时,hash会重新计算(假设哈希通过对服务器数取模来计算存放位置,服务器减少,则哈希值全部发生改变),缓存全部失效

    • 解决办法:使用consistent参数,会启用一致性哈希算法,上游服务器宕机或扩容时,只重新映射部分键(仅对有影响的机器的请求重新转发,设置缓存)

随机

每个请求随机转发到服务器上

posted @ 2024-07-19 10:55  落花流水sas  阅读(15)  评论(0)    收藏  举报