基于OpenResty的弹性网关实践(一)

一、介绍

1. OpenResty简介

官方地址:http://openresty.org/cn/

github地址:https://github.com/openresty/

OpenResty最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/

基于OpenResty的弹性网关实践(一)_第1张图片

 

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty通过汇聚各种设计精良的 Nginx模块,从而将 Nginx有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动Nginx支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty 致力于将你的服务器端应用完全运行于 Nginx 服务器中,充分利用 Nginx 的事件模型来进行非阻塞 I/O 通信。不仅仅是和 HTTP 客户端间的网络通信是非阻塞的,与MySQL、PostgreSQL、Memcached 以及 Redis 等众多远方后端之间的网络通信也是非阻塞的。

OpenResty创始人:章亦春

江湖人称“春哥”,编程之路起于看不懂而抄书,就算如今已是罕见的编程高手,春哥依然逢人大力推荐他的抄书学编程之法。

创立的OpenResty开源社区,获得了锤子科技一百万的捐赠。

个人历程:

  • 江苏镇江人,1999年,初中的章亦春第一次接触《C 语言程序设计》靠手抄自学编程,进入江苏大学后,一发不可收拾的迷恋上开源世界。

  • 结束淘宝量子统计的工作后,全心从事 OpenResty 等开源项目的工作;

  • 2017年,在美国创办了 OpenResty Inc. 公司。

2. Lua简介

lua教程

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

二、Centos下的安装

nginx的安装可以参考如下链接:

Centos7安装Nginx

1.安装依赖库

yum install readline-devel pcre-devel openssl-devel gcc

2.下载及安装OpenResty

wget https://openresty.org/download/openresty-1.9.15.1.tar.gz
tar xvf openresty-1.9.15.1.tar.gz
cd openresty-1.9.15.1
    ./configure --with-luajit && make && make install

3.安装好的OpenResty

基于OpenResty的弹性网关实践(一)_第2张图片

 

从上图可以看到,openresty默认安装在/usr/local目录下

三、OpenResty启动

通过下述方式启动Nginx。如果没有任何输出,说明启动成功,-p 指定我们的项目目录,-c 指定配置文件。

/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
/usr/local/openresty/nginx/sbin/nginx -p 'pwd' -c /usr/local/openresty/nginx/conf/nginx.conf

为openresty下的nginx建立软链(非必需)

ln -s /usr/local/openresty/nginx/sbin/nginx  /usr/sbin/nginx

则可使用如下方式启动

/usr/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf

在浏览器中访问:

基于OpenResty的弹性网关实践(一)_第3张图片

 

四、Hello World

我们先来创建工作目录

mkdir study
cd study
mkdir logs/ conf/

下面是一个最简化的 nginx.conf,在根目录下新增 OpenResty 的content_by_lua指令,里面嵌入了ngx.say的代码:

events {
    worker_connections 1024;
}
​
http {
    server {
        listen 8080;
        location / {
            content_by_lua '
                ngx.say("hello, world")
            ';
        }
    }
}

启动OpenResty服务

/usr/sbin/nginx -p '/data/soft/study/' -c conf/nginx.conf

没有报错的话,OpenResty 的服务就已经成功启动了。你可以打开浏览器,或者使用 curl 命令,来查看结果的返回:

[root@VM_0_7_centos soft]# curl -i 127.0.0.1:8080
HTTP/1.1 200 OK
Server: openresty/1.9.15.1
Date: Tue, 22 Sep 2020 12:58:33 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
​
hello, world

我们刚才是把 Lua 代码写在 Nginx 配置文件中。不过,如果代码越来越多,那代码的可读性和可维护性就无法保证了。

我们可以单独创建一个工作目录来维护lua代码:

$ mkdir lua
$ cat lua/hello.lua
ngx.say("hello, world")

然后修改 nginx.conf 的配置,把 content_by_lua_block 改为 content_by_lua_file:

pid logs/nginx.pid;
events {
  worker_connections 1024;
}
​
http {
  server {
    listen 8080;
    location / {
      content_by_lua_file lua/hello.lua;
      }
    }
  }

最后,重启 OpenResty 的服务就可以了:

$ /usr/sbin/nginx -p '/data/soft/study/' -c conf/nginx.conf -s reload
​
# 也可以强制杀进程,然后在启动
$ sudo kill -HUP `cat logs/nginx.pid`
$ sudo fuser -k -n tcp 8080 #该命令可以强行Kill掉某个端口

你可以使用 curl ,验证是否返回了预期的结果。至于后面 Lua 代码的变更,你就可以直接修改 hello.lua 这个文件,而不是 nginx.conf 了。

思考:

1.content_by_lua_file lua/hello.lua; 里面写的是相对路径,那么 OpenResty 是如何找到这个 Lua 文件的?

如果原本给出的是相对路径,那么 OpenResty 在启动时,会把 OpenResty 启动的命令行参数中的 -p PATH 作为前缀,将相对路径拼接为绝对路径。这样,自然就可以顺利找到 Lua 文件。

2.Lua 代码内容的变更,需要重启 OpenResty 服务才会生效,这样显然不方便调试,那么有没有什么即时生效的方法呢?

Lua 代码在第一个请求时会被加载,并默认缓存起来。所以在你每次修改 Lua 源文件后,都必须重新加载 OpenResty 才会生效。其实,在 nginx.conf 中关闭 lua_code_cache 就能避免重新加载,这一点你可以自己试试看。不过,特别需要注意的是,这种方法只能临时用于开发和调试,如果是线上部署,一定要记得打开缓存,否则会非常影响性能。

lua_code_cache off; #关闭缓存
lua_code_cache on;  #开启缓存

3.如何把 lua 代码所在的文件夹,加入到 OpenResty 的查找路径中呢?

OpenResty 提供了 lua_package_path 指令,可以设置 Lua 模块的查找路径。针对上面的例子,我们可以把 lua_package_path 设置为 $prefix/lua/?.lua;;

  • $prefix就是启动参数中的 -p PATH;

  • /lua/?.lua表示 lua 目录下所有以 .lua 作为后缀的文件;

  • 最后的两个分号,则代表内置的代码搜索路径。

lua_package_path '/data/paopao/paopao_gw/lua/?.lua;/usr/local/openresty/luajit/lib/lua/5.1/?.lua;/usr/local/openresty/lualib/md5/?.lua;;';
​
# lua_package_path 这个指令是用来加载 Lua 模块而使用的,比如我们在调用 require 'cjson' 时,就会到lua_package_path 中的指定目录中,去查找 cjson 这个模块。

你可能感兴趣的:(Nginx,nginx,OpenResty)