OpenResty在高并发场景的应用

在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:
使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器、负载均衡等等
今天我们就要介绍一种解决高并发场景的方案:Openresty

概览

1. 什么是Openresty
2. 应用场景
3. Ngx_lua模块
4. Demo Time
5. 总结

什么是Openresty

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

  • Nginx:高性能、高并发的Web服务器,拥有丰富的第三方模块。
  • Lua:一种轻量级、可嵌入式的脚本语言。
  • Ngx_lua:Nginx的一个模块,将Lua嵌入到Nginx中,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器,这样开发人员就可以使用Lua语言开发高性能Web应用了。

2.这里有个很有意思的地方是,nginx、lua、openresty分别产生于俄罗斯、巴西、中国,都属于”金砖国家”。
mahua

应用场景

  • web应用:进行一些业务逻辑处理,甚至进行耗CPU的模板渲染,一般流程:mysql/redis/http获取数据、业务处理、产生JSON/XML/模板渲染内容,比如京东的列表页/商品详情页
  • 接入网关:实现如数据校验前置、缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控等功能,比如京东的交易大Nginx节点、无线部门正在开发的无线网关、单品页统一服务、实时价格、动态服务
  • Web防火墙:可以进行IP/URL/UserAgent/Referer黑名单、限流等功能
  • 缓存服务器:可以对响应内容进行缓存,减少到后端的请求,从而提升性能
  • ……

用户案例:
mahua

Ngx_lua模块

mahua
主要包含四个执行阶段:初始化阶段、rewrite/access阶段、内容生成阶段、log阶段

  • init_by_lua: Nginx收到HUP信号并开始重新加载配置文件时执行,可以用来在服务启动时注册“Lua全局变量”或预加载“Lua模块”(不推荐,全局变量的使用有性能损失并会带来全局命名污染),也可以初始化lua_shared_dict共享内存
  • init_worker_by_lua: Nginx worker进程启动时执行,这个指令经常被用来创建执行定时器(例如:后端服务健康检查任务)
  • set_by_lua: 设置nginx变量, 注意这里面的代码是阻塞的,不要加入耗时处理逻辑
  • rewrite_by_lua: 转发、重定向、缓存等功能
  • access_by_lua: IP准入、接口权限等情况集中处理
  • content_by_lua: 内容处理程序, 不要将本指令和其他内容处理程序指令放到同一个location中
  • balancer_by_lua: 配置在upstream中,实现上游服务器的负载均衡
  • header_filter_by_lua: 应答HTTP header处理
  • body_filter_by_lua: 输出内容过滤器
  • log_by_lua: 在log请求处理阶段执行,它不替代当前access的日志,而是在其前面执行

Demo Time

mahua
基础环境

  • 系统:Centos7
  • 内存:2G
  • cpu:2
  • 虚拟机ip:192.168.50.100

安装openresty

1
2
3
4
5
6
7
8
9
sudo yum -y update
sudo useradd nginx -s /sbin/nologin -M
wget https://openresty.org/download/openresty-1.11.2.1.tar.gz
tar -zxvf openresty-1.11.2.1.tar.gz
cd openresty-1.11.2.1
./configure --user=nginx --group=nginx --with-http_stub_status_module
gmake
sudo gmake install
sudo ln -s /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx

clone demo代码

1
2
cd /opt
git clone https://gitee.com/minkedong/helloopenresty.git

step1:hello world

1
2
git checkout step1
sudo nginx -p /opt/helloopenresty

step2:log、终止流程

1
2
git checkout step2
sudo nginx -p /opt/helloopenresty -s reload

step3:init_by_lua

1
2
git checkout step3
sudo nginx -p /opt/helloopenresty -s reload

step4:init_worker_by_lua

1
2
git checkout step4
sudo nginx -p /opt/helloopenresty -s reload

step4-1:init_worker_by_lua

1
2
git checkout step4-1
sudo nginx -p /opt/helloopenresty -s reload

step5:set_by_lua

1
2
git checkout step5
sudo nginx -p /opt/helloopenresty -s reload

step6:rewrite_by_lua

1
2
git checkout step6
sudo nginx -p /opt/helloopenresty -s reload

step7:access_by_lua

1
2
git checkout step7
sudo nginx -p /opt/helloopenresty -s reload

step8:header_filter_by_lua

1
2
git checkout step8
sudo nginx -p /opt/helloopenresty -s reload

step9:balancer_by_lua

1
2
git checkout step9
sudo nginx -p /opt/helloopenresty -s reload

step10:内部调用

1
2
git checkout step10
sudo nginx -p /opt/helloopenresty -s reload

step11:lua-resty-redis库

1
2
git checkout step11
sudo nginx -p /opt/helloopenresty -s reload

step12:ab测试

1
2
git checkout step12
sudo nginx -p /opt/helloopenresty -s reload

总结

ab测试:
1.准备:
更改内核参数,参考文章 实时日志分析之二:Openresty 其中的“优化linux内核参数”部分
log日志加buffer,人为错误日志去掉(由于其不带写缓冲)

2.说明:
吞吐率(Requests per second)
用户平均请求等待时间(Time per request)= 处理完成所有请求数所花费的时间/(总请求数/并发用户数)
服务器平均请求等待时间(Time per request:across all concurrent requests)= 处理完成所有请求数所花费的时间/总请求数

3.执行:

1
2
3
4
5
6
ab -c 500 -n 10000 -k http://192.168.50.100/hello
ab -c 1000 -n 10000 -k http://192.168.50.100/hello
ab -c 500 -n 10000 -k http://192.168.50.100/redis
ab -c 1000 -n 10000 -k http://192.168.50.100/redis
ab -c 500 -n 10000 -k http://192.168.50.100/test1
ab -c 1000 -n 10000 -k http://192.168.50.100/test1

建议

  • 系统防火墙
  • 系统内核参数
  • nginx worker进程权限
  • lua index从1开始
  • 未定义的lua变量不会报错,默认为nil
  • lua table操作谨慎
  • 第三方库谨慎对待阻塞库

QQ群:
124613000

学习资料:
OpenResty最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/
nginx-lua-module:https://github.com/iresty/nginx-lua-module-zh-wiki
awesome-resty:https://github.com/bungle/awesome-resty
Lua5.2:http://www.lua.org/manual/5.2/
OpenResty官网:http://openresty.org/cn/

坚持原创技术分享,您的支持将鼓励我继续创作!