>운영 및 유지보수 >엔진스 >nginx+lua를 사용하여 파일 업로드 및 다운로드 서비스 설정 문제를 해결하는 방법

nginx+lua를 사용하여 파일 업로드 및 다운로드 서비스 설정 문제를 해결하는 방법

PHPz
PHPz앞으로
2023-05-11 20:52:041626검색

Main logic

nginx+lua를 사용하여 파일 업로드 및 다운로드 서비스 설정 문제를 해결하는 방법

Upload

프론트엔드는 nginx 서비스를 요청하고, nginx는 업로드 스크립트를 호출하며, 스크립트는 다음과 같은 방법으로 해당 논리적 저장소 경로와 에이전트의 IP 및 물리적 저장소 머신의 포트를 찾습니다. 구성을 검색하고 tcp를 통해 패키지를 해당 에이전트로 전송하며, 해당 머신에 배포된 에이전트는 데이터를 수신하여 로컬 파일에 씁니다.

Download

http 다운로드 요청 nginx, nginx는 다운로드 스크립트를 호출하고, 스크립트는 링크 매개변수를 구문 분석하고, 매개변수에 따라 해당 에이전트 주소를 찾고, 파일 바이너리 콘텐츠를 반환하도록 요청합니다. 스크립트는 반환된 데이터를 받습니다. 에이전트에 의해 요청 측으로 반환됩니다.

Configure nginx++lua

다음으로 nginx 설치 구성에 대해 주로 설명하겠습니다. (여기에는 lua의 바이너리 스트림 처리 lpack, md5 계산, mysql 작업, json 작업이 포함됩니다.)

1 nginx 설치

Download

Unziptar -xvf nginx-1.10.3.tar.gz

2. luajit(경량 lua) 설치

makefile 내보내기 접두사 = /usr/local/luajit

에서 설치 경로를 수정한 다음 make를 설치하고 make install

3 nginx_lua_module을 설치합니다

Download

Unzip

4. ngx_devel_kit을 설치합니다(ndk는 일부 기본 작업을 처리하기 위한 함수와 매크로를 제공하여 타사 모듈 개발을 위한 코드 양을 줄입니다)

Download

5 설치 및 컴파일, 가져오기

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

/usr/local/ 시작 nginx/sbin/nginx 재시작 명령 ` usr/local/nginx/sbin/nginx -s reload v

오류가 보고되고 luajit 라이브러리를 찾을 수 없는 경우 ln -s /usr/local/lib/libluajit-5.1.so .2 /lib64/libluajit-5.1.so.2

nginx를 테스트하려면 http:10.x.x.x:8080에서 직접 브라우저를 열면 환영 인터페이스를 볼 수 있습니다

6. conf/nginx.conf를 구성하여 실행하세요. lua 스크립트

lua 라이브러리 lua_package_path, lua_package_cpath

nginx+lua를 사용하여 파일 업로드 및 다운로드 서비스 설정 문제를 해결하는 방법

7.mysql.lua 다운로드를 추가하고

8.csjon

makefile을 수정하세요. =/usr/local/luajit은 make 후에 생성될 luajit의 설치 경로입니다. cjson.so를

lua_package_cpath 디렉터리

9에 복사하면 이미 만들어진 lpack.lua를 사용할 수 있습니다. lua_package_path에 복사하거나 https://github.com/luadist/lpack을 사용하여 lpack.so를 컴파일 및 생성하고 lua_package_cpath에 복사합니다. 64비트 필요 컴파일 명령 추가 - fpic

10, upload.lua download

11, md5 download

main code

1, front-end upload page code

<!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, 이 모듈은 파일 업로드 요청을 파싱하는 과정에서 주로 유한 상태와 유사한 간단한 알고리즘을 사용하여 구현됩니다. 기계와 다른 상태는 해당 핸들러에 의해 처리됩니다.

--文件下载服务写到 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는 바이너리 데이터를 수신합니다

-- 读取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는 여기서 에이전트와의 통신 프로토콜은 시작 플래그 + 패킷 길이 + json 문자열 + 종료 플래그이므로 해당 팩에 사용되는 매개변수는 바이어스입니다. .> 빅 엔디안으로 변환됩니다

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. 다운로드 오류가 있는 경우 오류 정보 출력을 용이하게 하기 위해 리디렉션을 사용합니다. 실제로 여기서도 사용자 토큰 확인을 수행할 수 있습니다.

아아아아

위 내용은 nginx+lua를 사용하여 파일 업로드 및 다운로드 서비스 설정 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제