Rumah > Artikel > Operasi dan penyelenggaraan > Bagaimana untuk menyelesaikan masalah menyediakan perkhidmatan muat naik dan muat turun fail dengan nginx+lua
Logik utama
Muat naik
Halaman hadapan meminta perkhidmatan nginx dan nginx memanggil skrip muat naik. Skrip Dengan mencari konfigurasi, cari laluan storan logik yang sepadan dan IP dan port ejen mesin storan fizikal, hantar pakej kepada ejen yang sepadan melalui tcp, dan ejen yang digunakan pada mesin yang sepadan menerima data dan menulisnya ke fail tempatan.
Muat turun
permintaan muat turun http nginx, nginx memanggil skrip muat turun, skrip menghuraikan parameter pautan, mencari alamat ejen yang sepadan mengikut parameter, permintaan kembali kandungan perduaan fail, dan skrip menerima Data yang dikembalikan oleh ejen dikembalikan ke hujung permintaan.
Mengkonfigurasi nginx+lua
Yang berikut terutamanya bercakap tentang konfigurasi pemasangan nginx (ini termasuk lpack pemprosesan aliran binari lua, pengiraan md5, operasi mysql, operasi json)
1. Pasang nginx
Muat turun
Nyahzip tar -xvf nginx-1.10.3.tar.gz
2. Pasang luajit (lua ringan)
Ubah suai Pemasangan fail path export prefix= /usr/local/luajit
Kemudian pasang make &make install
3 Pasang nginx_lua_module
Muat turun
. Nyahzip
4. Pasang ngx_devel_kit (ndk menyediakan fungsi dan makro untuk mengendalikan beberapa tugas asas, mengurangkan jumlah kod untuk pembangunan modul pihak ketiga)
Muat turun
5. Pasang, susun dan import
export luajit_lib=/usr/local/luajit/lib export luajit_inc=/usr/local/luajit/include/luajit-2.0 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/home/oicq/jeffzhuang/ngx_devel_kit-0.3.0 --add-module=/home/oicq/jeffzhuang/lua-nginx-module-0.10. make -j2 make install
Mulakan /usr/local/nginx/sbin/nginx dan mulakan semula arahan ` usr/local/nginx/sbin/nginx -s reload v
Jika ralat dilaporkan, perpustakaan luajit tidak boleh ditemui ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
Untuk menguji nginx, cuma buka penyemak imbas dan anda boleh melihat http:10.x.x.x:8080 Antara muka aluan
6 Konfigurasikan conf/nginx.conf untuk menjalankan skrip lua
Tambah laluan carian lua_package_path pustaka lua, lua_package_cpath
7. Tambah muat turun mysql.lua dan salin ke direktori lua_package_path
8. Tambah csjon
dan ubah suai fail make prefix=/usr/local/luajit ialah laluan pemasangan luajit, buat Kemudian salin cjson.so yang dihasilkan ke direktori
lua_package_cpath
9. Untuk memasang lpack, anda boleh menggunakan ready -buat lpack.lua untuk menyalin ke lua_package_path atau gunakan https://github.com/luadist/ Kompilasi lpack untuk menjana lpack.so dan salin ke lua_package_cpath Untuk 64-bit, anda perlu menambah arahan kompilasi -fpic
10, muat turun upload.lua
11, muat turun md5
kod utama
1 >
<!doctype html> <html> <head> <title>file upload example</title> </head> <body> <form action="emer_upload/order_system_storage" method="post" enctype="multipart/form-data"> <input type="file" name="testfilename"/> <input type="submit" name="upload" value="upload" /> </form> </body> </html>2. Dalam proses menghuraikan permintaan muat naik fail, modul ini menggunakan algoritma ringkas yang serupa dengan mesin keadaan terhingga untuk mencapai ini, keadaan yang berbeza diproses oleh pengendali yang sepadan.
--文件下载服务写到 saverootpath .."/" .. filename 下面 function download() local chunk_size = 4096 local form,err=upload:new(chunk_size) if not form then ngx.log(ngx.err, "failed to new upload: ", err) ngx.exit(ngx.http_internal_server_error) end form:set_timeout(100000) while true do local typ,res,err=form:read() if not typ then errormsg="failed to read :"..err return 1 end if typ =="header" then local key=res[1] local value=res[2] if key =="content-disposition" then local kvlist=string.split(value,';') for _, kv in ipairs(kvlist) do local seg = string.trim(kv) if seg:find("filename") then local kvfile = string.split(seg, "=") filename = string.sub(kvfile[2], 2, -2) if filename then --获取文件后缀名字 fileextension=getextension(filename) local linuxtime=tostring(os.time()) filepath=saverootpath .."/" ..linuxtime..filename filetosave,errmsg = io.open(filepath, "w+") --存储的文件路径 --ngx.say("failed to open file ", filepath) if not filetosave then --ngx.say("failed to open file ", filepath .. errmsg) errormsg="打开文件失败"..filepath .. errmsg return 1 end else errormsg="请求参数找不到文件名字" return 1 end --跳出循环 break end end end elseif typ =="body" then if filetosave then filetosave:write(res) filemd5:update(res) end elseif typ =="part_end" then if filetosave then local md5_sum=filemd5:final() --ngx.say("md5: ", str.to_hex(md5_sum)) filemd532=str.to_hex(md5_sum) filetosave:close() filetosave = nil end elseif typ =="eof" then break else ngx.log(ngx.info, "do other things") end end return 0 end3. TCP menerima data binari
-- 读取byte function readint8(tcp) local next, val = string.unpack(tcp:receive(1), "b") return tonumber(val); end -- 读取int16 function readint16(tcp) local next, val = string.unpack(tcp:receive(2), "h"); return tonumber(val); end -- 读取int32 function readint32(tcp) local next, val = string.unpack(tcp:receive(4), ">i"); return tonumber(val); end -- 读取字符串 function readstring(tcp,len) return tostring(tcp:receive(len)); end4 TCP menulis data binari Protokol komunikasi dengan ejen di sini ialah: bendera mula + panjang paket + rentetan json + bendera tamat parameter yang sepadan dengan pek ialah biab, > ditukar menjadi endian besar
jsondata["filename"]=filemd532 .. "." .. fileextension jsondata["cmd"]="write" jsondata["filesize"]=tostring(filelen) jsondata["path"]=system.."/"..storagedate local jsonstr=cjson.encode(jsondata) local uilen=string.len(jsonstr) senddata=bpack(">b1iab",startindex,uilen,jsonstr,endindex) socket:send(senddata)5. Apabila memuat turun ralat, ubah hala digunakan untuk melompat terus ke halaman ralat, yang sesuai untuk mengeluarkan maklumat ralat. anda juga boleh menjadi pengguna di sini pengesahan token
local errorurl="/downloaderror.html" errormsg="url 参数解析有问题 "..index return ngx.redirect(errorurl.."?msg="..errormsg,``` ngx.http_moved_temporarily)
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah menyediakan perkhidmatan muat naik dan muat turun fail dengan nginx+lua. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!