随着网站的访问量增加,页面加载速度和服务器安全成为了我的首要关注点。为了确保用户有更好的访问体验,同时提升网站的安全性,我决定为我的博客搭建 CDN(内容分发网络)。在这篇推文中,我将分享 CDN 建设的基本步骤以及它带来的显著效果。

什么是 CDN?

CDN,全称为内容分发网络(Content Delivery Network),它的主要目的是通过分布在全球各地的服务器节点来缓存和分发内容,提升网站访问速度,并降低源服务器的负载。

当用户访问网站时,CDN 会将用户的请求转发到离用户最近的 CDN 服务器节点。若 CDN 节点上已有缓存的内容,则会直接将内容返回给用户。如果没有缓存,CDN 会将请求转发给源服务器获取内容,并将其缓存以供下次使用。

CDN 的引入流程

引入 CDN 的过程涉及以下几个步骤:

1. 域名解析和 DNS 配置

首先,确保域名通过 DNS 正确解析到 CDN 的加速域名。在我的案例中,我的博客域名 www.exampleblog.com 被解析到了 CDN 提供的加速域名 exampleblog.cdnprovider.com

配置步骤:

  • www.exampleblog.com 的 CNAME 记录指向 CDN 提供的加速域名 exampleblog.cdnprovider.com
  • 确保所有访问 www.exampleblog.com 的请求都通过 CDN,而不是直接到达源服务器。

2. Nginx 服务器配置

CDN 会向源服务器请求内容,因此源服务器的配置也非常重要。我使用了 Nginx 作为我的服务器,并确保 Nginx 能够根据 CDN 的请求正确返回内容。

Nginx 的配置中只需要处理来自 CDN 的请求,无需特别为 CDN 配置额外的域名。配置时,确保正确处理主域名和子域名,并为 HTTPS 提供支持。以下为我的配置文件

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
# multi_accept on;
}

http {

server {
server_name www.exampledomin.cn exampledomin.cn www.exampledomin.org;

location / {
root /home/www/hexo;
}

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/exampledomin.cn/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/exampledomin.cn/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}


##
# Basic Settings
##

sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;


server {
if ($host = www.exampledomin.cn) {
return 301 https://$host$request_uri;
} # managed by Certbot


if ($host = exampledomin.cn) {
return 301 https://$host$request_uri;
} # managed by Certbot


listen 80;
server_name www.exampledomin.cn exampledomin.cn www.exampledomin.org;
return 404; # managed by Certbot




}}


#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}

3. CDN 处理流程

当用户访问 www.exampleblog.com 时,CDN 会首先检查是否有缓存的内容。如果有,CDN 将直接返回给用户;如果没有,CDN 会向我的 Nginx 源服务器发起请求,然后将响应缓存并返回用户。

这大大减少了源服务器的直接负担,同时提升了访问速度。

4. DDoS 防护与安全性提升

通过使用 CDN,还为网站提供了额外的安全性。因为 CDN 服务器接管了用户的请求,用户无法直接获取到源服务器的 IP 地址,这让源服务器免受直接攻击,尤其是 DDoS 攻击。

此外,CDN 通常提供基础的 DDoS 防护功能,帮助我应对大流量攻击。虽然流量峰值可能会导致 CDN 费用上升,但相比于直接攻击源服务器,风险和损失都得到了很大程度的缓解。

5. 总结

一个用户访问博客经过的完整流程应该如下:

  1. 用户访问 www.exampleblog.com

  2. 用户在浏览器中输入你的博客网址并发起访问请求。
    DNS 解析 www.exampleblog.com

  3. DNS 服务器将域名解析为 CDN 提供的加速域名。
    CDN 节点检查缓存

  4. CDN 节点检查是否已经缓存了用户请求的内容。

  5. CDN 返回缓存内容

  6. 如果缓存命中,CDN 直接将缓存内容返回给用户。
    CDN 转发请求到源服务器

  7. 如果缓存未命中,CDN 将请求转发到源服务器(你的 Nginx 服务器)。
    Nginx 源服务器处理请求

  8. 源服务器处理请求,生成博客页面内容。
    返回博客内容给 CDN

  9. 源服务器将生成的内容返回给 CDN。
    CDN 缓存内容

  10. CDN 将从源服务器获取的内容进行缓存,以便下次请求时可以直接返回。并返回内容给用户

  11. CDN 将内容返回给用户的浏览器。
    用户成功加载博客页面,用户在浏览器中成功加载并查看博客页面。

通过引入 CDN,我的博客访问速度显著提升,尤其是在不同地区的访问效果更为明显。同时,源服务器的 IP 地址得到了保护,避免了潜在的安全威胁。

CDN 在以下几个方面帮助提升了网站性能和安全性:

  • 加速用户访问:无论用户在哪个地区,都能快速加载页面。
  • 减轻源服务器压力:CDN 缓存有效地减少了对源服务器的请求频率。
  • 提升安全性:隐藏源服务器 IP 地址,并提供基础的 DDoS 防护。
  • 如果你也在寻找提升网站速度与安全的方式,CDN 是一个非常值得考虑的方案!

值得一提的是需要关注自己的cdn配额,如果遭遇了ddos攻击或者是大量的访问可能会造成一些cdn费用的问题。

参考资料

Hexo博客搭建教程,及阿里云服务器部署实战
CDN
Nginx 极简教程
什么是CDN安全防护