Nginx+lua+openresty系列 | 第一篇:openresty介绍
Posted 秃头A计划
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+lua+openresty系列 | 第一篇:openresty介绍相关的知识,希望对你有一定的参考价值。
nginx+lua+openresty系列将围绕基础概念和常用功能分享给各位看官,包括nginx的虚拟主机使用、反向代理、负责均衡策略配置和nginx的缓存使用,还有openresty基于lua在nginx上的各种开发等。
初衷:我们在学习一种陌生的技术时,会遇到各种坑和不解,最坑的倒不是这个,而应该是学习过之后长时间不用,会忘。。。尤其是细节的东西,现在需要学习的东西太多了,学了就忘,那还有啥用。俗话说的好啊,好记性不如烂笔头,把当时研究该技术的整个过程记录下来,未尝不是一件好事,不仅便于以后熟悉查看,而且可以分享给热爱技术的朋友们,供大家参考。
笔者就用自己的亲身实践,记录下来研究一种技术的整个过程和心得,一方面加深了解,另一方面也给那些还不熟悉这种技术的同学一个参考
学习一种技术或者工具时,基本要遵循以下步骤,这玩意是什么(概念),有什么用能干嘛(功能),然后才是怎么干(应用),最后能搞明白为什么它能这么干更好(原理)
1.什么是openresty
我们看下官方的介绍:
OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。
通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。
OpenResty 致力于将你的服务器端应用完全运行于 Nginx 服务器中,充分利用 Nginx 的事件模型来进行非阻塞 I/O 通信。不仅仅是和 HTTP 客户端间的网络通信是非阻塞的,与mysql、PostgreSQL、Memcached 以及 Redis 等众多远方后端之间的网络通信也是非阻塞的。
总结一下:openresty首先是一个Web服务器,其次它打包了nginx核心等模块,将nginx服务器转变为web应用服务器,性能好!并发牛!最后可基于lua对nginx进行脚本编程。
它的主要用户有:
360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等等。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用
我以前从未听说过这门技术(孤陋寡闻。。),直到项目中遇到需要对请求流量进行拷贝和流量百分比切入(比如50%请求到A域名,50%请求去B域名)的时候(这也是它的一个应用点),才知道还有这么一个东西。这玩意是咱中国人自己搞出来的技术,作者是章亦春,功能非常强大。
既然是openresty这门技术,为何笔者的标题中会有Nginx和lua这两个东东呢,这两者又是做什么的呢?了解了openresty之后,这一切将不在疑惑。
进入正题:openresty是一个全功能的web应用服务器,它打包了Nginx的核心和很多常用的第三方模块。那么问题来了,什么是Nginx???
我们知道Nginx是俄国佬的大佬开发的,它是一个正宗的HTTP和反向代理服务器。它具有很多优势,高并发情况下性能异常的好,内存和CPU等系统资源消耗的却非常的低。它可以做虚拟主机(啥玩意?),反向代理(这又是啥玩意?),缓存等等,且运行非常的稳定。但是,Nginx是用C语言开发的,众所周知,C语言学习起来是相当的有难度的,比起其他语言例如Java和Python。所以Nginx固然好,但是在Nginx上扩展开发成了一道难题——你必须会C语言,这就是openresty的诞生的一大原因。当然了openresty的产生自2007年就已经出现了,在雅虎中国的一个项目中,后来经过章大爷和他同事王晓哲的改造,通过使用lua这门小巧的脚本语言,让开发者轻松定制扩展Nginx的开发,不用再去学习C语言去做Nginx的模块开发。
简而言之,openresty其实就是对Nginx的又一次封装(个人理解),它集成了Nginx核心和常用模块,再基于lua这个脚本语言,让开发者对Nginx的功能扩展和定制不再困难。所以,研究openresty首先要研究Nginx的一些常用功能和特点,然后需要研究lua脚本,然后综合两大技术,对openresty有一个整体的认识。lua是一个小巧的脚本语言,可以嵌入到Nginx中,语法很简单,对于已经掌握一种开发语言的抠脚大汉来说两三天就可以大致掌握。
2.openresty能干嘛?
目前有两大目标:
作为通用的web服务器
对Nginx扩展编程(基于lua脚本语言)
Nginx的特点
高并发性能超好,Nginx官方测试5万并发性能良好
内存消耗少
成本低。在做负载均衡时可以作为F5(负载均衡设备)的替代品
稳定
支持热部署
openresty功能
根据lua脚本,可以对请求和响应 进行改造(使用lua控制请求响应)
也可以做虚拟主机、反向代理、缓存(很有用),如果只是纯虚拟主机或者反向代理还是推荐用nginx
web服务器
因为是对nginx的封装 ,所以优势基本就是nginx所具有的的,再加上lua的支持又新增些东西,至于nginx的性能为何如此好,有兴趣的朋友可以研究下nginx使用的epoll模型和它的master-woker架构。
3.openresty安装
相信读者已经对openresty有了一定的了解,那么了解之后接下来就是要用它去做一些事情。那么怎么用呢?是不是像软件一样需要安装?我们就得去官网(http://openresty.org/en/)看看了。
openresty官网有中英文可以切换,不习惯英文的可以用中文,但是切换到中文以后,还是有部分是英文写的。我们点击download链接,可以看到有很多操作系统都可以安装。开发测试都可以在Linux上(但是不推荐,因为写代码不方便),Windows上也可以开发,并且会idea的话开发很方便,有相关插件。
Linux安装
windows安装
下载到Windows系统并解压之后如图:
我们大致了解下整个目录结构:
/conf:里面包含了nginx的启动文件和一些常用的配置,比如mime.types文件配置了很多常见的HTTP content-type 头信息
/html :nginx默认的启动页面和一个错误页面,也是nginx默认的资源加载目录
/include:关于lua-jit即时编译器的东西
/logs:默认用于存放nginx的错误日志文件和请求信息
/lua:关于lua-jit即时编译器的东西
/lualib:lua脚本自带的常用库,像Java中的jdk自带的库一样
luajit.exe:lua的编译器,可以运行lua语句,初学lua可以使用它练习语法
nginx.exe:windows下nginx的启动文件
然后将该目录配置到环境变量中,玩过Java的都会配吧,很简单,配置根目录就可以了。这里就不再介绍了。。。
4.开发工具
工欲善其事必先利其器
由于在Linux上写代码比较费劲,所在我就不演示在Linux上的使用,各位大佬直接在官网的getting start阅览即可,很直观。幸运的是idea有Nginx的插件,开发起来非常方便,操作如下
idea版本:IntelliJ IDEA 2018.1.5 x64
安装nginx插件
我们顺便把lua脚本的插件也安装上,可以让lua语法高亮,并且有代码提示,开发起来就比在Linux上敲舒服多了,插件没有就点击browse repositories,这里可以下载到,和上面安装nginx插件一样。
安装之后需要重启idea。
新建项目
新建一个lua项目,之前安装了lua插件就可以创建了,一路next就可以了,创建自己的项目名称,lua的SDK可以不选择
项目建好以后,就光秃秃的一个项目名称。下面啥文件也没有,为了管理方便,我们把关于nginx的配置文件都放在conf目录下,lua脚本都放在src下,创建这两个目录即可。
项目建好了是不是就该写helloworld了,openresty内置了nginx也是基于nginx,所以是不是得先启动nginx啊,熟悉Tomcat的同学肯定知道怎么配置Tomcat服务器,那么一样的nginx也是服务器,它也需要配置一下才能在idea中启动
安装了nginx插件以后,就可以配置nginx服务器了
我们要点击configure把nginx的exe文件加载进来
把之前解压的文件夹中的nginx.exe加载到idea中
然后回到上一个面板 配置下nginx服务器的名称和日志
好了到这里为止,nginx就可以使用了,那么我们点击启动按钮,如果操作都没问题的话应该是可以启动的了
没有红色字体报错,就说明启动正常。然后访问:localhost,即可 不用端口号默认80
如果看到以下界面就说明已经配置成功了
5.开发准备工作
有很多人会很奇怪,明明项目就是个空项目,啥也没干,建了两个空文件夹而已嘛,是的,没错!此时的nginx启动和项目没有任何关系,它是用openresty的根目录conf下的ngin.conf配置文件启动的,所以和项目没啥关系,那我们为啥还要建项目呢!
建项目是为了维护方便,我们要在项目里写代码,写配置文件。难不成我还得把conf下的nginx.conf文件导入到nginx吗?嗯,这么做是可以的,但是相当于在openresty的眼皮子底下干活,一不小心是不是就把openresty安装的相关文件搞乱了或者是不小心删了怎么办。
所以要另起炉灶,我们可以在项目里写一个新的nginx.conf文件。然后让nginx用这个文件去启动,或者把该文件拷贝到openresty的根目录下的conf下,覆盖掉原来的nginx.conf。笔者选择在openresty根目录下新建一个workspace目录,把项目相关文件都放在这里(因为相对路径的存在,最好把项目文件都放在openresty目录下,像我这样)。那么问题来了,我项目的路径又不是在openresty根目录下的,难不成我每次要手动拷贝到这个目录???肯定不行,所以就有一个叫Ant的东西,可以解决这个问题,它可以在nginx启动之前把项目的文件全部生成到你指定目录。配置起来也很方便
Ant插件idea默认是支持的,不支持的话像安装nginx插件再装一下
新建一个xml文件 名称随便,稍微看一下就能看懂啥意思。该文件的作用就是搬运你指定的文件,从A搬到B,还能在搬运之前先删除一些日志什么的
<?xml version="1.0" encoding="UTF-8"?>
<project name="nginx" default="dist" basedir=".">
<description>
run pic-server
</description>
<!-- set global properties for this build -->
<property name="openresty-home" location="E:Javaopenresty-1.13.6.2-win64"/>
<property name="conf" location="${basedir}/conf"/>
<property name="src" location="${basedir}/src"/>
<property name="target-conf" location="${openresty-home}/workspace/conf"/>
<property name="target-src" location="${openresty-home}/workspace"/>
<echo>######开发版本的ant配置#####</echo>
<target name="clean" depends="">
<echo>清理openresty目录 ${dist}下的conf,logs,janus,januslib</echo>
<delete dir="${target-conf}"/>
<delete dir="${target-src}"/>
<!--<delete>-->
<!--<fileset dir="${openresty-home}/logs" includes="*.log"></fileset>-->
<!--</delete>-->
</target>
<target name="init" depends="clean">
<echo>创建安装目录</echo>
<mkdir dir="${target-conf}"/>
<mkdir dir="${target-src}"/>
</target>
<target name="dist" depends="init" description="generate the distribution" >
<echo>复制安装文件</echo>
<copy todir="${target-conf}">
<fileset dir="${conf}"></fileset>
</copy>
<copy todir="${target-src}">
<fileset dir="${src}"></fileset>
</copy>
</target>
</project>
然后加载该ant配置文件
加入配置文件
效果图
然后需要配置一下nginx服务器 让nginx去找openresty根目录下的workspace/conf/nginx.conf(目录可以自己定义),这步比较重要
启动nginx前 加载ant配置
选择dist
效果图
到这里插件配置结束,我们就需要在项目里配置nginx.conf文件了
把openresty根目录/conf/nginx.conf文件内容拷贝至我们新建的nginx.conf文件,先把图片的这行删除,后面介绍为啥删掉
然后启动nginx即可,访问localhost,这里可能会加载不到配置文件,那就是看官ant配置的地方写错了,所以仔细检查 两处nginx加载配置文件的目录,和你项目中ant配置的目的地目录要一致
到这里openresty的介绍和安装就告一段落了,后续文章将一步步介绍如何使用和配置。
本文如有瑕疵错误,欢迎指正!
以上是关于Nginx+lua+openresty系列 | 第一篇:openresty介绍的主要内容,如果未能解决你的问题,请参考以下文章
高并发 Nginx+Lua OpenResty系列——Lua模版渲染
高并发 Nginx+Lua OpenResty系列——Lua模版渲染
Nginx+lua+openresty系列 | 第三篇:nginx反向代理
高并发 Nginx+Lua OpenResty系列——HTTP服务