实现思路
- Nginx配置为COS代理:设置Nginx作为反向代理,转发请求至COS服务器。
- 认证集成:在Nginx访问流程中嵌入认证环节,通过调用认证服务API,根据返回的HTTP状态码(如401代表未授权,200表示授权通过)来决定是否继续处理请求。
- 缓存策略定制:针对性地为图片和视频资源启用缓存,确保高频访问的内容得到高效复用。
实现细节
- 代理配置:配置Nginx代理指向COS服务URL,实现请求转发。
location ^~ /cosFile/{
#代理配置参数
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $remote_addr;
proxy_pass http://cos.xxxxx/12321xxx:csfile/;
}
- 认证配置:通过Nginx的auth_request模块,实现对每个请求的前置认证检查。
#文件服务器代理缓存处理
location ^~ /cosFile/{
auth_request /valiauth;
error_page 401 = @error401;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_pass http://cos.xxxxx/12321xxx:csfile/;
}
#文件服务器代理缓存后端认证地址
location /valiauth {
internal;
proxy_pass http://gateway/auth/checkAuth;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
location @error401 {
return 401 "Unauthorized";
}
- 缓存配置:利用Nginx的proxy_cache指令,为符合条件的静态资源设定缓存规则。
http{
#省略部分内容
#在 http 节点下 定义缓存路径及参数
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=my_cache:50m max_size=4g inactive=10m use_temp_path=off;
server{
#省略部分内容
#文件服务器代理缓存处理
location ^~ /cosFile/{
auth_request /valiauth;
error_page 401 = @error401;
add_header Cache-Control public;
# 禁止目录浏览
autoindex off;
# 2、开启缓存功能
proxy_cache my_cache;
# 缓存配置
proxy_cache_key "$uri";
proxy_cache_min_uses 1;
proxy_cache_methods HEAD GET;
proxy_cache_valid 200 5m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_pass http://cos.xxxxx/12321xxx:csfile/;
}
}
}
- 图片和视频缓存配置:通过判断请求路径$request_uri的文件后缀决定返回变量$cache_control_policy为 0 或者 1,通过对proxy_cache_bypass 和 proxy_no_cache设置变量$cache_control_policy来决定是否需要绕过缓存,1 代表绕过,0 代表不绕过
http{
#省略部分内容
#在 http 节点下 定义缓存路径及参数
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=my_cache:50m max_size=4g inactive=10m use_temp_path=off;
# 增加媒体判断
map $request_uri $cache_control_policy {
~*\.(jpg|jpeg|png|gif|bmp|tiff?|webp|svg|ico)$ 0; # 图片文件
~*\.(mp4|webm|avi|mov|flv|wmv|mpeg|mkv|ogv)$ 0; # 视频文件
default 1; # 其他请求则缓存
}
server{
#省略部分内容
#文件服务器代理缓存处理
location ^~ /cosFile/{
#设置认证路径
auth_request /valiauth;
#设置401错误返回路径
error_page 401 = @error401;
#增加客户端缓存头信息
add_header Cache-Control public;
# 禁止目录浏览
autoindex off;
#开启缓存功能
proxy_cache my_cache;
proxy_cache_bypass $cache_control_policy;
proxy_no_cache $cache_control_policy;
#缓存的 key 使用请求地址
proxy_cache_key "$uri";
proxy_cache_min_uses 1;
proxy_cache_methods HEAD GET;
#状态为为 200 的文件 缓存48 个小时
proxy_cache_valid 200 2880m;
#将缓存状态添加到响应头
add_header Nginx-Cache "$upstream_cache_status";
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_pass http://cos.xxxxx/12321xxx:csfile/;
}
}
}
http{
#省略部分内容
#在 http 节点下 定义缓存路径及参数
# 定义缓存路径及参数
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=my_cache:500m max_size=300g inactive=30d use_temp_path=off;
# 增加媒体判断
map $request_uri $cache_control_policy {
~*\.(jpg|jpeg|png|gif|bmp|tiff?|webp|svg|ico)$ 0; # 图片文件
~*\.(mp4|webm|avi|mov|flv|wmv|mpeg|mkv|ogv)$ 0; # 视频文件
default 1; # 其他请求则缓存
}
server{
#省略部分内容
#文件服务器代理缓存处理
location ^~ /cosFile/{
#后端认证路径
auth_request /valiauth;
#认证不通过返回的路径
error_page 401 = @error401;
#增加缓存
add_header Cache-Control public;
# 禁止目录浏览
autoindex off;
# 缓存功能是否启用的配置
proxy_cache my_cache;
proxy_cache_bypass $cache_control_policy;
proxy_no_cache $cache_control_policy;
# 缓存配置
proxy_cache_key "$uri";
proxy_cache_min_uses 1;
proxy_cache_methods HEAD GET;
proxy_cache_valid 200 5m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_pass http://cos.xxxxx/12321xxx:csfile/;
}
#文件服务器代理缓存后端认证地址
location /valiauth {
internal;
proxy_pass http://gateway/auth/checkAuth;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
#401错误返回的内容
location @error401 {
return 401 "Unauthorized";
}
}
}