【Lua】Lua + openresty遍歷文件目錄


  OpenResty (也稱為 ngx_openresty)是一個全功能的 Web 應用服務器,它打包了標准的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數依賴項。


  今天用OpenResty + lua來遍歷指定目錄,返回json字符串

  我們用Lua來遍歷文件目錄,並用nginx來訪問lua文件,使其返回這個目錄的json字符串。

  Lua代碼:

 1 local lfs = require("lfs")
 2 
 3 function getType(path)
 4   return lfs.attributes(path).mode
 5 end
 6 
 7 function getSize(path)
 8   return lfs.attributes(path).size
 9 end
10 
11 function isDir(path)
12    return getType(path) == "directory"
13 end
14 
15 function findx(str,x)
16   for i = 1,#str do
17       if string.sub(str,-i,-i) == x then
18           return -i
19       end
20   end
21 end
22 
23 function getName(str)
24       return string.sub(str,findx(str,"/") + 1,-1)
25 end
26 
27 function getJson(path)
28   local table = "{"
29   for file in lfs.dir(path) do
30     p = path .. "/" .. file
31     if file ~= "." and file ~= '..' then
32       if isDir(p) then
33         s = "{'text':'".. file .. "','type':'" .. getType(p) .. "','path':'" .. p .. "','children':[]},"
34       else
35         s = "{'text':'".. file .. "','type':'" .. getType(p) .. "','path':'" .. p .. "','size':" .. getSize(p) .. ",'leaf':true},"
36       end  
37       table = table .. s    
38     end
39   end
40   table = table .. "}"
41   return table
42 end
43 
44 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配置文件。

 1 worker_processes  2;  
 2 
 3 error_log logs/error.log;
 4 
 5 events {
 6     worker_connections 1024;
 7 }
 8 http {
 9     server {
10        listen 8080;
11        server_name  localhost;
12        
13        location / {
14                root /usr/local/openresty/nginx/work;
15                index  index.html index.htm;     
16        }
17     }
18 }

  其中:

    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文件: 

 1 worker_processes  2;
 2 
 3 error_log logs/error.log;
 4 
 5 events {
 6     worker_connections 1024;
 7 }
 8 http {
 9     server {
10        listen 8080;
11        server_name  localhost;
12        
13        location / {
14                root /usr/local/openresty/nginx/work;
15                index  index.html index.htm;     
16        }
17        
18        location /dir {
19                default_type text/html;
20               content_by_lua_file /usr/local/openresty/nginx/work/dir.lua;
21        }
22     }
23 }

  當我們訪問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":

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM