lisa主机lisa主机

智能解析 + Nginx反向代理,自建CDN加速节点

发布于:2017-06-28 网站建设 47条评论

买VPS就像“xidu”一样,根本停不下来呀有木有?如果你手里已经有一打VPS,不知道用来干嘛,不妨一起来研究下如何自建CDN,如《CentOS安装Fikker 缓存,自建CDN加速》,Fikker非常方便,功能也很强大,不过免费版不支持页面缓存、也不支持HTTP/2,我们也可以用Nginx反向代理实现自建CDN.

名词概念

智能解析:域名智能解析是指域名解析服务器根据来访者的IP类型,对同一域名作出相应不同解析。对IP来自电信的访问者,将域名解析到该域名对应IP地址为电信的服务器上。对IP来自网通的访问者,将域名解析到该域名对应IP地址为网通的服务器上。以保证访问者不因网通电信线路瓶颈而造成网速慢。

反向代理:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

CDN:CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

访客流程图

准备工作

安装Nginx

需要在所有CDN服务器节点安装Nginx,推荐使用OneinStack或军哥的lnmp.org一键包,如何安装Nginx自行参考脚本官网就行了。

如果您都不想使用,可以试试xiaoz的一键Nginx安装包(适用于Centos 7、Deebian 8),执行下面的命令安装即可。

wget https://raw.githubusercontent.com/helloxz/nginx-cdn/master/nginx.sh
chmod +x nginx.sh && ./nginx.sh

反向代理配置

反向代理通俗点你把它理解成CDN节点就行了,这里用4台服务器作为解释,

  • 源站:192.168.1.100,就是网站数据真实存放的地方
  • CDN1:192.168.1.101(电信节点)
  • CDN2:192.168.1.102(联通节点)
  • CDN3:192.168.1.103(移动节点)

假如我需要对www.xiaoz.me搭建CDN节点,数据放在192.168.1.100,需要先修改hosts指向,告知CDN节点从那里去获取网站数据,也就是回源地址,需要在CDN1/CDN2/CDN3做如下修改:

vi /etc/hosts
192.168.1.100   www.xiaoz.me

分别在CDN1/CDN2/CDN3下创建nginx配置文件xiaoz.me.conf

#创建缓存目录
mkdir -p /data/wwwroot/caches/www.xiaoz.me
#设置缓存目录权限
chown -R www:www /data/wwwroot/caches/www.xiaoz.me
#创建xiaoz.me.conf
vi /usr/local/nginx/conf/vhost/xiaoz.me.conf

xiaoz.me.conf中添加下面的内容,缓存目录/缓存时间请根据实际情况调整,后面会详细说明各参数含义。

proxy_cache_path /data/wwwroot/caches/www.xiaoz.me levels=1:2 keys_zone=xiaoz:50m inactive=30m max_size=50m;
server {
    listen 80;
    server_name www.xiaoz.me;
    charset utf-8,gbk;
        location / {
        proxy_set_header Accept-Encoding "";
           proxy_pass https://blog.xiaoz.org;
           proxy_redirect off;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache xiaoz;
           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.xiaoz.me:为缓存目录
  • levels:指定该缓存空间有两层hash目录,第一层目录为1个字母,第二层为2个字母。
  • keys_zone=xiaoz:50m:为缓存空间起个名字,这里取名为“xiaoz”,后面的50m指内存缓存空间
  • inactive=30m:如果30分钟内该资源没有被访问则删除
  • max_size=50m:指硬盘缓存大小为50MB
  • proxy_cache_valid:指定状态码缓存时间,前面写状态码,后面写缓存时间。

最后别忘了重载nginx使配置生效,如果使用的oneinstack直接输入命令:service nginx reload,如果是xiaoz一键脚本输入:/usr/local/nginx/sbin/nginx -s reload,如果有报错,可以贴出报错信息一起讨论下。

智能解析

假如您上面CDN1/CDN2/CDN3三个CDN节点都配置好了,在CloudXNS后台,将不同的运营商指向不同的节点,使其达到分发和缓存加速效果,如下截图。


其它说明

解析后可以使用超级ping工具ping.chinaz.com测试各地解析是否生效,也可以本地修改hosts访问测试是否正常,同时分享下小z博客(www.xiaoz.me)的完整CDN配置:

proxy_cache_path /data/wwwroot/caches/www.xiaoz.me levels=1:2 keys_zone=xiaoz:50m inactive=30m max_size=50m;
server {
    listen 443 ssl http2;
    ssl_certificate /data/ssl/www.xiaoz.me/www_xiaoz_me.crt;
    ssl_certificate_key /data/ssl/www.xiaoz.me/www_xiaoz_me.key;
    ssl_session_timeout 1d;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_dhparam /data/ssl/dhparam.pem;

    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;
    access_log /data/wwwlogs/xiaoz.me_nginx.log combined;

    charset utf-8,gbk;
        location / {
        proxy_set_header Accept-Encoding "";
           proxy_pass https://blog.xiaoz.org;
           proxy_redirect off;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache xiaoz;
           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;
}

总结

以上教程需要一点linux基础,如果您手里有不少闲置CDN,可以折腾试试,若有任何疑问欢迎留言讨论,原创文章转载请注明。

扩展阅读:nginx的反向代理缓存

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


已有 47 条评论

  1. 张晨宇

    我是想咨询一下,智能解析部分,CloudXNS是搭建在哪里呢,cdn节点上么

    1. xiaoz 张晨宇

      CloudXNS是一个智能解析服务,类似于DNSPOD,另外这篇文章已经过时。

  2. kwan

    /etc/hosts 里面

    源服务器不能直接用IP访问的话,能用源站的域名代替吗?

  3. 阿光

    您好,原站不用IP是否可以直接用域名?
    直接用域名我按您的配置,出现504错误?

    1. xiaoz 阿光

      504一般是源站超时了,看下源站设置和nginx配置。

      1. 阿光 xiaoz

        xiaoz
        本人小菜,不要不耐烦哦。。
        问您几个问题。
        1.您写源站IP的地方,可以直接写上源站网址吗?因为我源站服务器设置不能用IP访问。
        2.源站还需要设置什么吗?

        我刚才又重装系统,又装了一遍,这回出现400错误。。
        5555

      2. 阿光 xiaoz

        再问您一下
        /etc/hosts 里面的

        127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
        ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

        这俩行还要吗?

        谢谢

  4. lz

    用国内的的vps反向代理国外服务器是不是需要备案?

    1. xiaoz lz

      是否需要备案,看你域名解析到国内IP(需备案)还是国外IP

  5. 胡林兴

    请问,这种方案是不是就是nginx作为缓存,把一些网站文件图片等信息先缓存过来,然后访问时从这个上面读这些东西。如果网站上面更新了图片,他的实时性如何呢?

    1. xiaoz 胡林兴

      是的,就是使用nginx将其缓存到节点(边缘服务器),你可以在nginx上设置缓存过期时间,达到过期时间,将重新从源站获取并再次缓存。如果在缓存有效期内,则直接从边缘节点返回数据,而不去请求源站,从而达到加速和降低源站压力的作用。

  6. 沈一

    最后启动出现
    nginx: [emerg] “proxy_cache” zone “xiaoz” is unknown in /usr/local/nginx/conf/nginx.conf:151

    1. 李小白 沈一

      兄弟,这个问题解决了嘛?

  7. 欧文斯

    发现一个问题,虽然在 CDN 节点上设置了 hosts 定向到源站,但查看访问日志,实际上有些请求会转到其他 CDN 节点去

  8. 路子

    这个就是我在我上家公司做的事情…nginx做缓存来建cdn,代理软件用了很多,fikker、kangle、nginx、haproxy….代理海外回国内。

  9. 李凯

    能不能做一个反向代理的项目,方便配置 就是弄个web

    1. xiaoz 李凯

      这个正在计划中

  10. m1911

    博主你的一键Nginx安装包 里面的 addcdn.sh 运行报错呢。
    [root@server1 nginx-cdn-master]# bash addcdn.sh
    addcdn.sh: line 5: syntax error near unexpected token `read’
    addcdn.sh: line 5: ` read -p “请输入域名(www.xiaoz.me):” domain’
    这是啥情况

    1. xiaoz m1911

      addcdn.sh 这个脚本我还没写完呢,先不要使用这个脚本。

  11. 小清新

    xiaoz, 请问/etc/hosts里写的回源IP,这个是不是要进行域名解析后才能回源拿数据?
    情况是这样,域名没有备案,数据放在腾讯云上面,代理在美国,这种情况能建CDN吗?

  12. as077

    大佬,只可以使用80端口吗?? 其他端口访问,怎么设置哦?

    1. xiaoz as077

      没明白你的意思,如果是网站指定其他端口访问,自行修改nginx监听即可。

      1. as077 xiaoz

        嗯,就是这样,但是nginx监听怎么修改呢?我有点点小白。!!

      2. as077 xiaoz

        保存退出的时候也会出现错误:
        “/usr/local/nginx/conf/vhost/xiaoz.me.conf”
        “/usr/local/nginx/conf/vhost/xiaoz.me.conf” E212: Can’t open file for writing
        Press ENTER or type command to continue

        1. xiaoz as077

          建议您先熟悉下linux基本命令,可以重点看下vi的使用。

          1. as077 xiaoz

            好吧,我琢磨下,不过。我改了listen 80;80改成200就访问失效。比如我的域名访问是这样的:www.xxxxx.com:200 我需要怎么改才能是直接访问。hosts里面也改了111.111.111.111 http://www.xxxxx.com:200 也改了xiaoz.me.conf的配置proxy_pass http://www.xxxxx.com:200; 还是不行。没有头绪了!

  13. 小清新

    xiaoz你好,按照你的教程配置https后,代理服务器提示502 Bad Gateway,请问知道是什么原因吗?

  14. 小清新

    代理m.site.com、www.site.com不同域,发现一个问题:访问www域,内容是m域的,这种情况不好弄哦

    1. xiaoz 小清新

      检查server_name和proxy_pass设置,反代多个域,请写成多个配置文件。

  15. lodisy

    在国内买几台 vps 做 cdn 是不是也要BA?

    1. xiaoz lodisy

      不仅要BA,最近还要求BA必须转入主机商。

  16. 菜鸟运维

    哈哈哈,一般谁像你一样搞一堆VPS拿着玩儿呀,都要烧钱的

  17. 老牛

    你网站现在好快
    怎么弄的? 本身服务器有缓存还是生成了静态? 还是CDN?

    另外 我网站现在后台特别慢,你的呢?

    1. xiaoz 老牛

      服务器放到国内了,之前一直在海外。后台速度还行,你用F12看下加载情况呢。

  18. 欧阳运崖

    那么上传文件是传到了源服务器还是传到了cdn呢?

    1. xiaoz 欧阳运崖

      上传到源服务器了撒,CDN只是一个代理而已,代理可以提供文件缓存。

  19. 厘米

    自建CDN得花不少银子啊!

    1. xiaoz 厘米

      如果有多余VPS的话可以利用起来😃

  20. 闲逛

    如果是 nginx 反代建立 CDN 的话,proxy_pass 应该填的是源站 IP,不然你把 DNS 解析改了之后,就是自己代理自己了,或者你的 CDN 用其它的域名访问这样也没有问题

    1. xiaoz 闲逛

      谢谢,proxy_pass 填写源站IP我下来测试一下,文中就是通过hosts指向来回源,自己反代自己。

      1. 闲逛 xiaoz

        对哦,也可以改hosts

      2. 闲逛 xiaoz

        我这边是可以的,我之前也是填写的IP ,但是如果网站是强制 https 的话,用 IP 就有问题,会出现 多次重定向,所以还是用 hosts 这种办法好

  21. Jo

    这个不错,支持