你应该学习一下Openresty(许多大厂都在用)了!!!

简介: 你应该学习一下Openresty(许多大厂都在用)了!!!

它是什么?

image.png

Openresty = Nginx + ngxhttp_lua_module + lua_resty*

既然提到Openresty,那么就不得不提一下它的作者「章亦春」;关于”春哥”的介绍,在此就不多说了,神一样的程序员,大家可以在知乎上去了解一下它 传送门。

常见的利用场景有哪些?


1.动态负载均衡

  • 普通流量走一致性哈希,提升命中率;热点流量走轮训减少单服务器压力。
  • 根据请求特征将流量分配到不同分组并限流(爬虫、或者流量大的IP)。
  • 动态流量(动态增加upstream或者减少upstream或者动态负载均衡)可以使用balancer_by_lua或者微博开源的upsync。


2.防火墙

如:DDOS、IP/URL/UserAgent/Referer黑名单、防盗链等。

  • 非法请求过滤,比如应该有Referer却没有,或者应该带着Cookie却没有Cookie。
  • 请求头过滤,比如有些业务是不需要请求头的,因此可以在往业务Nginx转发时把这些数据过滤掉。


3.防止DDOS限流

  • 可以将请求日志推送到实时计算集群,然后将需要限流的IP推送到核心Nginx进行限流。
  • 按照接口特征和接口吞吐量来实现动态限流,比如后端服务快扛不住了,那我们就需要进行限流,被限流的请求作为降级请求处理;通过lua-resty-limit-traffic可以通过编程实现更灵活的降级逻辑,如根据用户、根据URL等等各种规则,如降级了是让用户请求等待(比如sleep 100ms,这样用户请求就慢下来了,但是服务还是可用)还是返回降级内容。


4.服务端请求聚合

Nginx会在服务端把Nginx并发的请求并把结果聚合然后一次性吐出。


5.多级缓存模式

对于读服务会使用大量的缓存来提升性能,我们在设计时主要有如下缓存应用:首先读取Nginx本地缓存 Shared Dict或者Nginx Proxy Cache,如果有直接返回内容给用户;如果本地缓存不命中,则会读取分布式缓存如Redis,如果有直接返回;如果还是不命中则回源到Tomcat应用读取DB或调用服务获取数据。另外我们会按照维度进行数据的缓存。


6.降级

如果请求量太大扛不住了,那我们需要主动降级;如果后端挂了或者被限流了或者后端超时了,那我们需要被动降级。


7.AB测试/灰度发布

比如要上一个新的接口,可以通过在业务Nginx通过Lua写复杂的业务规则实现不同的人看到不同的版本。


8.服务质量监控

我们可以记录请求响应时间、缓存响应时间、反向代理服务响应时间来详细了解到底哪块服务慢了;另外记录非200状态码错误来了解服务的可用率。


怎么安装?


openresty下载地址: 传送门。

本例子只是说明在非windows平台的安全,windows平台直接下载相应的安装包就ok了。


安装依赖

# ubuntu apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential curl # centos yum install readline-devel pcre-devel openssl-devel gcc curl # mac brew update brew install pcre openssl curl


下载

wget https://openresty.org/download/ngx_openresty-1.9.7.2.tar.gztar zxvf ngx_openresty-1.9.7.2.tar.gz


安装LuaJIT

cd ngx_openresty-1.9.7.2/bundle/LuaJIT-2.1-20160108/ make clean && make && make install ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit


安装其它模块

位于ngx_openresty-1.9.7.2/bundle目录下。

ngx_cache_purge:清理nginx缓存

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

nginx_upstream_check_module:ustream健康检查

wget http://nginx.org/download/nginx-1.0.14.tar.gz


安装ngx_openresty

cd /usr/local/bar/ngx_openresty-1.9.7.2 ./configure –with-openssl=/usr/local/Cellar/openssl/1.0.2j --prefix=/usr/local/openresty --with-http_realip_module --without-http_redis2_module  --with-pcre  --with-luajit -j2 make && make install

查看帮助

--help to see more options


验证是否安装成功?

到/usr/local/bar目录下,会出现很多新的目录。

luajit:luajit环境;lua是一种解释语言,通过luajit可以即时编译lua代码到机器代码,得到很好的性能。
lualib:lua库。
nginx:安装的nginx。

我们可以通过/usr/local/bar/nginx/sbin/nginx -h来查看帮助信息。


怎么配置开发环境?


主要配置此文件(/usr/local/bar/nginx/conf/nginx.conf)。

添加lua库依赖

lua_package_path "/usr/local/bar/lualib/?.lua;;"; lua_package_cpath "/usr/local/bar/lualib/?.so;;";

测试配置是否正确

nginx/sbin/nginx -t

重启nginx

nginx/sbin/nginx -s reload

关闭nginx

nginx/sbin/nginx -s quit

常见lua插件


  • Http客户端(OpenResty默认没有提供Http客户端,需要使用第三方提供):lua-resty-http
  • Mysql客户端(默认自带):lua-resty-mysql
  • Redis客户端(默认自带):lua-resty-redis
  • 实时监控Nginx域名请求:ngx_lua_reqstatus
  • cache(每Worker进程共享):lua-resty-lrucache
  • CJSON:Lua CJSON
  • dkjson:dkjson
  • Lua UTF-8库:luautf8
  • 模板渲染:lua-resty-template
  • waf:ngx_lua_waf
  • 静态文件合并:nginx-lua-static-merger
  • 动态检测后端服务节点的状态:lua-resty-upstream-healthcheck

视频资料

  • OpenResty 2016深圳大会视频: 传送门 密码「2fep」。
相关文章
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,如何优化游戏性能,比如减少重绘、提高动画流畅度?
提升JavaScript游戏性能的关键点包括:使用requestAnimationFrame优化动画流畅度;减少DOM操作,利用DocumentFragment或虚拟DOM;使用Canvas/WebGL高效渲染;优化图像资源,压缩图片和使用雪碧图;分层渲染与视口裁剪减少无效绘制;借助Web Workers进行后台计算;缓存计算结果;合理添加事件监听器并采用事件委托;定期进行性能分析以找到并解决瓶颈。不断测试与调整是优化的关键。
446 4
|
负载均衡 Kubernetes Java
MSE-Nacos测评
MSE-Nacos测评
763 0
|
移动开发 缓存 自然语言处理
ant-design-pro项目开发全攻略(用这个做博客网站模板不要太快,一招鲜吃遍天)
ant-design-pro项目开发全攻略(用这个做博客网站模板不要太快,一招鲜吃遍天)
ant-design-pro项目开发全攻略(用这个做博客网站模板不要太快,一招鲜吃遍天)
|
缓存 JavaScript Cloud Native
阿里云发布 Spring Boot 新脚手架,真香
本文,围绕 spring initializr 框架,以 start.spring.io 为例,全面的给大家介绍如何使用和扩展这个框架,以及背后的运行原理。
58344 1
阿里云发布 Spring Boot 新脚手架,真香
|
3月前
|
传感器 机器学习/深度学习 算法
基于模型预测控制对PMSM进行FOC控制,模拟控制了PMSM的速度(Simulink仿真实现)
基于模型预测控制对PMSM进行FOC控制,模拟控制了PMSM的速度(Simulink仿真实现)
274 0
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
637 4
|
设计模式 负载均衡 中间件
深入理解PHP中的中间件模式
【7月更文挑战第12天】中间件模式在PHP开发中扮演着至关重要的角色,它允许开发者在请求处理流程中注入自定义的逻辑。本文将深入探讨中间件的工作原理、常见应用场景以及如何实现自己的中间件。通过实例演示,我们将揭示中间件模式如何优化应用架构,增强代码的可维护性和可扩展性。
226 0
|
SQL 关系型数据库 MySQL
阿里云mysql数据库价格购买和使用教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,通过选择配置、地域和可用区完成购买。创建数据库和账号,分配权限。使用DMS登录数据库,进行管理操作。确保ECS与RDS在同一地域的VPC内,配置白名单实现内网连接。详细步骤见官方文档。
1166 1
|
存储 缓存 自然语言处理
ES 性能调优,这可能是全网最详细的 Elasticsearch 性能调优指南
ES 性能调优,这可能是全网最详细的 Elasticsearch 性能调优指南
ES 性能调优,这可能是全网最详细的 Elasticsearch 性能调优指南
|
存储 SQL JSON
5、DataX(DataX简介、DataX架构原理、DataX部署、使用、同步MySQL数据到HDFS、同步HDFS数据到MySQL)(一)
5、DataX(DataX简介、DataX架构原理、DataX部署、使用、同步MySQL数据到HDFS、同步HDFS数据到MySQL)(一)