负载均衡中间件学习笔记之Nginx负载均衡

1 Nginx负载均衡

  1. Nginx特点
  2. 正向代理和反向代理
  3. 四种负载均衡配置

1.1 Nginx特点

  • 反向代理服务器
  • 并发能力强,并发能力是同类web服务器中表现较好的
  • 高并发连接(epoll nio网络模型,高效处理网络请求)
  • 内存消耗少(类似于Netty零拷贝机制)
  • 配置文件简单
  • 开源免费
  • 支持rewrite重写规则
  • 内置健康检查功能
  • 稳定性高,不会出现性能爆炸

1.2 正向代理和反向代理

正向代理:类似于跳板机,代理访问外部资源,类似于海外代购

反向代理:将请求转发给内部网络的服务器,对外表现为一个服务器(保证内网的安全,阻止web攻击),类似于明星经纪人

1.3 四种负载均衡配置

配置方式描述
基于轮询(RR,Round Robin)默认配置
基于最少连接数(least-conn)请求处理时间长短不一造成服务器过载
基于IP地址哈希(ip_hash)适用于有状态的请求,如Session
基于权重(weight)适用于硬件配置差别较大的情况

2 代理缓存机制

有许多的粉丝崇拜自家的偶像(后端服务器),会经常给偶像微博私信(网络请求),喜欢什么类型的小物件,想要给明星寄东西,当然经纪人(Nginx)不可能每次在回复这些私信的时候,都跑去问明星,问多了也会不耐烦,于是,经纪人也会把一些重复的问题和答案记在自己的小本本上(Nginx服务器本地副本),一旦碰见被问到烂大街的问题,就会直接翻看小本本,找到答案并回应粉丝,这样就能够减少打扰明星的次数,也能够在同样的时间内回应更多的微博私信,提高粉丝给明星寄东西的速度。

  1. 缓存文件存放在哪个位置
  2. 如何指定哪些请求会被缓存
  3. 对于某些请求,是否可以不走缓存

2.1 缓存文件存放在哪个位置

Nginx使用proxy_cache_path参数指定缓存位置,有两个必填参数,第一个参数为缓存目录,第二个参数为keys_zone指定缓存名称和占用内存空间的大小;
proxy_cache为之前指定的缓存名称。

2.2 如何指定哪些请求会被缓存

  • Nginx默认会缓存所有get和head方法的请求结果
  • 指定请求至少被发送n次以上时缓存,可以防止低频请求被缓存,proxy_cache_min_uses 5
  • 指定哪些方法的请求被缓存,proxy_cache_methods GET HEAD POST

2.3 对于某些请求,是否可以不走缓存

proxy_cache_bypass该指令指定请求不走缓存,而是访问原始服务器。
网页的缓存是由HTTP消息头的Cache-control来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。

3 通过Lua拓展Nginx

  1. Ngx_lua模块及指令
  2. 协程(Coroutine)
  3. Nginx进程模型
  4. Http请求处理
  5. OpenResty

3.1 Ngx_lua模块及指令

该模块特性:

  • 高并发、非阻塞的处理各种请求
  • lua内建协程,可以将异步回调转换成顺序调用的形式

得益于lua协程的支持,ngx_lua在处理一万个并发请求时只需要很少的内存。

指令所处处理阶段使用范围解释
init_by_lua、init_by_lua_fileloading-confighttpnginx master进程加载配置时进行;通常用于初始化全局配置/预加载lua模块
init_worker_by_lua、init_worker_by_lua_filestarting-workerhttp每个nginx worker进程启动时调用的计时器,如果master进程不允许则只会在init_by_lua之后调用;通常用于定时拉取配置/数据,或者后端服务的健康检查
set_by_lua、set_by_lua_filerewriteserver, server if, location, location if设置nginx变量,可以实现复杂的赋值逻辑;此处是阻塞的,lua代码要做到非常快
rewrite_by_lua、rewrite_by_lua_filerewrite_tailhttp, server, location, location ifrewrite阶段处理,可以实现复杂的转发/垂定向逻辑

3.2 协程(Coroutine)

类似于多线程,区别如下

  • 创建、切换开销比线程相对要小
  • 协程跟线程一样也有自己的栈、局部变量等,但是协程的栈是在用户进程空间模拟的
  • 只有当一个协程主动放弃执行权,另一个协程才能获得执行权,所以在某一瞬间,多个协程间只有一个在运行
  • 对于临界区的访问不需要加锁,因为同一时刻只有一个协程在运行
  • 多线程行为不可控,多协程行为可控

Nginx的每个worker进程都是在epoll事件模型上,封装成协程,每个请求都是有一个协程进行处理。

3.3 Nginx进程模型

在这里插入图片描述

  • master进程
    • 接收来自外界的信号
    • 向各worker进程发送信号
    • 监控worker进程运行状态
    • 当worker退出后,会自动重新启动新的worker进程
  • worker进程
    • 采用单线程,非阻塞的事件模型
    • 监听端口及处理客户端请求

3.4 HTTP请求处理

阶段说明
post-read读取请求内容阶段,nginx读取并解析请求头之后就立即开始运行
server-rewriteserver请求地址重写阶段
find-config配置查找阶段,用来完成当前请求与location配重块之间的配对工作
rewritelocation请求地址重写阶段,当ngx_rewrite指令用于location中,就是在这个阶段运行的
post-rewrite请求地址重写提交阶段,当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话
preaccess访问权限检查准备阶段,ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度
access权限检查阶段,ngx_access在这个阶段运行,配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法
post-access访问权限检查提交阶段
try-files配置项try-files处理阶段
content内容产生阶段,是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP相应内容的
log日志模块处理阶段

3.5 OpenResty

概念:一个基于Lua和Nginx的高性能web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态web应用、web服务和动态网关。

工作原理:汇聚各种设计精良的Nginx模块,web开发人员和工程师可以使用lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构建出足以胜任10K乃至1000K以上单机并发连接的高性能web应用系统。

目标:让我们的web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型,不仅仅对HTTP客户端请求,甚至对远程后端诸如MySQL、PostgreSQL、Memcached以及Redis等都进行一致的高性能响应。

参考文章

网易云课堂《Java高级开发工程师》

结语

本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值