【Lua】Lua + openresty遍历文件目录
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遍历文件目录的更多相关文章
- 【Lua】关于遍历指定路径下所有目录及文件
		
关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...
 - 畅购商城(四):Lua、OpenResty、Canal实现广告缓存与同步
		
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...
 - [译] Closures in Lua - Lua中的闭包
		
原文:(PDF) . 摘要 一等(first-class)函数是一种非常强大的语言结构,并且是函数式语言的基础特性.少数过程式语言由于其基于栈的实现,也支持一等函数.本文讨论了Lua 5.x用于实现一 ...
 - [转][译] Closures in Lua - Lua中的闭包
		
http://www.cnblogs.com/plodsoft/p/5900270.html?utm_source=tuicool&utm_medium=referral 原文:(PDF) . ...
 - python3.4下遍历文件目录,不需要再特殊处理中文编码
		
python3.4下遍历文件目录,不需要再特殊处理中文编码 直接使用os.walk来遍历中文目录. os.walk方法返回的是一个三元 tupple(dirpath, dirnames, filena ...
 - php实现遍历文件目录
		
php实现遍历文件目录 一.总结 1.熟悉简单:很经典的例子,多看,然后发现熟悉了很简单 二.php实现遍历目录 php实现遍历目录 代码一: //遍历目录 function iteral($path ...
 - go递归遍历文件目录
		
package main import ( "fmt" "io/ioutil" "log" ) //文件目录树形结构节点 type dirT ...
 - 安装lua和openresty
		
#### ubuntu 16.04 64bit 安装Lua luajit 及openresty 1 安装lua ,因为luajit 支持lua5.1较好.貌似不支持5.2和5.3作为学习,我就安装5. ...
 - 【Lua】LWT遍历指定目录并输出到页面中
		
首先用lua遍历目录: function getDirs(path) local s = {} function attrdir(p) for file in lfs.dir(p) do if fil ...
 
随机推荐
- 网络安全之iptables防火墙
			
1>各种传输方式到最后都会转化为能够通过网络发送的数据格式: 1>文本格式: 2>二进制格式:2>TCP三次握手连接,四次断开,连接时客户端是主动打开,服务器是被动 打开,处于 ...
 - 解决VS2010中工具箱里没有WPM
			
我前段时间要用到MS的WPM,但苦于找不到解决不了,无奈重装后一样的情况我的win7 旗舰版版+VS2010旗舰版.在控制面板里找到多媒体重新关闭并从新打开,就OK啦..记得要重启哦...
 - 20145233《网络对抗》Exp8 Web基础
			
20145233<网络对抗>Exp8 Web基础 实验问题思考 什么是表单? 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框.隐藏域 ...
 - vmware之VMware Remote Console (VMRC) SDK(一)
			
通过console可以实现类似远程桌面的功能,但它的实现方式和远程桌面不同,一般来说远程桌面必须要有网络支持,在机器关闭或者启动过程中无法连接.而console是通过esx的虚拟化组件实现远程桌面.在 ...
 - Windows store app[Part 1]:读取U盘数据
			
Windows 8系统下开发App程序,对于.NET程序员来说,需要重新熟悉下类库. 关于WinRT,引用一张网上传的很多的结构图: 图1 针对App的开发,App工作在系统划定的安全沙箱内,所以通过 ...
 - Dubbo与Hadoop RPC的区别
			
本文来自网易云社区 RPC(Remote Procedure Call,远程过程调用)是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编 ...
 - GPU大百科全书 第二章 凝固生命的光栅化
			
光栅化——死神来了…… 前言:在上一期的GPU大百科全书里,我们目睹了可爱的香草从抽象世界走向现实,从方程还原成实体的全过程.可以说香草活了,因为几何单元,我们赋予了她完整的灵魂. 如果你正在为G ...
 - 解决$ git clone fatal: Authentication failed
			
今天在使用git clone克隆项目的时候报如下错误: $ git clone XXXXXX Cloning into 'XXXX'... fatal: Authentication failed f ...
 - type=file 自定义文件默认可选类型
			
<input type="file" accept=".csv, application/vnd.openxmlformats-officedocument.spr ...
 - python 绘制抛物线
			
%matplotlib inlineimport matplotlib.pyplot as plt import numpy as npx = range(100) y = [val**2 for v ...