阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

97次阅读
没有评论

共计 1968 个字符,预计需要花费 5 分钟才能阅读完成。

用 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 http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

————————————– 分割线 ————————————–

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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计1968字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中