项目需要做一个文件上传下载服务,利用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
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搭建文件上传下载服务问题