使用Nginx配合免费的七牛帐号打造自己的CDN加速服务

初次领略nginx的神奇

之前有听说过nginx,当时只不过认为是普通的HTTP前置机一样的服务,确实没想这么好用:反向代理、URL转发、负载均衡,统统集中在这不到2M的软件中,真是让人惊叹。

下载安装nginx

最新版的 nginx 是 nginx-1.11.4
我在本地PC安装测试的是Windows版,Linux版下载和配置是一样的。
下载回来后解压,可以直接鼠标点击nginx.exe运行。(PS:运行之前保证80端口是空闲的)
运行后一闪而过,根本不知道发生了什么。这时候请打开浏览器,输入https://localhost,如果看到nginx的欢迎页面,说明刚才双击nginx.exe已经产生了作用,nginx服务器已经在后台帮你默默运行着一个超轻量级的WEB服务器。

配置nginx实现反向代理Tomcat

OK,目前我们运行的nginx还只能给浏览器响应简单的HTML、CSS、js等静态资源,下面我们通过简单几行配置,让ngnix与处理J2EE的tomcat进行连通,当客户端浏览器访问指定格式的URL时,由nginx统一接管,然后nginx主动访问本地或远程的Tomcat(本地的tomcat需运行在另一个端口上,不要与nginx冲突),得到响应后,再由nginx转发给客户端浏览器,这个流程就叫做「反向代理(Reverse Proxy)」
具体实现方法如下:

  • 设置Tomcat的端口号,避开80端口,使用8080,or any others you like.设置tomcat的conf文件夹下的server.xml,此处不表。
  • 对nginx的配置文件nginx.conf进行修改,此配置文件在nginx文件夹中的conf文件夹中:
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        #转交所有URL给tomcat
        location / {
            proxy_pass https://localhost:8080;
        }

        #下面这个配置将URL指向resources文件夹的路径全部转发给了远程CDN
        location ^~ /resources/ {
            rewrite /resources/(.*) https://files.hexcode.cn/resources/$1;
            expires 7d;
        }
    }
}

原版的nginx.conf文件里面密密麻麻好多注释,第一次使用确实有点绕脑,也有很多名词不曾接触过,我建议立刻马上去除那些注释,去掉那些注释后,真正有用的配置脚本不超过20行,行行重要,字字玑珠。

location / {
    proxy_pass https://localhost:8080;
}

原版配置文件是用root属性,指向了磁盘路径,这里改成proxy_pass属性,指向domain+端口号组成的URL,表示所有请求使用反向代理,让nginx帮客户端浏览器去https://localhost:8080取数据。

将静态资源转移到七牛CDN上

你一定注意到了上面的配置文件,我写上了这么一段:

#下面这个配置将URL指向resources文件夹的路径全部转发给了远程CDN
location ^~ /resources/ {
    rewrite /resources/(.*) https://files.hexcode.cn/resources/$1;
    expires 7d;
}

别着急,听我慢慢道来:
我们 JBlog 的系统,将所有的js,css,fonts等文件全部放在/resources/文件夹下,当时使用SpringMVC的静态资源语法配置的,但这些资源本质上还是要通过本地Tomcat传输给客户端浏览器的,所有的带宽负载和流量计价都是消耗的本地的,如何将这一部分流量和带宽,转嫁到其他云服务上呢,使用nginx会相当方便。
一旦用了nginx,如果你在学SpringMVC时,遇到配置静态资源这一章,可以直接跳过,为什么?因为你配置好nginx后,指定的静态资源压根跑不到tomcat那边去,在nginx这边就帮你转发走了,而且只要你愿意,你可以把这些静态资源全部放到第三方CDN云服务上去加速,这样做是相当有好处的:第一,你的服务器不再传输这些大块头的CSS,JS还有fonts字体文件,节省了带宽,节约了流量;第二,第三方CDN一般带宽会比你买的VPS的带宽高很多,像七牛免费账户有5M以上的带宽给免费用户,还会帮你把文件放置全国多个节点上,让东南西北的浏览器都能极速下载这些静态资源;第三,一般我们很难在Tomcat层级指定某一个CSS文件的缓存策略,但是使用nginx以后,只要你熟悉正则表达式,你可以对任意通配的URL设置独立的缓存策略,这样客户端在访问你动态页面时你可以设置为禁止缓存,但动态页面中嵌入的CSS,你可以独立设置为缓存个一两天。
回到上面的配置文件,我们将URL中指向/resources/的所有文件,重定向到一个七牛免费域名中,同时我们使用七牛的同步软件 qrsbox将resources文件夹完整同步到云端,这样,nginx可以第一时间阻断访问本地资源的操作,让用户全部转向云端服务器下载这些静态资源。其中(.*)是正则表达式,表示任意字符出现任意次数,后面的$1是与其对应的占位值,指向了.*所指代的实际值。
加速,缓存,节约流量,降低本地服务器的带宽负载,nginx太棒了!
nginx还有更多更强大的功能,比如对于分布式服务非常重要的「负载均衡」,我们这里的JBlog项目因为就一台WEB服务器,而且基本上不会有高并发的可能性,遇到DDOS攻击机会也非常小,所以暂时用不到这个高档玩意儿,有兴趣的朋友可以继续研究。

丁丁生于 1987.07.01 ,30岁,英文ID:newflydd

  • 现居住地 江苏 ● 泰州 ● 姜堰
  • 创建了 Jblog 开源博客系统
  • 坚持十余年的 独立博客 作者
  • 大学本科毕业后就职于 中国电信江苏泰州分公司,前两年从事Oracle数据库DBA工作,两年后公司精简技术人员,被安排到农村担任支局长(其本质是搞销售),于2016年因志向不合从国企辞职,在小城镇找了一份程序员的工作。
  • Git OSChina 上积极参与开源社区