基于OpenResty的弹性网关实践(一)
一、介绍1. OpenResty简介官方地址:http://openresty.org/cn/github地址:https://github.com/openresty/OpenResty最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/OpenResty是一个基于 Nginx 与 Lua 的高性能 Web
一、介绍
1. OpenResty简介
github地址:https://github.com/openresty/
OpenResty最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/
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 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
二、Centos下的安装
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默认安装在/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
在浏览器中访问:
四、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 这个模块。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)