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":