Maison > Article > Opération et maintenance > Comment résoudre le problème de la configuration du service de téléchargement et de téléchargement de fichiers avec nginx+lua
# 🎜🎜 ## 🎜🎜 # Logique principale # 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 # Téléchargement # 🎜🎜 ## 🎜🎜 ## 🎜🎜 #Le front-end demande le service nginx et nginx appelle le script de téléchargement. Le script trouve le chemin de stockage logique correspondant ainsi que l'adresse IP et le port de l'agent de la machine de stockage physique en recherchant la configuration, envoie le package à l'agent correspondant via. tcp et l'agent déployé sur la machine correspondante accepte les données et écrit dans le fichier local.
Download
http download request nginx, nginx appelle le script de téléchargement, le script analyse les paramètres du lien, trouve l'adresse de l'agent correspondante en fonction les paramètres et la requête renvoie le contenu binaire du fichier, le script reçoit les données renvoyées par l'agent et les renvoie à l'extrémité requérante.
Configuration de nginx+lua
Ensuite, nous parlerons principalement de la configuration de l'installation de nginx (cela inclut le traitement du flux binaire de Lua, le lpack, le calcul md5, le fonctionnement mysql, json)
1. Installez nginxDownload
Unzip
2. Lua léger)
Modifiez le chemin d'installation dans le makefile export prefix= /usr/local/luajitPuis installez make &make install
# 🎜 🎜#3. Installez nginx_lua_moduleDownloadtar -xvf nginx-1.10.3.tar.gz
Télécharger
5. Installer et compiler, importer
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
Démarrer /usr /local/nginx/ sbin/nginx restart command` usr/local/nginx/sbin/nginx -s reload v
Si une erreur est signalée et que la bibliothèque luajit est introuvable ln -s /usr/ local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
7. Ajoutez le téléchargement mysql.lua et copiez-le dans le répertoire lua_package_path
8. Ajoutez csjon
Modifiez le préfixe dans le makefile=/usr/local/luajit qui est le chemin d'installation de luajit , après make, copiez le cjson.so généré dans le répertoire
lua_package_cpath
9 Pour installer. lpack, vous pouvez utiliser le lpack.lua prêt à l'emploi pour le copier dans lua_package_path ou utiliser https:// github.com/luadist/lpack Compiler et générer lpack.so et le copier dans lua_package_cpath Pour 64 bits, vous devez l'ajouter. la commande de compilation -fpic
10, upload.lua download
11, md5 download# 🎜🎜#Main code# 🎜🎜#
1. Code de la page de téléchargement frontal<!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. Ce module analyse le processus de demande de téléchargement de fichier est principalement implémenté à l'aide d'un algorithme simple similaire à un algorithme fini. machine à états, et différents états sont traités par les gestionnaires correspondants.
--文件下载服务写到 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 reçoit des données binaires
-- 读取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 écrit des données binaires ici : indicateur de début + longueur du paquet + chaîne json + fin. flag bit, donc le paramètre correspondant à pack est biab, > est converti en big endian
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 Lors du téléchargement d'erreurs, la redirection est utilisée pour accéder directement à la page d'erreur pour faciliter la sortie de l'erreur. informations En fait, la vérification du jeton utilisateur peut également être effectuée ici
local errorurl="/downloaderror.html" errormsg="url 参数解析有问题 "..index return ngx.redirect(errorurl.."?msg="..errormsg,``` ngx.http_moved_temporarily).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!