利用 nginx-upload-module 实现文件上传和重命名
近来因为毕设需求,需要有一个简单的文件上传服务,结合 Nginx,最终通过 nginx-upload-module 实现。但是该模块开发者考虑到同时间同名文件上传碰撞,将文件名统一设置为一串经过计算得到的数值,交由后端服务对文件做改动。
本来不是啥大问题,只是网上教程都使用其他语言实现文件重命名,我实在不想因为这么一个简单的需求在毕设中引入其他后端语言,于是决定自写一个模块实现文件重命名功能,源码保存在 nginx-upload-rename-module 中。
毕设内容是基于 Nginx 实现流媒体点播服务器,打算自写一个支持 HLS 协议的模块,实现从 .mp4 到 .m3u8 的转码切分。正好写这个重命名模块,学习 Nginx 模块开发。
此次实验在本地机上进行,在服务器上部署基本一致。
❗ 请注意文末的提示!
思路
nginx-upload-module 的工作流程是将上传文件从 HTTP 报文中剥除,组合成文件,计算特定数值后保存到指定目录;其他文件信息则经过整合写入 HTTP 报文的请求体,交由后端处理。
我本打算直接调用它定义的变量,获取诸如文件名、文件类型等信息,直接完成文件重命名,但是可能是它变量定义时对标志位的设置,无法获取索引也没有记录入散列表,无法获得其值,就此作罢。
输出其 HTTP 报文的过程中,偶然明白了 nginx-upload-module 的 HTTP 报文传递到后端时的具体内容,于是决定对 HTTP 报文做处理,获取其特定字段,保存后用以处理文件。
编译
首先下载 Nginx 源码和两个模块:
1 | wget https://nginx.org/download/nginx-1.20.2.tar.gz |
解压缩 Nginx 源码后,有以下三个目录:
1 | . |
进入nginx-1.20.2,准备编译。这里我直接将安装路径放在了当前目录:
自行安装 Nginx 源码编译时需要的依赖
1 | ./configure --prefix=$(pwd)/nginx --add-module=../nginx-upload-rename-module --add-module=../nginx-upload-module |
经过检查后得到以下信息:
剩余内容已隐藏