Nginx+Lua生成最新文件下载链接
背景介绍:
要求Nginx提供一个固定的下载接口,比如:xxx.xxx.com/download,然后这个地址会跳转的最新版本的软件包下载地址,这样的话请求xxx.xxx.com/download就能下载到最新版本的软件包。

  1. Nginx编译安装添加lua模块
    [root@172-16-1-209 tools]# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
    [root@172-16-1-209 tools]# tar xf LuaJIT-2.0.5.tar.gz
    [root@172-16-1-209 tools]# cd LuaJIT-2.0.5
    [root@172-16-1-209 LuaJIT-2.0.5]# make PREFIX=/usr/local/luajit && make install PREFIX=/usr/local/luajit
    [root@172-16-1-209 LuaJIT-2.0.5]# cd ..
    [root@172-16-1-209 tools]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
    [root@172-16-1-209 tools]# tar xf v0.3.0.tar.gz
    [root@172-16-1-209 tools]# mv ngx_devel_kit-0.3.0 /usr/src/
    [root@172-16-1-209 tools]# mv lua-nginx-module-0.10.9rc7 /usr/src/

    上面是lua模块,下面是Prometheus监控的相关模块

    [root@172-16-1-209 tools]# tar xf nginx-http-concat.tar.gz
    [root@172-16-1-209 tools]# tar xf nginx-module-vts.tar.gz
    [root@172-16-1-209 tools]# tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
    [root@172-16-1-209 tools]# tar xf ngx_cache_purge.tar.gz
    [root@172-16-1-209 tools]# tar xf pcre-8.44.tar.gz
    [root@172-16-1-209 tools]# mv {nginx-http-concat,nginx-module-vts,ngx_cache_purge,nginx-vts-exporter-0.10.3.linux-amd64,pcre-8.44} /usr/src/
    [root@172-16-1-209 tools]# tar xf echo-nginx-module.tar.gz
    [root@172-16-1-209 tools]# mv echo-nginx-module /usr/src/

    编译Nginx

    [root@172-16-1-209 tools]# tar xf nginx-1.14.2.tar.gz
    [root@172-16-1-209 tools]# cd nginx-1.14.2
    [root@172-16-1-209 nginx-1.14.2]# export LUAJIT_LIB=/usr/local/luajit/lib
    [root@172-16-1-209 nginx-1.14.2]# export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
    [root@172-16-1-209 nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/src/pcre-8.44 --with-pcre-jit --with-ld-opt=-ljemalloc --with-ipv6 --add-module=/usr/src/echo-nginx-module --add-module=/usr/src/nginx-http-concat --add-module=/usr/src/nginx-module-vts --add-module=/usr/src/ngx_cache_purge --add-module=/usr/local/ngx_devel_kit-0.3.0 --add-module=/usr/local/lua-nginx-module-0.10.9rc7
    [root@172-16-1-209 nginx-1.14.2]# make

    因为我Nginx安装过了,所以我这里不再make install了我需要把Nginx停了然后替换下重启nginx

    [root@172-16-1-209 nginx-1.14.2]# mv /usr/local/nginx/sbin/nginx{,.old}
    [root@172-16-1-209 nginx-1.14.2]# cp -f objs/nginx /usr/local/nginx/sbin/
    [root@172-16-1-209 nginx-1.14.2]# echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
    [root@172-16-1-209 nginx-1.14.2]# ldconfig
    [root@172-16-1-209 nginx-1.14.2]# nginx -V
    nginx version: nginx/1.14.2
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
    built with OpenSSL 1.0.2k-fips 26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/src/pcre-8.44 --with-pcre-jit --with-ld-opt=-ljemalloc --with-ipv6 --add-module=/usr/src/echo-nginx-module --add-module=/usr/src/nginx-http-concat --add-module=/usr/src/nginx-module-vts --add-module=/usr/src/ngx_cache_purge --add-module=/usr/local/ngx_devel_kit-0.3.0 --add-module=/usr/local/lua-nginx-module-0.10.9rc7

    平滑切换
    kill -USR2 旧的Nginx进程号

    [root@172-16-1-209 nginx-1.14.2]# kill -USR2 18789

    kill –WINCH 旧的Nginx进程号

    [root@172-16-1-209 nginx-1.14.2]# kill -WINCH 18789

  2. 安装sockproc
    sockproc 是一个服务器程序, 侦测unix socket 或者 tcp socket , 并把收到的命令,传递给子进程执行,执行完毕后,把结果返回给客户端, 我们就让sockproc 侦测/tmp/shell.sock 的套接口有没有数据到来
    [root@172-16-1-209 tools]# git clone https://github.com/juce/sockproc
    [root@172-16-1-209 tools]# cd sockproc
    [root@172-16-1-209 sockproc]# make
    cc -Wall -Werror -o sockproc sockproc.c
    [root@172-16-1-209 sockproc]# ./sockproc /tmp/shell.sock
    [root@172-16-1-209 sockproc]# chmod 0666 /tmp/shell.sock
  3. 安装lua-resty-shell模块
    它是一个很小的库, 配合openresty 使用, 目的是提供类似于os.execute 或io.popen的功能, 唯一区别它是非阻塞的, 也就是说即使需要耗时很久的命令,你也可以使用它
    [root@172-16-1-209 tools]# git clone https://github.com/juce/lua-resty-shell
    [root@172-16-1-209 tools]# cd lua-resty-shell
    [root@172-16-1-209 lua-resty-shell]# mkdir /usr/local/nginx/conf/lua
    [root@172-16-1-209 lua-resty-shell]# cp lib/resty/shell.lua /usr/local/nginx/conf/lua/
  4. 创建一个lua脚本调用系统命令生成下载页
    [root@172-16-1-209 lua-resty-shell]# cd /usr/local/nginx/conf/lua/
    [root@172-16-1-209 lua]# ls
    shell.lua
    [root@172-16-1-209 lua]# vim url.lua

local shell = require("shell")
local args = {
socket = "unix:/tmp/shell.sock",
}
local status, out, err = shell.execute("ls -lt /usr/local/nginx/html/downloadfile/ |grep -v 'total'|head -n 1|awk '{print $9}'", args)
local url="http://10.100.31.18/download/"..out
ngx.say(url)

创建存放软件包目录拷贝测试包

[root@172-16-1-209 lua]# cd ../
[root@172-16-1-209 conf]# cd ../
[root@172-16-1-209 nginx]# mkdir html/downloadfile
[root@172-16-1-209 nginx]# cp temp-20200421.ta.gz html/downloadfile/

  1. 编辑Nginx配置文件增加下载接口
    在HTTP便签下添加如下配置

    lua_package_path "/usr/local/nginx/conf/lua/?.lua;;";

    增加下载接口

    location /test {
    content_by_lua_file conf/lua/url.lua;
    }

  2. Nginx重新加载配置文件测试
    [root@172-16-1-209 nginx]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    [root@172-16-1-209 nginx]# nginx -s reload

访问的话会把test下载下来打开看下
Nginx+Lua生成最新文件下载链接_第1张图片

Nginx+Lua生成最新文件下载链接
Nginx+Lua生成最新文件下载链接_第2张图片
是我们需要的地址,剩下来就简单了,只要跳转到这个地址就可以了

  1. 将url.lua文件中ngx.say改成跳转
    Nginx+Lua生成最新文件下载链接
    ngx.redirect(url,'302')

    这里注意一定要是302做临时跳转,因为软件包更新链接会变化,跳转地址也要变化,如果301客户端需要清浏览器缓存才能获取到最新的地址。

  2. 配置下载链接url测试下载
    Nginx+Lua生成最新文件下载链接
    Nginx+Lua生成最新文件下载链接_第3张图片