解决nginx + lua搭建文件上传下载服务问题

  

  

项目需要做一个文件上传下载服务,利用nginx + lua做一个代理服务,上传入口统一,分发到不同的机器存储,下载链接和物理存储隔离,支持添加剂的方式扩容,这里主要讲一下思路和搭建配置过程,大神勿喷。

  

  

  

  

前端请求nginx服务,nginx调用上传脚本,脚本通过查找配置,找到对应的逻辑存储路径和物理存储机器的代理的ip和端口,通过tcp发包到对应代理部署在对应机器的代理接受数据,并写到本地文件。

  

  

http下载请求nginx, nginx调用脚下载本,脚本解析链接参数,根据参数找到对应的代理地址,请求返回文件二进制内容,脚本接受到代理返回的数据,返回给请求端。

  

  

接下来主要讲一下nginx安装配置(这里包括lua的二进制流处理lpack, md5计算,mysql操作,json操作)

  

1,安装nginx

  http://nginx.org/en/download.html

下载   

解压<代码>焦油-xvf nginx-1.10.3.tar.gz

  

2,安装luajit(轻量级lua)

  http://luajit.org/download.html

  

修改makefile里面的安装路径出口前缀=/usr/local/luajit
  

  

然后安装让,让安装

  

3,安装nginx_lua_module

  

下载https://github.com/openresty/lua-nginx-module
  

  

解压   

4,安装ngx_devel_kit (NDK提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量)

  https://github.com/simpl/ngx_devel_kit/

下载   

5,安装编译,导入

        出口LUAJIT_LIB=/usr/地方/luajit/lib   出口LUAJIT_INC=/usr/地方/luajit/include/luajit - 2.0   ./configure——prefix=/usr/地方/nginx——with-http_stub_status_module with-http_ssl_module——添加模块=/home/oicq/jeffzhuang/ngx_devel_kit-0.3.0——添加模块=/home/oicq/jeffzhuang/lua - nginx -模块- 0.10。   使j2   使安装      

启动/usr/地方/nginx/sbin/nginx重启命令“usr/地方/nginx/sbin/nginx - s重载v

  

如果报错找不到luajit库ln - s/usr/local/lib/libluajit-5.1.so。2/lib64/libluajit-5.1.so.2

  

测试nginx直接打开浏览器就可以了http: 10. . x.x.x: 8080就可以看到欢迎界面了

  

6,配置conf/nginx。参看运行lua脚本

  

增加lua库的查找路径lua_package_path, lua_package_cpath

  

解决nginx + lua搭建文件上传下载服务问题

  

7,增加mysql。lua下载https://github.com/openresty/lua-resty-mysql拷贝到lua_package_path目录下就可以了

  

8,增加csjon http://www.kyne.com.au/马克/软件/下载/lua-cjson-2.1.0.tar.gz

  

修改Makefile里面的PREFIX=/usr/地方/luajit就是luajit的安装路径,让后将生成的cjson.so拷贝到

  

lua_package_cpath目录下

  

9日安装lpack可以用现成的lpack。lua拷贝到lua_package_path或者用https://github.com/LuaDist/lpack编译生成lpack。所以拷贝到lua_package_cpath 64位需要增加编译命令- fpic

  

10, upload.lua下载https://github.com/openresty/lua-resty-upload

  

11、md5下载https://github.com/openresty/lua-resty-string

  

  

1,前端上传页面代码

        & lt; !DOCTYPE html>   & lt; html>   & lt; head>   & lt; title>文件上传example   & lt;/head>   & lt; body>   & lt;形式action=" emer_upload/order_system_storage " method=" post " enctype=岸嗖糠?格式”比;   & lt;输入类型="文件" name=" testFileName "/比;   & lt;输入类型=疤峤弧眓ame="上传" value=" https://www.yisu.com/zixun/Upload "/比;   & lt;/form>   & lt;/body>   & lt;/html>      

2,上传上传代码,该模块在解析文件上传请求的过程中,主要采用了简单的类似有限状态机的算法来实现的,在不同的状态由相应的处理程序进行处理。

        ——文件下载服务写到saveRootPath . .“/薄N募旅?   下载()函数   当地chunk_size=4096   当地的形式,呃=上传:新(chunk_size)   如果不是形式   ngx.log (ngx。呃,“没有新上传:“呃,)   ngx.exit (ngx.HTTP_INTERNAL_SERVER_ERROR)   结束   形式:set_timeout (100000)   而真正的做   当地typ res,呃=形式:阅读()   如果不是typ那么   ErrorMsg="未能读:“…犯错   返回1   结束   如果typ==巴贰?   当地关键=res [1]   本地值=https://www.yisu.com/zixun/res [2]   如果键==案郊印?   当地kvlist=string.split(价值,';')   _,kv ipairs (kvlist)   本地赛格=string.trim (kv)   如果凹陷:找到(“文件名”)   当地kvfile=字符串。分割(赛格,“=?   文件名=字符串。子(kvfile [2] 2 2)   如果文件名   ——获取文件后缀名字   fileExtension=getExtension(文件名)   当地linuxTime=tostring (os.time ())   filePath=saveRootPath . .“/薄璴inuxTime…文件名   fileToSave errmsg=io。打开(filePath“w +”)   ——存储的文件路径   ——ngx。说(“没有打开的文件”,filePath)   如果不是fileToSave那么   ——ngx。说(“没有打开的文件”,filePath . .errmsg)   ErrorMsg="打开文件失败”. .filePath . .errmsg   返回1   结束   其他的   ErrorMsg="请求参数找不到文件名字”   返回1   结束   ——跳出循环   打破   结束   结束   结束   elseif typ==吧硖濉?   如果fileToSave那么   fileToSave:写(res)   fileMd5:更新(res)   结束   elseif typ==皃art_end”   如果fileToSave那么   当地md5_sum=fileMd5:最后的()   ——ngx。说(“md5:“, str.to_hex (md5_sum))   fileMD532=str.to_hex (md5_sum)   fileToSave: close ()   fileToSave=nil   结束   elseif typ==癳of”   打破   其他的   ngx.log (ngx。信息,做其他事情)   结束   结束   返回0   

解决nginx + lua搭建文件上传下载服务问题