Nginx自建CDN加速节点 实现DNS智能解析网站项目
如今,网站项目越来越多的会使用CDN加速,如果需要便捷一点的可以直接用第三方提供的CDN加速服务,比如百度CDN、七牛、又拍云、腾讯云、阿里云等等服务商都有提供这类服务。但是前提条件是需要一定的成本,以及网站域名是需要BA才可以使用国内CDN服务商。
那有没有一个办法,如果我们网站域名没有BA也可以使用到加速效果呢?有两个办法,第一就是将我们的网站搬迁至亚洲机房,比如香港、新加坡、日本等服务器,速度肯定是相比美国快一些的。第二就是我们可以利用反向解析的方式,自建反向解析CDN,然后自己来就架设CDN节点,这样会比直接用海外服务器快。
而且,我们可以利用DNSPOD等第三方解析工具提供的移动、联通、电信等分线路设定不同的解析节点。比如我们可以用电信速度快的服务器做电信节点、移动访问快的服务器做移动节点、联通访问速度快的做联通节点,然后三个节点都自动指向源站服务器网站。
应该是在去年的时候有看到XIAOZ同学分享的这篇文章(https://www.xiaoz.me/archives/8775)有介绍到可以实现多线路节点的智能解析,且笔者前天又看到QI同学也针对这个教程做的整理(https://wzfou.com/nginx-cdn/)。在这篇文章中,笔者也将学习他们的架设方法自己也亲手看看如何配置的,万一以后有需要也可以自己搭建,先模拟测试是否可行。
文章目录
第一、准备工作
1、源站点网站
我们在准备部署CDN节点之前,我们需要有一个正在运行的源站点。这个我们可以任意找一个在使用的站点,我们目的就是希望将这个网站加速。
2、自备CDN服务器
我们需要准备搭建CDN节点的服务器,这里我为了演示的方便,就只用一台服务器。因为多台的方法也是类似的,只是到时候DNSPOD解析的节点和备用节点智能切换解析而已,只要会搭建一台其他就都一样。
第二、架设Nginx环境
架设Nginx环境很简单,可以用我们熟悉的LNMP一键WEB安装包安装自带的,或者直接用XIAOZ提供的一键脚本,但是只能在Centos7或者Deebian8系统中才可以执行。
yum install wget -y
wget https://raw.githubusercontent.com/helloxz/nginx-cdn/master/nginx.sh
chmod +x nginx.sh && ./nginx.sh
我们需要在CDN节点服务器先安装有Nginx环境。
第三、配置反向解析
1、修改DNS配置
我们需要先修改CDN节点DNS,授权用来解析哪个域名和服务器。
vi /etc/hosts
添加一行:
xxx.xxx.xxx.xxx www.laobuluo.com
格式是"网站所在服务器IP 需要使用CDN域名"
2、添加网站解析
我们需要在CDN节点服务器里创建站点,用来缓存数据的目录。
#创建缓存目录
mkdir -p /data/wwwroot/caches/www.laobuluo.com
#设置缓存目录权限
chown -R www:www /data/wwwroot/caches/www.laobuluo.com
#创建xiaoz.me.conf
vi /usr/local/nginx/conf/vhost/laobuluo.com.conf
如果我们是用LNMP一键包环境的,那直接用自带的命令创建站点,这里我们没有用到一键包,所以得手工创建缓存目录和站点域名绑定。
proxy_cache_path /data/wwwroot/caches/www.laobuluo.com levels=1:2 keys_zone=laobuluo:50m inactive=30m max_size=50m;
server {
listen 80;
server_name www.laobuluo.com;
charset utf-8,gbk;
location / {
proxy_set_header Accept-Encoding "";
proxy_pass http://www.laobuluo.com;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache laobuluo;
proxy_cache_valid 200 304 30m;
proxy_cache_valid 301 24h;
proxy_cache_valid 500 502 503 504 0s;
proxy_cache_valid any 1s;
proxy_cache_min_uses 1;
expires 12h;
}
}
根据上面的配置,我们需要将对应的目录修改成自己的。
/data/wwwroot/caches/www.laobuluo.com:为缓存目录
levels:指定该缓存空间有两层hash目录,第一层目录为1个字母,第二层为2个字母。
keys_zone=laobuluo:50m:为缓存空间起个名字,这里取名为"laobuluo",后面的50m指内存缓存空间
inactive=30m:如果30分钟内该资源没有被访问则删除
max_size=50m:指硬盘缓存大小为50MB
proxy_cache_valid:指定状态码缓存时间,前面写状态码,后面写缓存时间
重启Nginx生效:
/usr/local/nginx/sbin/nginx -s reload
3、DNS分节点 解析
然后根据实际的需要在第三方DNS解析,你要设置全部用CDN节点或者是电信、移动、联通,还是其他线路,就指向对应IP。解析完毕之后,我们用第三方PING工具看看是不是生效,但是最好的办法是先全区域默认用节点IP,自己也看看是不是真实生效。
4、检查缓存
可以看到CDN节点服务器有缓存生成。
第四、实现HTTPS解析配置
以上我们是实现的HTTP解析指向,如果是HTTPS的话,我们是需要在配置文件.conf中配置HTTPS的。
proxy_cache_path /data/wwwroot/caches/www.laobuluo.com levels=1:2 keys_zone=laobuluo:50m inactive=30m max_size=50m;
server {
listen 443 ssl http2;
ssl_certificate /data/ssl/www.laobuluo.com/www_laobuluo_com.crt;
ssl_certificate_key /data/ssl/www.laobuluo.com/www_laobuluo_com.key;
ssl_session_timeout 1d;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;server_name www.laobuluo.com;
access_log /data/wwwlogs/laobuluo.com_nginx.log combined;charset utf-8,gbk;
location / {
proxy_set_header Accept-Encoding "";
proxy_pass https://www.laobuluo.com;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache laobuluo;
proxy_cache_valid 200 304 30m;
proxy_cache_valid 301 24h;
proxy_cache_valid 500 502 503 504 0s;
proxy_cache_valid any 1s;
proxy_cache_min_uses 1;
expires 12h;
}
}
server {
listen 80 default_server;
return 301 https://$host$request_uri;
}
CDN节点解析到SSL证书网站的时候,需要将证书放到CDN节点服务器对应目录,然后在对应conf配置文件中效仿上面的解析。
第五、CDN加速缓存问题
上面我们可以实现利用Nginx进行反向解析实现加速节点,但是没有解决缓存问题。我们是需要给网站定期来处理缓存更新。
1、配置ngx_cache_purge
location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}
红色的cache_one需要与上面定义的keys_zone保持一致。
2、WordPress自动刷新缓存
<script>
$(document).ready(function(){
$("#submit").click(function(){
var uri = "https://我们的网站域名/purge" + window.location.pathname;
$.get(uri,function(data,status){
return true;
});
});
});
</script>
将代码添加到WP网站模板底部。
3、完整的配置文件
proxy_cache_path /data/caches levels=1:2 keys_zone=xiaozcdn:100m inactive=30m max_size=100m;
server
{
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /xxx/www_xiaoz_me.crt;
ssl_certificate_key /xxx/www_xiaoz_me.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;server_name www.xiaoz.me;
charset utf-8,gbk;#删除缓存
location ~ /dcache(/.*) {
allow all;
proxy_cache_purge xiaozcdn $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}location / {
#proxy_set_header Accept-Encoding "";
proxy_pass https://www.xiaoz.me;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache xiaozcdn;
proxy_cache_valid 200 304 30m;
proxy_cache_valid 301 24h;
proxy_cache_valid 500 502 503 504 0s;
proxy_cache_valid any 1s;
#达到第几次被缓存?
proxy_cache_min_uses 1;
expires 12h;
proxy_cache_key $uri$is_args$args;
}
}
server
{
listen 80;
server_name www.xiaoz.me;
rewrite ^(.*) https://www.xiaoz.me$1 permanent;
}
这里直接复制XIAOZ完整的包含缓存配置的配置文件(https://www.xiaoz.me/archives/9431)。
最后,这样我们就可以自己创建CDN节点给网站加速。也可以实现不同节点服务器,与DNSPOD等第三方解析进行分线路解析。