前言
我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。为了开发人员方便,所以接下来我们要介绍一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编译顺序。关OpenResty,我想大家应该不再陌生,随着系统架构的不断升级、优化,OpenResty在被广泛的应用。
1.什么是openresty?(和nginx很像)
通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。
用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
2.OpenResty运行原理
Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中
master 负责一些全局初始化,以及对 worker 的管理
在OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程)
协程之间数据隔离,每个协程具有独立的全局变量_G
协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。
3.OpenResty的优势
OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型
不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应
首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成
其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用
借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。
而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单
目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等
4.实验环境
下文配置时用到的部分相关资源在前面LNMP架构系列博客中都有介绍,这里不再细说
实验就是在前面的基础上实现的
5.现在给nginx加上缓存(使用openresty来做这个实验)
- (1)关闭之前配置的nginx服务
nginx -s stop关闭nginx服务,因为openresty是一个类似于nginx的服务
- (2)从真机给虚拟机传一个openresty的包
- (3)查看openresty安装包,解压
ls查看包
tar zxf openresty-1.13.6.1.tar.gz解压
ls
cd openresty-1.13.6.1进入解压目录
- (4)./configure 编译
编译完成后会提示安装时用gmake - (5)gmake && gmake install安装
- (6)拷贝文件
cd memcache-2.2.5/进入缓存的服务的目录
cp memcache.php example.php /usr/local/openresty/nginx/html/把这两个文件拷贝到openresty的默认发布目录
- (7)编辑openresty的配置文件
cd /usr/local/openresty/nginx/conf/
ls
修改内容如下:
17 http {
18 upstream memcache {
19 server localhost:11211;
20 keepalive 512;
21 }
22
23 include mime.types;
24 default_type application/octet-stream;
69 location /memc {
70 internal;
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;
81 srcache_fetch GET /memc $key;
82 srcache_store PUT /memc $key;
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 }
- (8)检查没有语法错误之后开启服务,查看端口号
vim nginx.conf编辑openresty的配置文件
/usr/local/openresty/nginx/sbin/nginx -t检测语法
/usr/local/openresty/nginx/sbin/nginx 启动服务
ps ax查看进程
测试:172.25.12.1/memcache.php 失败,因为没有改密码
vim memcache.php因为当前openresty服务下的配置文件没有改
cp /usr/local/lnmp/nginx/html/memcache.php .重新复制一份之前改过的或者直接修改都可以
- (9)测试:浏览器访问成功
- (10)模拟5000请求量测试命中率和访问时间
发现访问index.php也没有失败,而且两个的访问时间都比memcache短
加上nginx缓存之后,index.php和example.php都比之前更快了