1 Nginx负载均衡
- Nginx特点
- 正向代理和反向代理
- 四种负载均衡配置
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服务器本地副本)
,一旦碰见被问到烂大街的问题,就会直接翻看小本本,找到答案并回应粉丝,这样就能够减少打扰明星的次数,也能够在同样的时间内回应更多的微博私信,提高粉丝给明星寄东西的速度。
- 缓存文件存放在哪个位置
- 如何指定哪些请求会被缓存
- 对于某些请求,是否可以不走缓存
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
- Ngx_lua模块及指令
- 协程(Coroutine)
- Nginx进程模型
- Http请求处理
- OpenResty
3.1 Ngx_lua模块及指令
该模块特性:
- 高并发、非阻塞的处理各种请求
- lua内建协程,可以将异步回调转换成顺序调用的形式
得益于lua协程的支持,ngx_lua在处理一万个并发请求时只需要很少的内存。
指令 | 所处处理阶段 | 使用范围 | 解释 |
---|---|---|---|
init_by_lua、init_by_lua_file | loading-config | http | nginx master进程加载配置时进行;通常用于初始化全局配置/预加载lua模块 |
init_worker_by_lua、init_worker_by_lua_file | starting-worker | http | 每个nginx worker进程启动时调用的计时器,如果master进程不允许则只会在init_by_lua之后调用;通常用于定时拉取配置/数据,或者后端服务的健康检查 |
set_by_lua、set_by_lua_file | rewrite | server, server if, location, location if | 设置nginx变量,可以实现复杂的赋值逻辑;此处是阻塞的,lua代码要做到非常快 |
rewrite_by_lua、rewrite_by_lua_file | rewrite_tail | http, server, location, location if | rewrite阶段处理,可以实现复杂的转发/垂定向逻辑 |
3.2 协程(Coroutine)
类似于多线程,区别如下
- 创建、切换开销比线程相对要小
- 协程跟线程一样也有自己的栈、局部变量等,但是协程的栈是在用户进程空间模拟的
- 只有当一个协程主动放弃执行权,另一个协程才能获得执行权,所以在某一瞬间,多个协程间只有一个在运行
- 对于临界区的访问不需要加锁,因为同一时刻只有一个协程在运行
- 多线程行为不可控,多协程行为可控
Nginx的每个worker进程都是在epoll事件模型上,封装成协程,每个请求都是有一个协程进行处理。
3.3 Nginx进程模型
- master进程
- 接收来自外界的信号
- 向各worker进程发送信号
- 监控worker进程运行状态
- 当worker退出后,会自动重新启动新的worker进程
- worker进程
- 采用单线程,非阻塞的事件模型
- 监听端口及处理客户端请求
3.4 HTTP请求处理
阶段 | 说明 |
---|---|
post-read | 读取请求内容阶段,nginx读取并解析请求头之后就立即开始运行 |
server-rewrite | server请求地址重写阶段 |
find-config | 配置查找阶段,用来完成当前请求与location配重块之间的配对工作 |
rewrite | location请求地址重写阶段,当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等都进行一致的高性能响应。
参考文章
结语
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~