OpenResty是一款基于Nginx的高性能负载均衡服务器容器,简单来说是Nginx+Lua。结合了Lua语言来对Nginx进行扩展,使得在Nginx上具有web容器功能。

OpenResty运行环境搭建

首先是在CentOS 7.6上的安装过程:

cd /opt

安装编译所需要的环境:

yum install readline-devel pcre-devel openssl-devel gcc

去OpenResty的官网下载安装包:
地址:http://openresty.org/cn/download.html

复制下载地址:

wget https://openresty.org/download/openresty-1.15.8.1.tar.gz

解压文件:

tar -xvzf openresty-1.15.8.1.tar.gz
cd openresty-1.15.8.1

安装OpenResty并设置安装目录为/opt/openresty,如果不做设置,默认会安装至/usr/local/openresty:

./configure --with-cc-opt="-I/usr/local/include" --with-ld-opt="-L/usr/local/lib" --prefix=/opt/openresty
make
make install

至此,OpenResty安装完成,可以尝试启动:

/opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/

可以查看端口占用:

netstat -tnlp


从图中可以看出nginx已经在监听80端口,用浏览器访问服务器的80端口,如图:

OpenResty已经成功启动
在修改相关配置文件后,需先停止服务,再做启动:

/opt/openresty/nginx/sbin/nginx -s stop
/opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/

nginx+lua 开发环境配置:

1. 编辑nginx.conf配置文件

vi /opt/openresty/nginx/conf/nginx.conf

2. 在http部分添加如下配置

#lua模块路径,多个之间”;”分隔,其中”;;”表示默认搜索路径,默认到/usr/servers/nginx下找  

lua_package_path "/opt/openresty/lualib/?.lua;;"; #lua 模块

lua_package_cpath "/opt/openresty/lualib/?.so;;"; #c 模块

3. 为了方便开发在/opt/openresty/nginx/conf目录下创建一个lua.conf

#lua.conf
server {
listen 80;
server_name _;
}

4 在nginx.conf中的http部分添加include lua.conf包含此文件片段

include lua.conf;

5. 测试是否正常

/opt/openresty/nginx/sbin/nginx -t

如果如下图所示,表示配置添加成功

Hello world

1.在lua.conf中server部分添加如下配置

location /lua {
default_type 'text/html';
content_by_lua 'ngx.say("hello world")';
}

2. 测试配置是否正确

/opt/openresty/nginx/sbin/nginx -t

3. 重启nginx

/opt/openresty/nginx/sbin/nginx -s stop
/opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/

4. 访问域名http://xxx.xxx.xxx/lua(自己的机器根据实际情况换ip),可以看到如下内容

hello world

5. lua代码文件

我们把lua代码放在nginx配置中会随着lua的代码的增加导致配置文件太长不好维护,因此我们应该把lua代码移到外部文件中存储。

vi /opt/openresty/nginx/conf/lua/test.lua

我这里把代码放在nginx/config/lua中
修改lua.conf,在http下增加

content_by_lua_file conf/lua/test.lua; #相对于nginx安装目录

现在lua.conf整体为:

#lua.conf
server {
listen 80;
server_name _;
location /lua {
default_type 'text/html';
content_by_lua_file conf/lua/test.lua; #相对于nginx安装目录
}
}

此处conf/lua/test.lua也可以使用绝对路径/usr/servers/nginx/conf/lua/test.lua。

6. lua_code_cache

默认情况下lua_code_cache 是开启的,即缓存lua代码,即每次lua代码变更必须reload nginx才生效,如果在开发阶段可以通过lua_code_cache off;关闭缓存,这样调试时每次修改lua代码不需要reload nginx;但是正式环境一定记得开启缓存。

#lua.conf
server {
listen 80;
server_name _;
location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file conf/lua/test.lua; #相对于nginx安装目录
}
}

开启后reload nginx会看到如下报警
nginx: [alert] lua_code_cache is off; this will hurt performance in /opt/openresty/nginx/conf/lua.conf:7

7. 错误日志

如果运行过程中出现错误,请不要忘记查看错误日志。

tail -f /opt/openresty/nginx/logs/error.log

到此,基本环境搭建完毕。

nginx+lua项目构建

以后我们的nginx lua开发文件会越来越多,我们应该把其项目化,已方便开发。项目目录结构如下所示:
OpenResty

其中我们把lualib也放到项目中的好处就是以后部署的时候可以一起部署,防止有的服务器忘记复制依赖而造成缺少依赖的情况。
我们将项目放到到/usr/openResty目录下。
nginx.conf配置文件修改includ的conf文件,修改为我们项目中的conf,同时修改引入lualib的地址

    #lua模块路径,多个之间”;”分隔,其中”;;”表示默认搜索路径,默认到/usr/servers/nginx下找
lua_package_path "/usr/openResty/lualib/?.lua;;"; #lua 模块
lua_package_cpath "/usr/openResty/lualib/?.so;;"; #c 模块 include /usr/openResty/openResty.conf;

通过绝对路径包含我们的lua依赖库和nginx项目配置文件。
/usr/openResty/openResty.conf的内容如下:

server {
listen 80;
server_name _; location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/openResty/lua/test.lua;
}
}

lua文件我们使用绝对路径/usr/openResty/lua/test.lua

到此,整个openResty就可以扔到github上了。
github:git@github.com:meteor1993/openResty.git

高并发 Nginx+Lua OpenResty系列(1)——环境搭建的更多相关文章

  1. 高并发 Nginx+Lua OpenResty系列(3)——模块指令

    Nginx Lua 模块指令 Nginx共11个处理阶段,而相应的处理阶段是可以做插入式处理,即可插拔式架构:另外指令可以在http.server.server if.location.locatio ...

  2. 高并发 Nginx+Lua OpenResty系列(11)——流量复制/AB测试/协程

    流量复制 在实际开发中经常涉及到项目的升级,而该升级不能简单的上线就完事了,需要验证该升级是否兼容老的上线,因此可能需要并行运行两个项目一段时间进行数据比对和校验,待没问题后再进行上线.这其实就需要进 ...

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

    本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后 ...

  4. 高并发 Nginx+Lua OpenResty系列(9)——HTTP服务

    此处我说的HTTP服务主要指如访问京东网站时我们看到的热门搜索.用户登录.实时价格.实时库存.服务支持.广告语等这种非Web页面,而是在Web页面中异步加载的相关数据.这些服务有个特点即访问量巨大.逻 ...

  5. 高并发 Nginx+Lua OpenResty系列(2)——Nginx Lua API

    Nginx Lua API 和一般的Web Server类似,我们需要接收请求.处理并输出响应.而对于请求我们需要获取如请求参数.请求头.Body体等信息:而对于处理就是调用相应的Lua代码即可:输出 ...

  6. 高并发 Nginx+Lua OpenResty系列(8)——Lua模版渲染

    模版渲染 动态web网页开发是Web开发中一个常见的场景,比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实现.而Lua中也有许多模板引擎,如目前京东在使用的lua-resty-tem ...

  7. 高并发 Nginx+Lua OpenResty系列(5)——Lua开发库Redis

    Redis客户端 lua-resty-redis是为基于cosocket API的ngx_lua提供的Lua redis客户端,通过它可以完成Redis的操作.默认安装OpenResty时已经自带了该 ...

  8. 高并发 Nginx+Lua OpenResty系列(4)——Lua 模块开发

    在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每 ...

  9. 高并发 Nginx+Lua OpenResty系列(7)——Lua开发库json

    JSON库 在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能:目前Lua也有几个JSON库,如:cjson.dkjson.其中cjson的语法 ...

随机推荐

  1. Socket实现原理和机制

    要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...

  2. 理解 t-SNE (Python)

    t-SNE(t-distribution Stochastic Neighbor Embedding)是目前最为流行的高维数据的降维算法. t-SNE 成立的前提基于这样的一个假设:我们现实世界观察到 ...

  3. 得知OpenCV研究报告指出系列(一)VS2010+OpenCV2.4.9环境配置

    学习OpenCV,首先,当然,要知道如何配置的环境. 余系统的软件和硬件环境,如以下: 以本人的配置环境为例,配置过程例如以下. 第一步 下载及解压OpenCV源代码 尽管非常多第三方站点及一些学习论 ...

  4. WPF自定义LED风格数字显示控件

    原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/article/de ...

  5. 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection

    问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...

  6. DELPHI下多线程编程的几个思维误区(QDAC)

    有几个网友私下问我一些有关线程的事情.过节写个东西上来大家交流. 思维误区1,自己新建的THREAD是线程,自己的主程序不是线程. 很多人在多线程编程没有把主线程也当作线程.其实主线程也是线程.看起来 ...

  7. Bootstrap路径导航

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  8. 【WPF】右下角弹出自定义通知样式(Notification)——简单教程

    原文:[WPF]右下角弹出自定义通知样式(Notification)--简单教程 1.先看效果 2.实现 1.主界面是MainWindow 上面就只摆放一个Button即可.在Button的点击事件中 ...

  9. vagrant up 无法加载映像目录

    错误代码显示: ==> default: Attempting graceful shutdown of VM... ==> default: Clearing any previousl ...

  10. NOPI 基本读写

    //获取cell的数据,并设置为对应的数据类型 public object GetCellValue(ICell cell) { object value = null; try { if (cell ...