Nginx Lua 边下载边发送文件内容

用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 函数, 所以数据会堆积到内存。

--------------------------------------分割线 --------------------------------------

CentOS 6.2实战部署Nginx+MySQL+PHP

使用Nginx搭建WEB服务器

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程

CentOS 6.3下Nginx性能调优

CentOS 6.3下配置Nginx加载ngx_pagespeed模块

CentOS 6.4安装配置Nginx+Pcre+php-fpm

Nginx安装配置使用详细笔记

Nginx日志过滤 使用ngx_log_if不记录特定日志

--------------------------------------分割线 --------------------------------------

Nginx 的详细介绍请点这里
Nginx 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5e87a06512dd7e647a66278e02b5fb07.html