Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk menyelesaikan masalah menyediakan perkhidmatan muat naik dan muat turun fail dengan nginx+lua

Bagaimana untuk menyelesaikan masalah menyediakan perkhidmatan muat naik dan muat turun fail dengan nginx+lua

PHPz
PHPzke hadapan
2023-05-11 20:52:041620semak imbas

Logik utama

Bagaimana untuk menyelesaikan masalah menyediakan perkhidmatan muat naik dan muat turun fail dengan nginx+lua

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

Bagaimana untuk menyelesaikan masalah menyediakan perkhidmatan muat naik dan muat turun fail dengan nginx+lua

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,&#39;;&#39;)
   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
end

3. 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));
end

4 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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam