Nginx具有很多强大功能,专栏前面讲述的主要是常用功能。本文主要讲述常用之外的其它实用功能,如身份认证、流媒体支持、大文件传输等。为充分利用Nginx,对这些技术都又必要了解。
目录
身份认证
Nginx能够对客户端进行身份验证。使用 NGINX 对客户端请求进行身份验证可以减轻服务器的工作负载,并能够阻止未经身份验证的请求到达应用服务器。NGINX 开源版模块包括基本身份验证和身份验证子请求。
基本身份验证
该功能由ngx_http_auth_basic_module模块提供。
创建身份验证文件
首先创建身份验证文件,格式如下:
# 格式:身份名:密码[:注释] 注释可选。每一行代表一个身份
# name:password:comment
idcode1:JJGeHm5C4c85I:这是测试,密码abc#111
# 测试密码abc#112
idcode2:cppBHPWd4gtmQ
其中密码是用如下命令命令加密的:
openssl passwd abc#111
配置身份验证
密码文件在conf.d/user.pwd,配置如下:
location / {
# auth_basic 指令表示Nginx启动基本身份验证,带一个字符串参数(可任意)
auth_basic "Private web by auth";
# auth_basic_user_file 指令指定文件位置,可相对于Nginx工作目录,也可用绝对路径,保证Nginx可读即可
auth_basic_user_file conf.d/user.pwd;
}
auth_basic值显示在响应头(没有正确授权),如下图:
测试
用curl测试如下(密码不对会显示401错误):
用浏览器测试,会弹出如下要求登陆的界面:
身份验证子请求
身份验证子请求的意思是Nginx验证身份由第三方提供的子请求进行,Nginx再根据子请求的结果实现对客户端授权。如果子请求返回2xx响应代码,则允许访问。如果返回401或403,则使用相应的错误代码拒绝访问。子请求返回的任何其他响应代码都被视为错误。
该功能由ngx_http_auth_request_module模块提供。如果编译版,应该使用--with-http_auth_request_module编译。
配置如下:
# 需身份验证的访问
location /private/ {
# auth_request指令带一个URI参数,必须是本地内部位置
auth_request /auth;
# 在授权请求完成后,将请求变量设置为给定值。该值可能包含来自授权请求的变量
auth_request_set $auth_status $upstream_status;
}
# 授权子请求
location = /auth {
# 由第三方提供授权连接
proxy_pass http://auth-server;
# 默认是将原始请求(包括正文和请求头)传递到身份验证服务器。为提升效率,可通过proxy_pass_request_body off取消正文传递,同时把头字段Content-Length设置为空
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
授权子请求通过后,继续请求的正常处理。
流媒体支持
实时流媒体
NGINX为MP4和MOV媒体文件提供http实时流媒体(hls)服务器端支持。此类文件通常具有.mp4、.m4v、.m4a、.mov或.qt文件扩展名。该模块支持H.264视频编解码器、AAC和MP3音频编解码器。
该功能由ngx_http_hls_module模块提供。
配置示例:
location /hls/ {
# 开启实时流媒体
hls;
# 定义不使用“len”参数请求的播放URI的默认片段长度。
hls_fragment 5s;
# 设置用于读取和写入数据帧的缓冲区的数量和大小。
hls_buffers 10 10m;
# 设置用于处理MP4和MOV文件的缓冲区的初始大小
hls_mp4_buffer_size 1m;
# 设置用于处理MP4和MOV文件的缓冲区最大值
hls_mp4_max_buffer_size