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能干嘛?

目前有两大目标:

  1. 作为通用的web服务器

  2. 对Nginx扩展编程(基于lua脚本语言)

Nginx的特点

  1. 高并发性能超好,Nginx官方测试5万并发性能良好

  2. 内存消耗少

  3. 成本低。在做负载均衡时可以作为F5(负载均衡设备)的替代品

  4. 稳定

  5. 支持热部署

openresty功能

  1. 根据lua脚本,可以对请求和响应 进行改造(使用lua控制请求响应)

  2. 也可以做虚拟主机、反向代理、缓存(很有用),如果只是纯虚拟主机或者反向代理还是推荐用nginx

  3. web服务器

因为是对nginx的封装 ,所以优势基本就是nginx所具有的的,再加上lua的支持又新增些东西,至于nginx的性能为何如此好,有兴趣的朋友可以研究下nginx使用的epoll模型和它的master-woker架构。



3.openresty安装

相信读者已经对openresty有了一定的了解,那么了解之后接下来就是要用它去做一些事情。那么怎么用呢?是不是像软件一样需要安装?我们就得去官网(http://openresty.org/en/)看看了。

openresty官网有中英文可以切换,不习惯英文的可以用中文,但是切换到中文以后,还是有部分是英文写的。我们点击download链接,可以看到有很多操作系统都可以安装。开发测试都可以在Linux上(但是不推荐,因为写代码不方便),Windows上也可以开发,并且会idea的话开发很方便,有相关插件。

Linux安装

Nginx+lua+openresty系列 | 第一篇:openresty介绍

windows安装

Nginx+lua+openresty系列 | 第一篇:openresty介绍

下载到Windows系统并解压之后如图:

Nginx+lua+openresty系列 | 第一篇:openresty介绍

我们大致了解下整个目录结构:

  1. /conf:里面包含了nginx的启动文件和一些常用的配置,比如mime.types文件配置了很多常见的HTTP content-type 头信息

  2. /html :nginx默认的启动页面和一个错误页面,也是nginx默认的资源加载目录

  3. /include:关于lua-jit即时编译器的东西

  4. /logs:默认用于存放nginx的错误日志文件和请求信息

  5. /lua:关于lua-jit即时编译器的东西

  6. /lualib:lua脚本自带的常用库,像Java中的jdk自带的库一样

  7. luajit.exe:lua的编译器,可以运行lua语句,初学lua可以使用它练习语法

  8. nginx.exe:windows下nginx的启动文件


然后将该目录配置到环境变量中,玩过Java的都会配吧,很简单,配置根目录就可以了。这里就不再介绍了。。。


4.开发工具


工欲善其事必先利其器



由于在Linux上写代码比较费劲,所在我就不演示在Linux上的使用,各位大佬直接在官网的getting start阅览即可,很直观。幸运的是idea有Nginx的插件,开发起来非常方便,操作如下


idea版本:IntelliJ IDEA 2018.1.5 x64

安装nginx插件

Nginx+lua+openresty系列 | 第一篇:openresty介绍

我们顺便把lua脚本的插件也安装上,可以让lua语法高亮,并且有代码提示,开发起来就比在Linux上敲舒服多了,插件没有就点击browse repositories,这里可以下载到,和上面安装nginx插件一样。
安装之后需要重启idea。

Nginx+lua+openresty系列 | 第一篇:openresty介绍

新建项目
新建一个lua项目,之前安装了lua插件就可以创建了,一路next就可以了,创建自己的项目名称,lua的SDK可以不选择

Nginx+lua+openresty系列 | 第一篇:openresty介绍

项目建好以后,就光秃秃的一个项目名称。下面啥文件也没有,为了管理方便,我们把关于nginx的配置文件都放在conf目录下,lua脚本都放在src下,创建这两个目录即可。

Nginx+lua+openresty系列 | 第一篇:openresty介绍

Nginx+lua+openresty系列 | 第一篇:openresty介绍

项目建好了是不是就该写helloworld了,openresty内置了nginx也是基于nginx,所以是不是得先启动nginx啊,熟悉Tomcat的同学肯定知道怎么配置Tomcat服务器,那么一样的nginx也是服务器,它也需要配置一下才能在idea中启动


安装了nginx插件以后,就可以配置nginx服务器了

Nginx+lua+openresty系列 | 第一篇:openresty介绍

我们要点击configure把nginx的exe文件加载进来

Nginx+lua+openresty系列 | 第一篇:openresty介绍

Nginx+lua+openresty系列 | 第一篇:openresty介绍

把之前解压的文件夹中的nginx.exe加载到idea中

Nginx+lua+openresty系列 | 第一篇:openresty介绍

Nginx+lua+openresty系列 | 第一篇:openresty介绍

然后回到上一个面板 配置下nginx服务器的名称和日志

Nginx+lua+openresty系列 | 第一篇:openresty介绍

好了到这里为止,nginx就可以使用了,那么我们点击启动按钮,如果操作都没问题的话应该是可以启动的了
没有红色字体报错,就说明启动正常。然后访问:localhost,即可 不用端口号默认80

Nginx+lua+openresty系列 | 第一篇:openresty介绍

如果看到以下界面就说明已经配置成功了

Nginx+lua+openresty系列 | 第一篇:openresty介绍

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插件再装一下

Nginx+lua+openresty系列 | 第一篇:openresty介绍

新建一个xml文件 名称随便,稍微看一下就能看懂啥意思。该文件的作用就是搬运你指定的文件,从A搬到B,还能在搬运之前先删除一些日志什么的



  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project name="nginx" default="dist" basedir=".">

  3.    <description>

  4.        run pic-server

  5.    </description>

  6.    <!-- set global properties for this build -->

  7.    <property name="openresty-home" location="E:Javaopenresty-1.13.6.2-win64"/>

  8.    <property name="conf" location="${basedir}/conf"/>

  9.    <property name="src" location="${basedir}/src"/>

  10.    <property name="target-conf" location="${openresty-home}/workspace/conf"/>

  11.    <property name="target-src" location="${openresty-home}/workspace"/>

  12.    <echo>######开发版本的ant配置#####</echo>

  13.    <target name="clean" depends="">

  14.        <echo>清理openresty目录 ${dist}下的conf,logs,janus,januslib</echo>

  15.        <delete dir="${target-conf}"/>

  16.        <delete dir="${target-src}"/>

  17.        <!--<delete>-->

  18.            <!--<fileset dir="${openresty-home}/logs" includes="*.log"></fileset>-->

  19.        <!--</delete>-->

  20.    </target>


  21.    <target name="init" depends="clean">

  22.        <echo>创建安装目录</echo>

  23.        <mkdir dir="${target-conf}"/>

  24.        <mkdir dir="${target-src}"/>

  25.    </target>

  26.    <target name="dist" depends="init" description="generate the distribution" >

  27.        <echo>复制安装文件</echo>

  28.        <copy todir="${target-conf}">

  29.            <fileset dir="${conf}"></fileset>

  30.        </copy>

  31.        <copy todir="${target-src}">

  32.            <fileset dir="${src}"></fileset>

  33.        </copy>

  34.    </target>

  35. </project>



然后加载该ant配置文件

Nginx+lua+openresty系列 | 第一篇:openresty介绍

加入配置文件

Nginx+lua+openresty系列 | 第一篇:openresty介绍

效果图

Nginx+lua+openresty系列 | 第一篇:openresty介绍

然后需要配置一下nginx服务器 让nginx去找openresty根目录下的workspace/conf/nginx.conf(目录可以自己定义),这步比较重要

Nginx+lua+openresty系列 | 第一篇:openresty介绍

启动nginx前 加载ant配置

Nginx+lua+openresty系列 | 第一篇:openresty介绍

选择dist

Nginx+lua+openresty系列 | 第一篇:openresty介绍

效果图

Nginx+lua+openresty系列 | 第一篇:openresty介绍

到这里插件配置结束,我们就需要在项目里配置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服务

高并发 Nginx+Lua OpenResty系列——HTTP服务

高并发 Nginx+Lua OpenResty系列(10)——商品详情页