So lösen Sie das Problem der Einrichtung eines Datei-Upload- und Download-Dienstes mit Nginx+Lua

PHPz
Freigeben: 2023-05-11 20:52:04
nach vorne
1559 Leute haben es durchsucht

Hauptlogik

So lösen Sie das Problem der Einrichtung eines Datei-Upload- und Download-Dienstes mit Nginx+Lua

Upload

Das Frontend fordert den Nginx-Dienst an, Nginx ruft das Upload-Skript auf und das Skript findet den entsprechenden logischen Speicherpfad sowie die IP und den Port des Agenten der physischen Speichermaschine Durchsuchen Sie die Konfiguration und senden Sie das Paket über TCP an den entsprechenden Agenten. Der auf dem entsprechenden Computer bereitgestellte Agent empfängt die Daten und schreibt sie in eine lokale Datei.

Download

HTTP-Download-Anfrage an Nginx, Nginx ruft das Download-Skript auf, das Skript analysiert die Link-Parameter, findet die entsprechende Agentenadresse gemäß den Parametern und fordert die Rückgabe des binären Inhalts der Datei an. Das Skript empfängt die zurückgegebenen Daten vom Agenten und sendet es an die anfordernde Seite zurück.

Nginx+lua konfigurieren

Als nächstes werden wir hauptsächlich über die Nginx-Installationskonfiguration sprechen (dazu gehören Luas Binär-Stream-Verarbeitungs-Lpack, MD5-Berechnung, MySQL-Betrieb, JSON-Betrieb)

1. Nginx installieren

Herunterladen

Entpackentar -xvf nginx-1.10.3.tar.gz ??

4. Installieren Sie ngx_devel_kit (NDK stellt Funktionen und Makros zur Verfügung, um einige grundlegende Aufgaben zu erledigen und reduziert so die Codemenge für die Modulentwicklung von Drittanbietern)

Herunterladen


5. Installieren und kompilieren, importieren

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
Nach dem Login kopieren

Starten Sie /usr/local/. nginx/sbin/nginx Neustartbefehl ` usr/local/nginx/sbin/nginx -s reload v

Wenn ein Fehler gemeldet wird und die Luajit-Bibliothek nicht gefunden werden kann, ln -s /usr/local/lib/libluajit-5.1.so .2 /lib64/liluajit-5.1.so.2

Um Nginx zu testen, öffnen Sie einfach den Browser direkt unter http:10.x.x.x:8080 und Sie können die Willkommensoberfläche sehen

6. Konfigurieren Sie conf/nginx.conf für die Ausführung das Lua-Skript

Fügen Sie den Suchpfad der Lua-Bibliothek lua_package_path hinzu

7. Fügen Sie mysql.lua hinzu und kopieren Sie es in das Verzeichnis lua_package_path

Ändern Sie das Makefile =/usr/local/luajit ist der Installationspfad von luajit, der nach make generiert wird. Kopieren Sie cjson.so in das Verzeichnis

lua_package_cpath

9. Um lpack zu installieren, können Sie die vorgefertigte Datei lpack.lua verwenden Nach lua_package_path kopieren oder https://github.com/luadist/lpack verwenden, um lpack.so zu kompilieren und zu generieren und nach lua_package_cpath zu kopieren. 64-Bit erforderlich. Kompilierungsbefehl hinzugefügt – fpic

10, upload.lua download

11, MD5-Download

HauptcodeSo lösen Sie das Problem der Einrichtung eines Datei-Upload- und Download-Dienstes mit Nginx+Lua

1, Front-End-Upload-Seitencode

<!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>
Nach dem Login kopieren

2, Upload-Upload-Code, dieses Modul analysiert die Datei-Upload-Anfrage. Dabei wird es hauptsächlich mit einem einfachen Algorithmus implementiert, der einem endlichen ähnelt Zustandsmaschine, und verschiedene Zustände werden von entsprechenden Handlern verarbeitet.

--文件下载服务写到 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
Nach dem Login kopieren

3. TCP empfängt Binärdaten

-- 读取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
Nach dem Login kopieren

4. Das Kommunikationsprotokoll mit dem Agenten lautet hier: Startflag + Paketlänge + JSON-String + Endflag, daher ist der für das entsprechende Paket verwendete Parameter Bias . > Es wird in Big Endian umgewandelt.

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)
Nach dem Login kopieren

5

local errorurl="/downloaderror.html"
errormsg="url 参数解析有问题 "..index
return ngx.redirect(errorurl.."?msg="..errormsg,``` ngx.http_moved_temporarily)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Einrichtung eines Datei-Upload- und Download-Dienstes mit Nginx+Lua. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!