OpenResty学习笔记01:认识OpenResty
一. 先挖个坑
本来只想着简单了解一下OpenResty,但在接触之后,发现确实太有意思了,为了不让自己半途而废,先发这第一篇学习笔记,算是给自己立个flag自勉一下。
本文所有关于OpenResty的描述都是根据本人的理解,一家之言,如果有哪位同行路过,并且对OpenResty有所了解,还望不吝指正!
二. 关于OpenResty的相关理解
- OpenResty并不是一个单独的开源产品,而是由一系列开源产品组成的一套服务端可编程平台(软件包);
- OpenResty的创始人叫章亦春(agentzh),真正的技术大神,目前在运营的公司官网:鸥锐软件;
- OpenResty基于 Nginx 和 LuaJIT,核心是一个C模块:lua-nginx-module;
- 在Nginx环境下单独安装了 lua-nginx-module 模块,并不等于在使用 OpenResty;
- 在OpenResty软件包内,包含了由OpenResty团队独立维护的 LuaJIT 分支,因为 LuaJIT 的创始人Mike Pall退休了(囧);
- 在OpenResty软件包内,还包含由OpenResty团队原创或独立维护的其他开源组件,目的是保证各模块(组件)的版本不会发生问题;
三. OpenResty的意义
要说OpenResty,就不得不从Nginx说起,在我所了解的业务范畴里,Nginx是目前最高效的Web服务器了。
既然Nginx已经这么优秀了,那还需要OpenResty闹哪样?
好问题,如果到目前为止你仍然认为Nginx足够优秀,功能也足够用,那么你确实暂时还不需要OpenResty。
反之如果你已经厌倦了 nginx.conf 中各种晦涩的指令和语法,或者希望能用一种更灵活的编程脚本来实现某些高级功能,就会发现OpenResty的出现恰到好处。
事实上OpenResty就是利用在Nginx的每个Worker中都引入一个 LuaJIT 的 VM 来实现这一切的。
相比Nginx独特的各种指令,Lua 看起来那么的赏心悦目,至于为啥是 Lua,而不是 JS 或者 Python,据说是因为性能更好。
但是Nginx官方并不这么认为,因为他们在2015年9月份推出了 NGINX JavaScript(njs)模块,定位类似OpenResty,可以利用 JS 来对Nginx实现更复杂的扩展。
可惜的是 njs 并未采用Google的V8引擎,而是一个基于ECMAScript标准的定制化实现,对于一个WebCoder来说,非常期待 njs 的未来。
但在目前来看,Lua仍然是最好的选择,尽管它确实很小众。
可以说OpenResty是站了在巨人的肩膀上(Nginx + Lua),呈现出来的却不是简单的1+1的效果,更多惊喜等待着我去发现 😃
四. OpenResty适合做啥
- Web应用防火墙(WAF)
- 微应用API网关
- 网站集群访问控制
- 其他你想做的事
五. 环境安装
1. 安装依赖
yum -y install pcre-devel openssl-devel gcc curl
2. 下载OpenResty
cd /home/my
mkdir tools
cd tools
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
更多下载地址:http://openresty.org
官方推荐下载二进制版本,但作为学习的话,还是下载源码版更合适。
3. 解压缩
tar -xzvf openresty-1.21.4.1.tar.gz
cd openresty-1.21.4.1
4. 构建以及编译
./configure
make
make install
OpenResty默认将被安装到:/usr/local/openresty/
看一下安装完成之后的清单:
再继续查看一下 /usr/local/openresty/bin/
目录里的清单:
可以看到,bin目录下的openresty
是一个软连接,来自/usr/local/openresty/nginx/sbin/nginx
。
就是可以使用 openresty
来代替 nginx
命令。
为了以后操作方便,可以直接将目录 /usr/local/openresty/bin
添加到环境变量中:
vim /etc/profile
OPENRESTY_HOME=/usr/local/openresty
PATH=$PATH:$OPENRESTY_HOME/bin
export OPENRESTY_HOME PATH
source /etc/profile
最后再检查一下已安装的OpenResty版本:
openresty -V
六. HelloWorld
1. 最简单的HelloWorld
resty -e "ngx.say('hello world')"
在执行上面的语句之前,请确定已将目录 /usr/local/openresty/bin
添加到环境变量中。
以上语句执行完成后,会在控制台输出“hello world”,事实上 resty 命令在执行时会启动一个 nginx 进程,执行结束后,这个进程会自动关闭。
resty 作为OpenResty的 CLI,也被默认安装到了bin目录下。
OpenResty 的周边工具都是 Perl 编写的,这个 resty 也不例外。
resty 的功能很强大,想了解完整的列表,你可以查看 resty -h
2. 更正式的HelloWorld
先创建一个工作目录:
cd /home/my/work/hello
这个 hello 就是我们的第一个工作目录。
在这个目录中,再创建两个文件夹,分别存放配置文件 nginx.conf 和日志文件:
mkdir conf logs
为了可以保留每次测试的真实状态,我不想反复去修改默认的配置文件,而是创建一个新的 nginx.conf :
vim conf/nginx.conf
然后输入以下初始化内容:
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello, world</p>")
}
}
}
}
该配置文件中,将打开 8080 的监听端口,同时创建了一个名为 /hello 的服务。
下一步,启动OpenResty服务:
openresty -p `pwd`/ -c conf/nginx.conf
上面的命令中:
-p
参数将当前位置(/home/my/work/hello
)设置为 nginx
的工作目录;
-c
参数将上面新建的配置文件指定为 nginx
的配置文件。
通过 curl 即可访问我们的第一个服务:curl localhost:8080/hello
当然也可以使用浏览器访问:localhost:8080/hello
最后关闭服务:
openresty -p `pwd`/ -c conf/nginx.conf -s quit
因为 openresty 是源自 nginx 的软连接,因此以上命令也可以用 nginx 替换 openresty,效果是一样的。
至此,我已经成功安装了 OpenResty
,并且创建了第一个 hello world
测试服务。
下一步将尝试部署一个基于 OpenResty
的 WAF 模块。
七. 资源引用
版权声明: 本文为博主 网无忌 原创文章,欢迎转载,但请务必标注原文链接。