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

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

PHPz
PHPzavant
2023-05-11 20:52:041610parcourir

# 🎜🎜 ## 🎜🎜 # 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

Comment résoudre le problème de la configuration du service de téléchargement et de téléchargement de fichiers avec nginx+luahttp 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/luajit

Puis installez make &make install

# 🎜 🎜#3. Installez nginx_lua_module

Download

tar -xvf nginx-1.10.3.tar.gz

Unzip

4. tâches , réduisez la quantité de code pour le développement de modules tiers)


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

Pour tester nginx, ouvrez simplement le navigateur directement http:10.x.x.x:8080 et vous pourrez voir le interface de bienvenue

6. Configurez conf/nginx.conf pour exécuter le script lua

Augmentez le chemin de recherche de la bibliothèque lua lua_package_path, lua_package_cpath

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 downloadComment résoudre le problème de la configuration du service de téléchargement et de téléchargement de fichiers avec nginx+lua

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

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

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer