Nginx能否基于文件名模式自动指向最新版本安装包作为下载链接?
Nginx能否基于文件名模式自动指向最新版本安装包作为下载链接?
当然可以!不用每次手动创建软链接这么麻烦,咱们有两种实用方法能让Nginx自动帮你搞定这个需求:
方法一:定时脚本+软链接(原生Nginx就能用)
这个方案简单接地气,不用给Nginx装额外模块,核心是用脚本自动更新软链接:
- 先写个shell脚本,让它自动找到目录里最新的
app-installer X.X.exe文件,然后把app-installer.exe软链接指向它:
#!/bin/bash # 替换成你的安装包存放目录 INSTALLER_DIR="/usr/share/nginx/html/installers" # 按修改时间排序,取最新的那个安装包 LATEST=$(ls -t "$INSTALLER_DIR"/app-installer*.exe | head -n1) # 更新软链接,-f参数会覆盖已存在的链接 ln -sf "$LATEST" "$INSTALLER_DIR"/app-installer.exe
- 之后用crontab给这个脚本加个定时任务,比如每小时跑一次(或者每次上传完手动执行脚本也行),这样新安装包一上传,软链接就自动更新了
- Nginx配置不用改,还是像之前一样指向
app-installer.exe就行,用户访问的时候自然就拿到最新版本了
方法二:用Lua模块实现纯Nginx自动处理
如果你的Nginx已经装了ngx_http_lua_module(很多Linux发行版的官方Nginx包都带这个模块,编译的时候也能加上),可以直接在配置里写逻辑,不用依赖外部脚本:
- 示例配置如下,把路径换成你的安装包目录就行:
location /app-installer.exe { content_by_lua_block { -- 替换成安装包实际存放的目录 local installer_dir = "/usr/share/nginx/html/installers" local latest_file = nil local highest_version = 0 -- 遍历目录下所有符合命名规则的安装包 for file_path in io.popen("ls -1 " .. installer_dir .. "/app-installer*.exe"):lines() do -- 从文件名里提取版本号,比如从"app-installer 1.12.exe"拿到"1.12" local version_str = string.match(file_path, "app%-installer (%d+%.%d+)%.exe") if version_str then -- 把版本号转成数字方便比较(比如1.12转成112,1.3转成103) local version_num = tonumber(string.gsub(version_str, "%.", "")) if version_num > highest_version then highest_version = version_num latest_file = file_path end end end if latest_file then -- 提取文件名,重定向到最新安装包 local file_name = string.match(latest_file, "/([^/]+)$") ngx.redirect("/installers/" .. file_name) else -- 没找到匹配的安装包就返回404 ngx.exit(404) end } }
- 这个配置会在用户访问
/app-installer.exe时,自动遍历目录找版本号最高的安装包,然后重定向到它,完全不用手动干预 - 注意要确保Nginx进程有读取安装包目录的权限,另外如果你的系统里ls命令路径特殊,可能要写成
/bin/ls这种绝对路径
两种方案各有优势:第一种简单易维护,适合不想折腾Nginx配置的朋友;第二种更“全自动”,不用依赖定时任务,适合喜欢纯配置解决问题的场景。
备注:内容来源于stack exchange,提问作者frogatto
相关产品推荐
相关产品推荐

