OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。


  今天用OpenResty + lua来遍历指定目录,返回json字符串

  我们用Lua来遍历文件目录,并用nginx来访问lua文件,使其返回这个目录的json字符串。

  Lua代码:

 local lfs = require("lfs")

 function getType(path)
return lfs.attributes(path).mode
end function getSize(path)
return lfs.attributes(path).size
end function isDir(path)
return getType(path) == "directory"
end function findx(str,x)
for i = 1,#str do
if string.sub(str,-i,-i) == x then
return -i
end
end
end function getName(str)
return string.sub(str,findx(str,"/") + 1,-1)
end function getJson(path)
local table = "{"
for file in lfs.dir(path) do
p = path .. "/" .. file
if file ~= "." and file ~= '..' then
if isDir(p) then
s = "{'text':'".. file .. "','type':'" .. getType(p) .. "','path':'" .. p .. "','children':[]},"
else
s = "{'text':'".. file .. "','type':'" .. getType(p) .. "','path':'" .. p .. "','size':" .. getSize(p) .. ",'leaf':true},"
end
table = table .. s
end
end
table = table .. "}"
return table
end ngx.say(getJson('/var/www')) 

  这里遍历了"/var/www"目录下的所有文件及文件夹,并将其名字、类型、大小构成json字符串返回。ngx.say是Lua透露给模块的接口。


  前面已经提过如何安装配置openresty,这里就不重复了。

  接下来一步,我们在nginx下新建一个文件夹作为跟目录,比如在/usr/local/openresty/nginx/下建立一个work文件夹,work文件夹下建立logs文件夹用以存放日志文件,conf文件夹用以存放nginx配置文件。

  

  然后在conf文件夹中新建一个nginx.conf配置文件。

 worker_processes  2;  

 error_log logs/error.log;

 events {
worker_connections 1024;
}
http {
server {
listen 8080;
server_name localhost; location / {
root /usr/local/openresty/nginx/work;
index index.html index.htm;
}
}
}

  其中:

    worker_processes  数字代表nginx进程数,一般设置与自己电脑cpu内核数相同

    error_log  指定了日志文件存放目录

    worker_connections  单个进程最大连接数

    在http中添加一个server,监听8080端口,其中添加了location,之后的"/"表示访问url的最后一部分,譬如"/" ==> localhost:8080/   "/a" ==> localhost:8080/a

    location内的root指定了根目录,index指定了缺省访问顺序。

  如果现在访问localhost:8080,将会访问/usr/local/openresty/nginx/work目录下的index.html文件。

  我们可以用nginx -c 命令来启动指定的nginx配置文件。比如这里如果要启动nginx,命令为:

 /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/work/conf/nginx.conf 

  当然,这里必须保证8080端口没有被占用,否则就会发生:

  

  可以用netstat -lnp | grep 8080命令来查看什么进程占用了8080端口,然后用kill命令给kill掉,最后再重启。


  然后我们需要将Lua文件与nginx配合起来,在我们访问localhost:8080/dir时,将显示Lua生成的目录json字符串。

  我们修改nginx.conf文件: 

 worker_processes  2;

 error_log logs/error.log;

 events {
worker_connections 1024;
}
http {
server {
listen 8080;
server_name localhost; location / {
root /usr/local/openresty/nginx/work;
index index.html index.htm;
} location /dir {
default_type text/html;
  content_by_lua_file /usr/local/openresty/nginx/work/dir.lua;
}
}
}

  当我们访问localhost:8080/dir时,将自动访问work文件夹下的dir.lua文件。

  我们在/usr/local/openresty/nginx/work目录下新建dir.lua文件,内容为上面写过的内容。

  最后重启nginx。

  关于重启nginx,有两种方法,一种是用nginx -s reload,还有一种是kill掉nginx进程后,再nginx -c XXX/nginx.conf来启动指定nginx配置文件。

  两者的区别在于,nginx -s 和nginx -t缺省判断nginx默认的配置文件,即:

    /usr/local/openresty/nginx/sbin/nginx -t [-s reload]

  命令判断与重载的配置文件为默认的/usr/local/openresty/nginx/conf/nginx.conf文件。

  而第二种启动方法则可以启动指定目录下的配置文件,不过在启动前,需要保证没有nginx进程存在,所以一般需要先kill掉所有nginx进程,再用XXX/nginx -c XXX/nginx.conf来根据指定配置文件启动nginx。

  这里我们用第二种方法启动nginx:

killall -9 nginx
/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/work/conf/nginx.conf

  启动成功后访问"localhost:8080/dir":

【Lua】Lua + openresty遍历文件目录的更多相关文章

  1. 【Lua】关于遍历指定路径下所有目录及文件

    关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...

  2. 畅购商城(四):Lua、OpenResty、Canal实现广告缓存与同步

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...

  3. [译] Closures in Lua - Lua中的闭包

    原文:(PDF) . 摘要 一等(first-class)函数是一种非常强大的语言结构,并且是函数式语言的基础特性.少数过程式语言由于其基于栈的实现,也支持一等函数.本文讨论了Lua 5.x用于实现一 ...

  4. [转][译] Closures in Lua - Lua中的闭包

    http://www.cnblogs.com/plodsoft/p/5900270.html?utm_source=tuicool&utm_medium=referral 原文:(PDF) . ...

  5. python3.4下遍历文件目录,不需要再特殊处理中文编码

    python3.4下遍历文件目录,不需要再特殊处理中文编码 直接使用os.walk来遍历中文目录. os.walk方法返回的是一个三元 tupple(dirpath, dirnames, filena ...

  6. php实现遍历文件目录

    php实现遍历文件目录 一.总结 1.熟悉简单:很经典的例子,多看,然后发现熟悉了很简单 二.php实现遍历目录 php实现遍历目录 代码一: //遍历目录 function iteral($path ...

  7. go递归遍历文件目录

    package main import ( "fmt" "io/ioutil" "log" ) //文件目录树形结构节点 type dirT ...

  8. 安装lua和openresty

    #### ubuntu 16.04 64bit 安装Lua luajit 及openresty 1 安装lua ,因为luajit 支持lua5.1较好.貌似不支持5.2和5.3作为学习,我就安装5. ...

  9. 【Lua】LWT遍历指定目录并输出到页面中

    首先用lua遍历目录: function getDirs(path) local s = {} function attrdir(p) for file in lfs.dir(p) do if fil ...

随机推荐

  1. 解决VS2010中工具箱里没有WPM

    我前段时间要用到MS的WPM,但苦于找不到解决不了,无奈重装后一样的情况我的win7 旗舰版版+VS2010旗舰版.在控制面板里找到多媒体重新关闭并从新打开,就OK啦..记得要重启哦...

  2. linux 挂载和使用文件系统

    从分区,到创建文件系统,再到把磁盘或分区挂载到一个目录后才能够使用. Windows或Mac系统会自动进行挂载,一旦创建好文件系统后会自动挂载到系统上,Windows我们称之为C\D盘,而Linux需 ...

  3. redis整理の持久化机制

    redis是一个支持持久化的内存数据库,也就是说 redis 需要经常将内存中的数据同步到磁盘 来保证持久化.redis 支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另 ...

  4. Android-主题

    主题分为两种: 第一种:使用Android系统提供的主题    第二种:自己定义主题 样式 与 主题 区分理解 样式是控制(View的子类风格)控件风格 或者 是(ViewGroup的子类风格)布局风 ...

  5. Android-原生对话框

    package liudeli.ui.all; import android.app.Activity; import android.app.AlertDialog; import android. ...

  6. 转载C#中Trim()、TrimStart()、TrimEnd()的用法

    C#中Trim().TrimStart().TrimEnd()的用法:    这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一个 ...

  7. C#中的线程

    1.线程Thread 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程 ...

  8. go iris xorm包使用(sqlite3数据库增删查改)

    官网https://studyiris.com/example/orm/xorm.html例子,稍做修改 1.我是win64,但没有遇到mingw问题,应该是之前安装过gcc环境,参考:测试一下rob ...

  9. INSERT IGNORE 与INSERT INTO的区别,以及replace的用法

    INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据. 这样就可以保 ...

  10. 一分钟了解 TCP/IP 模型

    原文讲的不是特别细,为了便于理解,我颠倒了顺序. 写在开始 我们需要知道协议到底是什么. 在网络上,一个协议对应于管理系统之间如何相互通信的规则. 然后我们需要知道什么是协议族. 一个协议族是一系列协 ...