Heim >Betrieb und Instandhaltung >Nginx >So lösen Sie das Problem der Einrichtung eines Datei-Upload- und Download-Dienstes mit Nginx+Lua
Hauptlogik
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
??
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
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
Hauptcode
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>
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,';') 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 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
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)
5
local errorurl="/downloaderror.html" errormsg="url 参数解析有问题 "..index return ngx.redirect(errorurl.."?msg="..errormsg,``` ngx.http_moved_temporarily)
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!