文章目录
一、认识OpenResty
1、什么是OpenResty?
OpenResty由中国人章亦春发起,是一个可伸缩的基于Nginx的Web平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,可以快速构造出足以胜任10K以上并发连接响应的超高性能Web应用系统。
OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
OpenResty使我们可以借助于Nginx的异步非阻塞达到使用Lua异步并发访问后端DB等服务。
2、OpenResty功能
传统服务器工作模式是:客户发请求到nginx反向代理,nginx找到tomcat浏览器,tomcat到mysql和redis获取数据,响应到浏览器,送到客户端。
openresty并不是说替换tomcat,而是当浏览器对服务器发送请求时,在nginx上添加openresty,openresty直接对客户端请求进行响应。或在nginx嵌入一些lua脚本(即openresty)跨过tomcat直接访问数据库。不过目前tomcat中做的一些复杂操作并不能被openresty完全替代。
对于一些高性能的服务,当缓存每没有数据时,直接使用 OpenResty 访问 Mysql或Redis等,而不需要通过第三方语言(PHP、Python、Ruby)等来访问数据库再返回,这大大提高了应用的性能。这样不用等待第三方返回。
3、OpenResty运行原理
Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker进程中,master 负责全局初始化,以及对 worker 的管理。
在OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程),协程之间数据隔离,每个协程具有独立的全局变量。
4、OpenResty处理请求流程
Nginx会把一个请求分成不同阶段,第三方模块可以根据自己的行为,挂在到不同阶段中以达到自身目的。OpenResty采用了同样的特性,不同阶段有着不同的处理行为。
5、ngx_lua模块的原理
- 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
- 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
- 每个外部请求都由一个Lua协程处理,协程之间数据隔离;
- Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
- I/O等异步操作完成时还原相关协程上下文数据,并继续运行;
二、配置OpenResty
实验思想
当客户端访问nginx时,由于openresty的作用,让缓存memcache直接跑在 Nginx 服务内部,客户端首先访问到memcache,大大提高了应用的性能。
实验环境
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.1.101 | lnmp、memcache、openresty |
真机 | 172.25.1.250 | 客户端 |
实验
在server1上:
步骤一:先关闭之前配置好的nginx,因为openresty是一个类似于nginx的服务,调用都是80端口
nginx -s stop
netstat -antuple
步骤二:在网上下载openresty安装包
tar zxf openresty-1.13.6.1.tar.gz
步骤三:编译安装
cd openresty-1.13.6.1
./configure --prefix=/usr/local/openresty
gmake && gmake install
步骤四:拷贝memcache压缩包自带的php文件到openresty默认发布
cd /usr/local/openresty/nginx/html
cp /usr/local/lnmp/nginx/html/index.php .
cp /usr/local/lnmp/nginx/html/example.php .
步骤五:编辑openresty的nginx配置文件
注意:配置文件第一行,必须设置nginx用户
vim /usr/local/openresty/nginx/conf/nginx.conf
17 http {
18 upstream memcache {
19 server localhost:11211;
20 keepalive 512;
21 }
22
#upstream属于handler,只是他不产生自己的内容,而是通过请求后端服务器得到内容,所以才称为upstream(上游)。请求并取得响应内容的整个过程已经被封装到nginx内部,所以upstream模块只需要开发若干回调函数,完成构造请求和解析响应等具体的工作。
# nginx将memcache缓存前移,客户端请求到来,先查看memcache缓存
23 include mime.types;
24 default_type application/octet-stream;
69 location /memc {
70 internal; # 只接收内部访问,不接受外部http访问。比较安全
71 memc_connect_timeout 100ms;
72 memc_send_timeout 100ms; # 后端服务器数据回传时间
73 memc_read_timeout 100ms; # 连接成功后,后端服务器响应时间
74 set $memc_key $query_string; # 键值对的形式存储
75 set $memc_exptime 300;
76 memc_pass memcache;
77 }
78
79 location ~ \.php$ {
80 set $key $uri$args;
# http的GET方法表示get、PUT方法表示set
81 srcache_fetch GET /memc $key;
82 srcache_store PUT /memc $key;
# 这两个配置的作用是:请求php页面时,先会去memcache中找,如果没有,正常访问;访问结束后将结果存到memcache,下次访问时直接从缓存中
83 root html;
84 fastcgi_pass 127.0.0.1:9000;
85 fastcgi_index index.php;
86 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
87 include fastcgi.conf;
88 }
步骤六:检查语法规范并开启nginx服务
/usr/local/openresty/nginx/sbin/nginx -t
/usr/local/openresty/nginx/sbin/nginx
netstat -antuple
步骤七: 复制之前更改过的/usr/local/lnmp/nginx/html/memcache.php到/usr/local/openresty/nginx/html目录下
cp /usr/local/lnmp/nginx/html/memcache.php /usr/local/openresty/nginx/html
在真机上:
打开浏览器访问http://172.25.2.1/memcache.php,可查看缓存命中率
模拟5000请求量测试命中率和访问时间:
ab -c 10 -n 5000 http://172.25.1.101/index.php
ab -c 10 -n 5000 http://172.25.1.101/example.php
可以看出访问的是openstry,且访问速度明显比memcache单独作用加快。index.php页面没有缓存,openstry去后端取数据,访问速度也比之前加快,并且没有错误。