莊進發,資訊安全部背景開發工程師,主要負責内部oa系統的背景搭建
項目需要做一個檔案上傳下載下傳服務,利用 nginx+lua 做一個代理服務,上傳入口統一,分發到不同的機器存儲,下載下傳連結和實體存儲隔離,支援添加 agent 的方式擴容,這裡主要講一下思路和搭建配置過程,大神勿噴。

前端請求 nginx 服務, nginx 調用 upload 腳本,腳本通過查找配置,找到對應的邏輯存儲路徑和實體存儲機器的 agent 的 ip 和端口,通過 tcp 發包到對應 agent ,部署在對應機器的 agent 接受資料,并寫到本地檔案。
http下載下傳請求 nginx , nginx 調用 download 腳本,腳本解析連結參數,根據參數找到對應的 agent 位址,請求傳回檔案二進制内容,腳本接受到 agent 傳回的資料,傳回給請求端。
接下來主要講一下 nginx 安裝配置(這裡包括lua的二進制流處理 lpack, md5計算, mysql 操作, json 操作)
1、安裝 nginx
下載下傳http://nginx.org/en/download.html
解壓<code>tar -xvf nginx-1.10.3.tar.gz</code>
2、安裝 luajit(輕量級 lua)
http://luajit.org/download.html
修改 makefile 裡面的安裝路徑<code>export PREFIX= /usr/local/luajit</code>
然後安裝<code>make &make install</code>
3、安裝<code>nginx_lua_module</code>
下載下傳https://github.com/openresty/lua-nginx-module
解壓
4、 安裝<code>ngx_devel_kit</code> (NDK提供函數和宏處理一些基本任務,減輕第三方子產品開發的代碼量)
下載下傳https://github.com/simpl/ngx_devel_kit/
5、 安裝編譯,導入
啟動<code>/usr/local/nginx/sbin/nginx</code> 重新開機指令` usr/local/nginx/sbin/nginx -s reload v
如果報錯找不到luajit庫<code>ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2</code>
測試nginx直接打開浏覽器就可以了<code>http:10.x.x.x:8080</code>就可以看到歡迎界面了
6 、配置<code>conf/nginx.conf</code>運作 lua 腳本
增加lua庫的查找路徑<code>lua_package_path,lua_package_cpath</code>
7、增加<code>mysql.lua</code>下載下傳 https://github.com/openresty/lua-resty-mysql 拷貝到<code>lua_package_path</code> 目錄下就可以了
8、增加 csjon http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
修改 Makefile 裡面的 <code>PREFIX=/usr/local/luajit</code>就是luajit 的安裝路徑,make後将生成的 <code>cjson.so</code>拷貝到 <code>lua_package_cpath</code>目錄下
9、安裝lpack 可以用現成的 <code>lpack.lua</code> http://blog.csdn.net/tom_221x/article/details/41119715 拷貝到 <code>lua_package_path</code> 或者用 https://github.com/LuaDist/lpack 編譯生成 <code>lpack.so</code>拷貝到 <code>lua_package_cpath</code> 64位需要增加編譯指令 <code>-fPIC</code>
10、<code>upload.lua</code>下載下傳https://github.com/openresty/lua-resty-upload
11、<code>md5下載下傳</code> https://github.com/openresty/lua-resty-string
1、前端上傳頁面代碼
2、upload上傳代碼,該子產品在解析檔案上傳請求的過程中,主要采用了簡單的類似有限狀态機的算法來實作的,在不同的狀态由相應的 handler 進行處理。
3、tcp接收二進制資料
4、tcp寫二進制資料,這裡和 agent 的通信協定是:開始标志位+包長度+json 字元串+結束标志位,是以對應 pack 用的參數就是 bIAb ,> 就是轉化為大端
5、下載下傳錯誤的時候,使用了 redirect 直接跳轉到錯誤頁面,友善輸出錯誤資訊,其實這裡還可以做使用者 token 校驗
相關推薦
Nginx雙向認證配置指南
微信小程式檔案上傳下載下傳應用場景