当前位置: 首页 > 网站建设 > 智能解析 + Nginx反向代理,自建CDN加速节点

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

网站建设 32条评论 2017-6-28 11,941 views

买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://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 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://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 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的反向代理缓存

32 条评论 “智能解析 + Nginx反向代理,自建CDN加速节点”

  1. 路子说道:

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

  2. 李凯说道:

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

    1. xiaoz说道:

      这个正在计划中

  3. 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说道:

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

  4. 什么时候搞个大硬盘,做个图床,用这个做cdn试试

  5. 小清新说道:

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

  6. as077说道:

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

    1. xiaoz说道:

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

      1. as077说道:

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

      2. as077说道:

        保存退出的时候也会出现错误:
        “/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说道:

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

          1. as077说道:

            好吧,我琢磨下,不过。我改了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; 还是不行。没有头绪了!

  7. 小清新说道:

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

  8. 小清新说道:

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

    1. xiaoz说道:

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

  9. lodisy说道:

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

    1. xiaoz说道:

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

  10. 菜鸟运维说道:

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

  11. 老牛说道:

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

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

    1. xiaoz说道:

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

  12. 欧阳运崖说道:

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

    1. xiaoz说道:

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

  13. 厘米说道:

    自建CDN得花不少银子啊!

    1. xiaoz说道:

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

  14. longskay说道:

    小Z兄 现在玩的飞起了啊

  15. 闲逛说道:

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

    1. xiaoz说道:

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

      1. 闲逛说道:

        对哦,也可以改hosts

      2. 闲逛说道:

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

  16. Jo说道:

    这个不错,支持

发表评论

电子邮件地址不会被公开。 必填项已用*标注