Nginx+Lua生成最新文件下载链接
背景介绍:
要求Nginx提供一个固定的下载接口,比如:xxx.xxx.com/download,然后这个地址会跳转的最新版本的软件包下载地址,这样的话请求xxx.xxx.com/download就能下载到最新版本的软件包。
- 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
- 安装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 - 安装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/ - 创建一个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/
- 编辑Nginx配置文件增加下载接口
在HTTP便签下添加如下配置
lua_package_path "/usr/local/nginx/conf/lua/?.lua;;";
增加下载接口
location /test {
content_by_lua_file conf/lua/url.lua;
} - 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下载下来打开看下
是我们需要的地址,剩下来就简单了,只要跳转到这个地址就可以了
- 将url.lua文件中ngx.say改成跳转
ngx.redirect(url,'302')这里注意一定要是302做临时跳转,因为软件包更新链接会变化,跳转地址也要变化,如果301客户端需要清浏览器缓存才能获取到最新的地址。
- 配置下载链接url测试下载
来源:oschina
链接:https://my.oschina.net/u/4280361/blog/4296421