Nginx Lua开发实战
上QQ阅读APP看书,第一时间看更新

第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的使用方法,感受其带来的便利性。