烈火灼冰 - CDN
type: channel
link: https://blog.4c43.work/index.php/tag/CDN/
items: 通过Nginx自建jsdelivr反向代理

通过Nginx自建jsdelivr反向代理
type: item
date: 2023-04-10T03:58:00+00:00
description: 转载自：分享一个nginx反代jsdelivr的优化配置 (出处: 全球主机交流论坛) 故事背景 小伙伴开了blog要友链然后才发现自己没有开友链的页面（猫猫沉默了一下）然后他发现本站很多用fastly.jsdelivr.net加速的资源并不能方便地访问，于是探究了一下用另一台小鸡做反代自用的操作。 2022年jsdelivr主域名cdn.jsdelivr.net被技术后，当时临时切换成了fastly.jsdelivr.net，后面因为自己一般日常挂着加速而且有缓存，所以没有察觉到这个地址也不稳定。想了想感觉直接反代jsdelivr算是比较简单实用的解决方案了。于是搜索了一下找到了可用的解决方案，在此记录一下。 具体操作 先上个配置文件吧（下载的话记得去掉.txt的后缀，以及替换所有的xxx.com）：cdn.xxx.com.conf.txt 以下为原文转载 这个配置实现的是解析cdn.jsdelivr.net的域名与最近的CDN节点建立连接，然后nginx会缓存已经请求过的静态资源，不用再次请求jsdelivr，并让浏览器长久缓存静态资源，提高加载速度。 不要用良心云，套路云反代，有封鸡风险。 首先打开需要反代的域名的站点配置文件，在server前面先定义nginx缓存， proxy_cache_path /JsdelivrCache levels=1:2 keys_zone=jsdelivr:50m max_size=10g inactive=1200d use_temp_path=off; /JsdelivrCache表示缓存的路径为/JsdelivrCache,levels=1:2表示缓存是两级目录，第一级目录用1位16进制命名，第二级目录用2位16进制命名，keys_zone表示在共享内存中设置一块存储区域来存放缓存的key(url的hash值)和metadata（类似使用次数），这样nginx可以快速判断一个request是否命中或者未命中缓存，1m可以存储8000个key，10m可以存储80000个key；这里缓存的是自己站里静态资源不用设置一个很大的值。keys_zone"="后面加的jsdelivr是定义的缓存空间名字。 max_size：最大缓存空间，这里缓存的是占用空间小的的静态资源不用设置一个很大的值。 inactive：未被访问文件在缓存中保留时间，这里设置成1200天，nginx会删除指定时间内没有被缓存命中的缓存文件。缓存静态资源建议设置成一个很大的值。 搞定之后，打开反向代理配置 将宝塔自定义的配置改成如下代码 location / { proxy_pass https://cdn.jsdelivr.net; 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; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_ssl_server_name on; add_header X-Cache $upstream_cache_status; proxy_ignore_headers Set-Cookie Cache-Control expires; proxy_cache jsdelivr; proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 365d; expires 365d; } 注意proxy_cache后面的缓存名字必须和前面定义的缓存名字一致。 proxy_http_version 1.1; proxy_set_header Connection ""; 这两段表示使用http1.1协议与后端建立长连接可以避免反复开销连接降低速度，不设置会默认使用http1.0。 proxy_ssl_server_name on;代理ssl sni，这行必须配置，否则CDN会报错。 proxy_cache_valid 200 365d; 表示缓存状态码和过期时间，这里只缓存200的请求，并且缓存一年时间，1年之后缓存过期nginx会再次访问Jsdelivr，如果后端静态文件更新不频繁建议设置成一个较大的值，更新频繁缓存时间可以设置小一点。 expires 365d;这里是指让客户端浏览器缓存静态文件的时间，避免反复请求服务器，加快本地访问，这里设置成1…