Nginx 实现带认证的文件服务器缓存

实现思路
  1. Nginx配置为COS代理:设置Nginx作为反向代理,转发请求至COS服务器。
  2. 认证集成:在Nginx访问流程中嵌入认证环节,通过调用认证服务API,根据返回的HTTP状态码(如401代表未授权,200表示授权通过)来决定是否继续处理请求。
  3. 缓存策略定制:针对性地为图片和视频资源启用缓存,确保高频访问的内容得到高效复用。

实现细节
  • 代理配置:配置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";
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值