丁丁生于 1987.07.01 ,30岁,英文ID:newflydd
使用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攻击机会也非常小,所以暂时用不到这个高档玩意儿,有兴趣的朋友可以继续研究。