基于 nginx 的高性能 jsdelivr 反向代理
由于 2022 年 5 月以来 jsdelivr 访问进一步受限,对于仍需要使用 jsdelivr 的站长而言,自建反向代理服务是最优选择。为了在服务端和客户端都实现加速,我们采用 nginx 的缓存机制,初次请求之后不需回源;同时,使静态资源在浏览器中缓存时间更长。此外,由于涉及到跨域资源共享(CORS)问题,还需要在响应头中配置
Access-Control-Allow-Origin
关键字,以实现域名白名单机制,并保证资源在浏览器中正常加载。
1. 完整配置文件
配置文件: jsdelivr.conf
nginx
1 | proxy_cache_path /var/www/jsdelivr.cache levels=2:2 use_temp_path=off keys_zone=jsdelivr:50m inactive=180d max_size=500m; |
将该文件保存为jsdelivr.conf
,再在nginx.conf
的http
块中包含(include)该文件即可。
2. 配置文件解读
2.1 缓存文件配置
使用proxy_cache_path
指令进行缓存文件配置:
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size];
该指令中:
- path 为缓存文件存放路径;
- levels 为缓存文件目录的层次结构,
levels=2:2
表示两级目录都使用 2 位 16 进制数命名; - use_temp_path 表示临时文件是否直接存放于缓存目录中,如果该值为
off
,则临时文件将直接放在缓存目录中;反之,则需要用proxy_temp_path
设置一个目录。为了减少不必要的拷贝,建议设为off
; - keys_zone 表示在共享内存中设置的存储区域名称和大小。该存储区用来存放缓存的 key 字符串,
keys_zone=jsdelivr:50m
表示该区域的名称为 jsdelivr,大小为 50m,这样 nginx 可以快速判断一个 request 是否命中缓存,1m 可以存储 8000 个 key,10m 可以存储 80000 个 key; - inactive 表示未被访问文件在缓存中保留时间;
- max_size 为最大缓存空间,如果不指定,会使用掉所有磁盘空间。当达到配额后,会删除最少使用的 cache 文件。
2.2 反向代理配置
在反向代理配置中,我们需要实现以下功能或特性:
- 将请求转发到
https://cdn.jsdelivr.net
- 缓存状态码为200的请求,时限180天
- 设置跨域资源共享(CORS)策略,允许来自
https://blog.example.com
的请求 - 设置资源在浏览器中缓存时间为180天
在location块中,如下指令分别实现了以上功能:
- 请求转发 nginx
1
2
3
4
5
6
7
8
9
10
11
12
13# 将流量转发到https://cdn.jsdelivr.net
proxy_pass https://cdn.jsdelivr.net;
# 因采用https,所以需要使用SNI指明主机名
proxy_ssl_server_name on;
# 设置请求头主机名
proxy_set_header Host cdn.jsdelivr.net;
# 记录代理信息
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
# 设置HTTP协议,并建立长连接
proxy_http_version 1.1;
proxy_set_header Connection ""; - 服务端缓存设置 nginx
1
2
3
4
5
6
7
8
9
10# X-Cache表明请求是否命中缓存
add_header X-Cache $upstream_cache_status;
# 禁用源站的cookie和浏览器缓存设置
proxy_ignore_headers Set-Cookie Cache-Control expires;
# 设置缓存的key_zone名称,必须与proxy_cache_path中的设置一致
proxy_cache jsdelivr;
# 设置缓存的key名称
proxy_cache_key $host$uri$is_args$args;
# 设置缓存的条件,只缓存状态码200的请求,缓存时限为180天
proxy_cache_valid 200 180d; - CORS设置 nginx
1
2
3
4# 禁用源站的Access-Control-Allow-Origin请求头
proxy_hide_header Access-Control-Allow-Origin;
# 自定义Access-Control-Allow-Origin请求头,注意包含协议和域名
add_header Access-Control-Allow-Origin "https://blog.example.com"; - 客户端缓存设置 nginx
1
2# 设置缓存的失效日期为180天
expires 180d;
3 参见
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JaSpirit的万事屋!
评论