
第3章 OpenResty
一个典型的互联网系统或云计算系统大量使用到关系型数据库、非关系型数据库、缓存、内存数据库等,以提供高速、高扩展性的服务,通常组成集群。以前协调这些系统开发是非常麻烦的,现在OpenResty提供的Nginx+Lua+Module的机制,使我们可以实现快速开发,让开发者着眼于应用,使用同一语言开发。在这种架构的应用领域里,其效率是其他语言和技术不能比拟的。
本章介绍OpenResty的组成及安装、配置方法。
3.1 OpenResty:概述
OpenResty是一个基于Nginx与Lua的高性能Web平台,集成了大量精良的Lua库、第三方模块以及大多数的依赖项,用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。
OpenResty通过汇聚各种设计精良的Nginx模块(主要由OpenResty团队自主开发),从而将Nginx有效地变成一个强大的通用Web应用平台。这样,Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10K乃至1000K以上单机并发连接的高性能Web应用系统。
OpenResty致力于将服务器端应用完全运行于Nginx服务器中,充分利用Nginx的事件模型进行非阻塞I/O通信,不仅仅和HTTP客户端间的网络通信是非阻塞的,与MySQL、PostgreSQL、Memcached以及Redis等众多后端之间的网络通信也是非阻塞的。
因为OpenResty软件包的维护者也是其中打包的许多Nginx模块的作者,所以Open-Resty可以确保所包含的所有组件可以可靠地协同工作。
使用Lua在Nginx下开发,需要安装很多支撑库,例如:
● Lua解释器:标准Lua 5.1或LuaJIT 2.0/2.1,用于对Lua语言进行解析。
● Lua核心模块:lua_nginx_module,是Lua语言和Nginx的桥梁,我们的脚本全部是通过ngx_lua模块和Nginx协调起来工作的。其中Lua的VM也在ngx_lua中工作。
● MySQL库:异步访问MySQL的Lua库。
● Redis库:异步访问MySQL的Lua库。
● Memcached库:异步访问Memcached的Lua库。
● PostgreSQL库:异步访问PostgreSQL的Lua库。
● JSON库:Lua上的CJSON库。
● MySQL RDS库:MySQL结果集处理RDS库。
● Redis RDS库:Redis的结果集处理RDS库。
● Drizzle Nginx Module:一个和MySQL或Drizzle通信的上游服务器。
● ……
这些库都需要分别安装和配置,通过OpenResty可以把这些库和Nginx打包到一起,让研发者或使用者直接使用,从而省去配置和匹配的麻烦,所以我们推荐使用OpenResty进行Nginx下Lua开发环境的搭建。
3.2 OpenResty的组成
OpenResty由下面的组件组成。
● 标准Lua 5.1解释器;
● Drizzle Nginx模块;
● Postgres Nginx模块;
● Iconv Nginx模块。
所有组件均可以方便地被激活或禁止。绝大部分组件已内置在OpenResty安装包中,但也有一部分不包含在内。
上面4个模块默认并未启用,需要分别加入--with-lua51、--with-http_drizzle_module、--with-http_postgres_module和--with-http_iconv_module编译选项开启它们。
其余各组件编译选项,可对照OpenResty安装说明,按需启用。非必要时,不推荐启用标准Lua 5.1解释器,而应尽量使用LuaJIT组件。
在1.5.8.1版本之前,OpenResty默认使用标准Lua 5.1解释器。所以对于老版本,需要显式地加入--with-luajit编译选项(1.5.8.1以后的版本已默认开启)来启用LuaJIT组件。
OpenResty支持的模块如下:
● LuaJIT;
● ArrayVarNginxModule;
● AuthRequestNginxModule;
● CoolkitNginxModule;
● DrizzleNginxModule;
● EchoNginxModule;
● EncryptedSessionNginxModule;
● FormInputNginxModule;
● HeadersMoreNginxModule;
● IconvNginxModule;
● StandardLuaInterpreter;
● MemcNginxModule;
● Nginx;
● NginxDevelKit;
● LuaCjsonLibrary;
● LuaNginxModule;
● LuaRdsParserLibrary;
● LuaRedisParserLibrary;
● LuaRestyCoreLibrary;
● LuaRestyDNSLibrary;
● LuaRestyLockLibrary;
● LuaRestyLrucacheLibrary;
● LuaRestyMemcachedLibrary;
● LuaRestyMySQLLibrary;
● LuaRestyRedisLibrary;
● LuaRestyStringLibrary;
● LuaRestyUploadLibrary;
● LuaRestyUpstreamHealthcheckLibrary;
● LuaRestyWebSocketLibrary;
● LuaRestyLimitTrafficLibrary;
● LuaUpstreamNginxModule;
● PostgresNginxModule;
● RdsCsvNginxModule;
● RdsJsonNginxModule;
● RedisNginxModule;
● Redis2NginxModule;
● RestyCLI;
● OPM;
● SetMiscNginxModule;
● SrcacheNginxModule;
● XssNginxModule。
3.3 OpenResty的安装
本章介绍在CentOS 6.x上使用yum安装OpenResty方法,其他平台的安装方法请到官方网站(https://openresty.org/cn/installation.html)查看:
对于下列Linux发行版的种类和版本号,OpenResty提供官方的预编译包。
1)RHEL/CentOS。版本号支持的体系结构:
5.x x86_64, i386
6.x x86_64, i386
7.x x86_64
2)Fedora。版本号支持的体系结构:
23 x86_64, i386
24 x86_64, i386
25 x86_64, i386
26 x86_64, i386
1.添加资源库
在CentOS上使用yum安装OpenResty,需要首先安装资源库,这样就可以方便地安装OpenResty,以后也可以更新(通过yum update命令)。
创建一个名为/etc/yum.repos.d/OpenResty.repo的文件,内容如下:
[openresty] name=Official OpenResty Repository baseurl=https://copr-be.cloud.fedoraproject.org/results/openresty/openresty/epel-$releasever-$basearch/ skip_if_unavailable=True gpgcheck=1 gpgkey=https://copr-be.cloud.fedoraproject.org/results/openresty/openresty/pubkey.gpg enabled=1 enabled_metadata=1
也可以直接运行下面命令添加仓库:
sudo yum-config-manager --add-repo https://openresty.org/yum/centos/OpenResty.repo
国内用户可以把baseurl改成下面的链接,速度会更快:
baseurl=https://openresty.org/yum/openresty/openresty/epel-$releasever-$basearch/
或者运行下面命令直接添加仓库:
sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo
2.列出所有包
使用下面命令列出资源库中所有的OpenResty包:
sudo yum --disablerepo="*" --enablerepo="openresty" list available
3.安装
使用下面命令进行安装:
sudo yum install openresty
使用yum安装OpenResty可能会因为缺少GeoIP库失败,所以需要先运行下面命令安装GeoIP:
yum install GeoIP-devel
GeoIP库的安装可能会因为仓库里没有Extra库而失败,所以需要首先添加Extra库:
yum install epel-release
4.测试
运行下面命令启动Nginx:
/usr/local/openresty/nginx/sbin/nginx -p /usr/local/openresty/nginx/
在浏览器里输入http://127.0.0.1(或主机IP),看到“Welcome to OpenResty! ”表示已经启动成功。
可以进一步修改/usr/local/openresty/nginx/conf/nginx.conf,测试Lua是否正常工作,nginx.conf内容如下:
worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { server { listen 8080; location / { default_type text/html; content_by_lua ' ngx.say("<p>hello, world</p>") '; } } }
然后运行下面命令重载配置文件:
/usr/local/openresty/nginx/sbin/nginx -p /usr/local/openresty/nginx/ -s reload
重载之前可以先测试一下配置文件的正确性:
/usr/local/openresty/nginx/sbin/nginx -p /usr/local/openresty/nginx/ -t
在浏览器里输入http://127.0.0.1:8080,如果看到了“hello world”就表示可以正常工作了。
也可以使用CURL工具测试:
curl http://localhost:8080/ <p>hello, world</p>
3.4 Nginx多实例
OpenRestry安装成功后,包里的Nginx可以部署多个实例,可以实例化多个不同的服务:或用于对外提供服务,或用于不同的开发任务,或用于学习。
只需要把OpenRestry中的Nginx目录复制一份就可以启动不同的实例:
cp -r /usr/local/openrestry/nginx /usr/local/openrestry/nginx_9090
然后修改nginx_9090/conf/nginx.conf,把端口从8080修改为9090,把“hello world”修改为“hello world2”,修改完成后启动实例。
/usr/local/openrestry/nginx_9090/sbin/nginx -p /usr/local/openrestry/nginx_9090/
在浏览器里输入http://127.0.0.1:9090,可以得到:
hello world2
表示新实例启动成功。
3.5 小结
本章介绍了OpenResty应用,并介绍了OpenResty的组成、安装方法;另外,为了方便应用,介绍了在OpenResty下多Nginx实例的方法。OpenResty是一个流行的Nginx下Lua开发解决方案,使用非常广泛。通过本章的介绍,读者可以在后续的学习和工作中掌握OpenResty的使用方法,感受其带来的便利性。