NGINX LUA 는 다운로드 하면 서 파일 내용 을 보 냅 니 다.

1672 단어
NGINX 로 WEB 서버 를 만 들 고 LUA 는 파일 을 다운로드 해 클 라 이언 트 에 보낸다.
curl. so 동적 라 이브 러 리 에 사용 합 니 다.
package.path = '/usr/local/share/lua/5.1/?.lua;/usr/local/openresty/lualib/resty/?.lua;'
package.cpath = '/usr/local/lib/lua/5.1/?.so;'

require("curl")


function build_w_cb(f)
   return function(s,len)
         ngx.print(s)
         ngx.flush(true)
	  --local wlen = f:write(s)
	  --if (wlen ~= len) then
	--	return len,"writeError"
	 -- else
		return len,nil
	--  end
   end
end

file = io.open("/usr/local/openresty/nginx/html/me.ts", "w")
if (file == nil) then
    ngx.say ("Create File error")
	return
end
ngx.header["Transfer-Encoding"] = 'chunked';
--Transfer-Encoding: chunked
--download XML File
xmlURL = "http://192.168.1.102/pxx/f1.ts"
c = curl.easy_init() 
c:setopt(curl.OPT_URL, xmlURL)
c:setopt(curl.OPT_WRITEFUNCTION, build_w_cb(file))
c:setopt(curl.OPT_FOLLOWLOCATION, 1)

c:setopt(curl.OPT_USERAGENT, "ContentPreload-agent/1.0")
c:setopt(curl.OPT_COOKIEFILE, "./curlpost.cookie")
c:setopt(curl.OPT_CONNECTTIMEOUT, 5)
c:setopt(curl.OPT_TIMEOUT, 3000)
c:setopt(curl.OPT_NOSIGNAL, 1)

ret,strerr = c:perform()

file:close()


이 예 는 실 행 될 수 있 지만 좀 정상 적 이지 않 은 것 은 파일 다운로드 과정 에서 ngx. print 를 호출 하지만  화해시키다  ngx. flush, 그러나 nginx 는 내용 을 모두 메모리 에 쌓 고 파일 이 끝 난 후에 야 클 라 이언 트 에 게 보 낼 수 있 습 니 다.
이 점 이 답답 합 니 다. 이 유 는 다운로드 와 전송 이 같은 스 레 드 이기 때 문 입 니 다. curl 의 perform 함수 가 실 행 된 후에 야 진정 으로 보 낼 수 있 습 니 다. perform 함수 가 실 행 된 과정 에서 print 함 수 를 호출 했 지만 이 함 수 는 내용 을 메모리 에 넣 었 을 뿐 send 함 수 를 진정 으로 실행 할 수 없 기 때문에 데이터 가 메모리 에 쌓 입 니 다.

좋은 웹페이지 즐겨찾기