小流量主体架构
二、Nginx配置
1、怎样进行分流
location
- 匹配url
rewrite_by_lua_file '$app_dir/core/diversion/diversion.lua'
- 通过diversion.lua来确定backend节点
proxy_pass http://$backend
- 反向代理到backend服务器
2、upstream负载均衡
负载均衡策略:
- round-robin(默认)
- ip_hash(访问ip):每个访客固定访问一个后端服务器
- fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
- least_conn:将请求发送到「活跃连接数最少」的那台服务器。
- 快者优先:优先使用「响应时间最短」的后端服务。
服务节点的状态值:
- down 表示单前的server暂时不参与负载.
- weight 默认为1.weight越大,负载的权重就越大。
- max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
- fail_timeout : max_fails次失败后,暂停的时间。
- backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
keepalive(俗称长连接):
- 默认情况下启动短连接,即请求结束后回收此连接
- keepalive 指定的数值是连接池中空闲的连接的最大数量,当连接数量达到这个值的时候,后续建立的连接不会被缓存(在使用完之后,就会关闭)。
- 需要注意的点是,keepalive指令不会限制nginx worker进程到upstream服务器的连接的总数。
3、配置的结构
- main全局配置
- http服务器
- server虚拟主机
- location
- server虚拟主机
- upstream
其中,server会继承main和http,location继承server,而upstream既不会继承指令也不会被继承。
三、Nginx-Lua分流策略
四、Nginx配置与Lua的执行顺序
nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系。
Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是:
post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log。
例子:
set 指令就是在 rewrite 阶段运行的,而 echo 指令就只会在 content 阶段运行。
在单个请求的处理过程中,rewrite 阶段总是在 content 阶段之前执行,因此属于 rewrite 阶段的配置指令也总是会无条件地在 content 阶段的配置指令之前执行。于是在同一个 location 配置块中,set 指令总是会在 echo 指令之前执行,即使我们在配置文件中有意把 set 语句写在 echo 语句的后面。
rewrite_by_lua_file
语境:http、server、location、location if
阶段:rewrite
作为rewrite阶段的处理,为每个请求执行指定的lua代码。
各阶段的解释:
1、post-read
读取请求内容阶段,nginx读取并解析完请求头之后就立即开始运行;
2、server-rewrite
server请求地址重写阶段;
3、find-config
配置查找阶段,用来完成当前请求与location配重块之间的配对工作;
4、rewrite
location请求地址重写阶段,当ngx_rewrite指令用于location中,就是再这个阶段运行的;
5、post-rewrite
请求地址重写提交阶段,当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话;
6、preaccess
访问权限检查准备阶段,ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度;
7、access
权限检查阶段,ngx_access在这个阶段运行,配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法;
8、post-access
访问权限检查提交阶段;
9、try-files
配置项try_files处理阶段;
10、content
内容产生阶段,是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP响应内容的;
11、log
日志模块处理阶段;
参考文章:
http://blog.csdn.net/weiyuefei/article/details/38487475
https://blog.jamespan.me/2015/11/27/fastest-first-load-balancer-for-nginx-with-lua
http://timd.cn/2016/01/04/nginx-upstream-keepalive/
http://blog.sina.com.cn/s/blog_e59371cc0102ux5w.html
http://blog.sina.com.cn/s/blog_6d579ff40100xm7t.html
http://www.jianshu.com/p/1bb7814b4b88
小知识:
lua_shared_dict:共享内存字典项,对所有worker进程可见。
反向代理(Reverse Proxy)方式是指用代理服务器来接受internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。