在宝塔面板中安装ngx_http_secure_link_module模块并配置Nginx鉴权,最核心的一点是:secure_link模块是Nginx官方模块,宝塔默认安装的Nginx并未包含它,需要你通过“编译安装”的方式重新添加该模块。
下面是在宝塔环境中逐步实现这一功能的具体操作方法。
第一步:编译安装Nginx并添加模块
由于宝塔面板中通过“极速安装”的Nginx不包含secure_link模块,你需要将其卸载后,使用“编译安装”的方式重新安装,并在编译参数中添加上该模块。
卸载现有Nginx:登录宝塔面板,进入“软件商店”。找到已安装的Nginx,点击右侧的“卸载”按钮,将其从服务器中移除。
重新编译安装Nginx:在“软件商店”的“运行环境”分类中,找到Nginx,点击“安装”。在弹出的安装窗口中,关键一步是选择“编译安装”。在选择版本时,搜索结果中有用户反馈,最新的Nginx 1.24版本在编译时可能与某些Lua模块存在兼容性问题导致报错。为了更稳定地完成安装,建议选择稳定版,如Nginx 1.22或1.20版本。选择好版本后,点击“添加自定义模块”,在弹出的窗口中填写以下信息:模块名称:http_secure_link_module (或任意你容易识别的名称)模块参数:--with-http_secure_link_module确认后,点击“提交”并开始安装。宝塔面板会自动完成后续的编译和安装工作。
验证安装:安装完成后,建议你通过宝塔面板的“终端”或在你的SSH客户端中执行以下命令来确认模块是否已成功添加:bashnginx -V 2>&1 | grep secure_link如果输出信息中包含 --with-http_secure_link_module,则表示模块已安装成功。
第二步:配置Nginx鉴权规则
模块安装成功后,接下来就需要在你网站的Nginx配置文件中添加secure_link的鉴权规则。这些规则定义了服务器如何验证请求中的hash和expires参数。
在宝塔面板左侧菜单栏点击“网站”,进入你想要配置的网站的管理页面。
点击该网站对应的“配置文件”按钮,进入Nginx配置编辑界面。
在 server 块内,添加或修改一个 location 块来匹配你需要保护的文件类型(例如你之前提到的 .ts 视频切片或 .mp4 文件)。以下是一个配置示例:
nginx
# 示例:保护 /hls/ 目录下的所有 .ts 和 .mp4 文件
location ~* \.(ts|mp4)$ {
# 引用的 $arg_md5 和 $arg_expires 分别对应URL中的 hash 和 expires 参数
secure_link $arg_hash,$arg_expires;
# 生成签名的规则:密钥 + 文件路径 + 过期时间戳
# 注意:这个密钥 "your_secret_key_here" 必须与后端程序生成hash时使用的密钥完全一致
secure_link_md5 "your_secret_key_here$uri$arg_expires";
# 鉴权逻辑
# $secure_link 变量为空字符串,表示签名校验失败(如参数错误或签名不匹配)
if ($secure_link = "") {
return 403;
}
# $secure_link 变量为 "0",表示签名校验通过但链接已过期
if ($secure_link = "0") {
return 410;
}
# 鉴权通过,Nginx正常提供文件服务
}配置说明:
secure_link $arg_hash,$arg_expires;:这行指令告诉Nginx,从请求的查询参数中提取名为hash和expires的值来进行校验。
secure_link_md5 "your_secret_key_here$uri$arg_expires";:这是最核心的校验规则。Nginx会根据这个字符串重新计算MD5值,并与URL中的hash参数进行比对。其中$uri是当前请求的文件路径(如/hls/srv3/.../seg-193-v1-a1.ts),$arg_expires是URL中的过期时间戳。
鉴权变量:$secure_link = "":校验失败,通常是签名不正确。$secure_link = "0":签名正确,但链接已过期。$secure_link = "1":鉴权通过,可以正常访问资源。
验证与测试
配置完成后,点击“保存”按钮。为了确保配置生效,需要重启Nginx服务:在软件商店的Nginx管理页面或通过SSH执行 nginx -s reload 命令。
为了验证配置是否生效,你可以使用一个简单的测试方法。在你的服务器(假设域名为 example.com)上有一个文件 /hls/test.ts,密钥为 mysecret,有效期为10秒。
你可以在终端中使用以下命令生成一个合法的链接并测试:
bash
# 假设有效期是10秒后
EXPIRES=$(($(date +%s) + 10))
# 生成签名
HASH=$(echo -n "mysecret/hls/test.ts${EXPIRES}" | openssl md5 -hex | awk '{print $2}')
# 组合成完整URL
echo "http://example.com/hls/test.ts?hash=${HASH}&expires=${EXPIRES}"将这个生成的URL在10秒内访问应该可以成功下载文件;10秒后再次访问,服务器应返回HTTP 410 Gone状态码。如果直接访问 http://example.com/hls/test.ts,则会返回403 Forbidden。
几个重要提醒
密钥必须一致:Nginx配置中的密钥(secure_link_md5)必须与你的后端程序(负责生成带hash值下载链接的程序)使用的密钥完全相同,否则所有请求都会被拒绝。
过期时间戳单位:expires参数使用的是Unix时间戳(秒为单位),请确保你的后端程序生成的是正确格式。
程序化生成链接:对于.ts切片文件,你需要在后端(如PHP、Node.js等)动态生成.m3u8播放列表时,为每一个切片URL附带上正确的hash和expires参数。
最后
以上就是岁月静好最近收集整理的关于宝塔安装nginx的ngx_http_secure_link_module模块对视频切片鉴权的全部内容,更多相关宝塔安装nginx内容请搜索靠谱客的其他文章。
发表评论 取消回复