openresty开发系列10--openresty的简单介绍及安装
1、Nginx优势
十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业作无纸化办公,收银系统,工厂erp,c/s架构偏多
Nginx设计为一个主进程多个工做进程的工做模式,每一个进程是单线程来处理多个链接,并且每一个工做进程采用了非阻塞I/O来处理多个链接,从而减小了线程上下文切换,从而实现了公认的高性能、高并发;所以在生成环境中会经过把CPU绑定给Nginx工做进程从而提高其性能;另外由于单线程工做模式的特色,内存占用很是少
Nginx更改配置重启速度很是快,能够毫秒级,并且支持不中止Nginx进行升级Nginx版本、动态重载Nginx配置。
Nginx模块也是很是多,功能也很强劲,不只能够做为http负载均衡,Nginx发布1.9.0版本还支持TCP负载均衡,还能够很容易的实现内容缓存、web服务器、反向代理、访问控制等功能。
nginx模块:rewrite 常常用到的,
2、什么是ngx_lua
ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可使用Lua来编写脚本,这样就可使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器;这样开发人员就可使用Lua语言开发高性能Web应用了。
网站开发,也有一个重要的脚步语言,javascript,js文件;;;客户端脚步语言;;;(node.js服务器语言)
网站页面进行渲染的时候,能够经过javascript脚本语言 进行一些业务处理
<script>
function hello(){
alert("hello");
}
</script>
脚本文件,还须要一个javascript引擎---解析javascript脚本语言
所有的浏览器 都包含 javascript引擎
lua -- javascript 同样的脚本语言
lua脚本语言 应用 ----> 游戏开发中
Lua是一种轻量级、可嵌入式的脚本语言,这样能够很是容易的嵌入到其余语言中使用。另外Lua提供了协程并发,即以同步调用的方式进行异步执行,从而实现并发,比起回调机制的并发来讲代码更容易编写和理解,排查问题也会容易。Lua还提供了闭包机制,函数能够做为First Class Value 进行参数传递,另外其实现了标记清除垃圾收集。
由于Lua的小巧轻量级,能够在Nginx中嵌入Lua VM,请求的时候建立一个VM,请求结束的时候回收VM。
ngx_lua模块的原理:
ngx_lua将Lua嵌入Nginx,可以让Nginx运行Lua脚本,并且高并发、非堵塞的处理各类请求。Lua内建协程。这样就可以很是好的将异步回调转换成顺序调用的形式。ngx_lua在Lua中进行的IO操做都会托付给Nginx的事件模型。从而实现非堵塞调用。开发人员可以采用串行的方式编写代码,ngx_lua会本身主动的在进行堵塞的IO操做时中断。保存上下文;而后将IO操做托付给Nginx事件处理机制。在IO操做完毕后,ngx_lua会恢复上下文,程序继续运行,这些操做都是对用户程序透明的。
每个NginxWorker进程持有一个Lua解释器或者LuaJIT实例,被这个Worker处理的所有请求共享这个实例。
每个请求的Context会被Lua轻量级的协程切割,从而保证各个请求是独立的。 ngx_lua採用"one-coroutine-per-request"的处理模型。对于每个用户请求,ngx_lua会唤醒一个协程用于执行用户代码处理请求,当请求处理完毕这个协程会被销毁。
每个协程都有一个独立的全局环境(变量空间),继承于全局共享的、仅仅读的"comman data"。因此。被用户代码注入全局空间的不论什么变量都不会影响其它请求的处理。并且这些变量在请求处理完毕后会被释放,这样就保证所有的用户代码都执行在一个"sandbox"(沙箱),这个沙箱与请求具备一样的生命周期。 得益于Lua协程的支持。ngx_lua在处理10000个并发请求时仅仅需要很是少的内存。依据測试,ngx_lua处理每个请求仅仅需要2KB的内存,假设使用LuaJIT则会更少。因此ngx_lua很是适合用于实现可扩展的、高并发的服务。
ngx_lua 模块提供的指令和API
3、ngx_lua安装
echo模块
ngx_lua安装可以经过下载模块源代码,编译Nginx。但是推荐採用openresty。Openresty就是一个打包程序,包括大量的第三方Nginx模块,比方HttpLuaModule,HttpRedis2Module,HttpEchoModule等。省去下载模块。并且安装很方便。
OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一块儿;这样开发人员只须要安装OpenResty,不须要了解Nginx核心和写复杂的C/C++模块就能够,只须要使用Lua语言进行Web应用开发了。
OpenResty提供了一些经常使用的ngx_lua开发模块:如
lua-resty-memcached
lua-resty-mysql
lua-resty-redis
lua-resty-dns
lua-resty-limit-traffic
lua-resty-template
nginx + lua 就能够开发出 一些系统
这些模块涉及到如mysql数据库、redis、限流、模块渲染等经常使用功能组件;另外也有不少第三方的ngx_lua组件供咱们使用,对于大部分应用场景来讲如今生态环境中的组件已经足够多了;若是不知足需求也能够本身去写来完成本身的需求。
openresty.org/cn官网
应用场景
应用的公司:奇虎360、京东、百度、魅族、知乎、优酷、新浪这些互联网公司都在使用。
业务场景: WAF、有作 CDN 调度、广告系统、消息推送系统,API server 网关
3、openresty的下载及安装
1)下载安装
centos系统
# yum install readline-devel pcre pcre-devel openssl openssl-devel gcc curl GeoIP-devel
下载源码包
https://github.com/openresty/openresty/releases
选择最新版本v1.13.6.1
解压安装
# tar -xzvf openresty-1.13.6.1.tar.gz
# cd openresty-1.13.6.1/
##选择模块 ./configure --help
# ./configure --with-luajit --with-pcre --with-http_gzip_static_module --with-http_realip_module --with-http_geoip_module --with-http_ssl_module --with-http_stub_status_module
--with-http_gzip_static_module #静态文件压缩
--with-http_stub_status_module #监控nginx状态
--with-http_realip_module #经过这个模块容许咱们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于可以使得后台服务器记录原始客户端的IP地址
--with-pcre #设置PCRE库(pcre pcre-devel)
--with-http_ssl_module #使用https协议模块。(openssl openssl-devel)
--with-http_geoip_module #增长了根据ip得到城市信息,经纬度等模块 (GeoIP-devel)
# make && make install
2)安装成功后,默认会在/usr/local/openresty/
目录下
luajit 是采用C语言写的Lua代码的解释器 ----just in time 即时解析
lualib 是编辑好的lua类库
nginx,其实咱们openResty就是nginx,只是作了一些模块化工做;因此启动openResty就是启动nginx,咱们能够到 cd nginx/sbin/,直接运行 ./nginx
3)设置环境变量
# vi /etc/profile
export NGINX_HOME=/usr/local/openresty/nginx
export PATH=$PATH:$NGINX_HOME/sbin
# source /etc/profile ##生效javascript