前言

最新公司新开了一个项目,项目由我来配置基础环境,会写一系列的教程来展示,一个网站从零到上线的整个过程。首先本文介绍资源文件的隔离。

为什么要实现动静分离

为什么要将静态资源文件与动态请求进行分离? 为了降低 Tomcat 服务器的负载,可以通过本文设置并结合 CDN 来实现来更彻底地降低服务器的负载。

如图所示,所有的请求都压到了同一台服务器上, 无论静态还是动态的请求,这样流量大的话势必会造成服务器的负载过高,因为动静分离是必不可少的。

环境介绍

首先这是我们项目的目录结构, resource 目录和 _res 目录中都是静态资源文件,存放比如 js/css/img 等资源。这两个目录下的文件有所不同,_res 目录下面是压缩版本的,比如压缩的js/css。通过 Git 或者 SVN 将项目上传到服务器上后,配置 Nginx 来完成静态资源的分离。

首先看一张图(图的来源是:http://www.cnblogs.com/xiaoblog/p/4241086.html)

当请求经过 Nginx 时,如果是静态资源的请求,就直接返回主机上静态资源即可, 如果是动态请求,则去请求 Tomcat 服务器后再返回。如果流量不是很大,静态资源可以和 Tomcat 服务器放在同一台主机上,否则需要将静态资源与 Tomcat 服务器分开。

我司对于资源文件的做法是新建一个二级域名,该域名只用于加载静态资源文件。如 res.domain.com,这样做的好处是简化了在 Nginx 的 配置。

配置 Nginx

首先需要安装 Nginx, 可以参考我的另外一篇文章 Nginx实现Tomcat集群。这里只需要参考到安装 Nginx 即可。

Nginx 静态资源配置

打开 Nginx 配置文件

vim /usr/local/nginx/conf/nginx.conf

添加 server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
# 只接收静态资源请求
listen 80;
server_name res.domain.com;
charset utf8;

default_type text/plain;
add_header Access-Control-Allow-Origin *;
#access_log logs/heiyan.image.access.log click;

location ~* \.(zip|rar|gz|tar.gz|gz|exe)$ {
return 500;
}

location / {
#资源文件的目录
root /home/resources;
index index.html;

expires 30d;
default_type text/plain;
}
}
server {
# 接收动态请求
listen 80;
server_name www.domain.com;
charset utf8;

access_log logs/access.log main;

location / {
proxy_pass http://127.0.0.1:8080;
}
}

拷贝项目中资源文件到指定的资源目录

在 Nginx 的配置文件中指定了资源文件的目录为 /home/resources ,所以需要将资源拷贝到该目录下,进入上文下载的项目的目录中,将资源目录(我这里是_res目录)拷贝到 /home/resources目录下面。

cp -rf _res /home/resources

拷贝完成后的目录应该是: /home/resources/_res

/home/resources/_res 目录下放一张图片 a.jpg ,用于测试。

测试静态资源获取

启动 Nginx

打开浏览器访问: http://res.domain.com/_res/a.jpg

如果是动态请求,则使用 http://www.domain.com 域名

返回结果:

因为静态资源文件包含 css/js 等文件,修改提交后需要拷贝增量与修改的文件到 /home/resources 目录下,如果嫌麻烦,可以直接在 Nginx 配置文件中,配置 路径为项目的资源文件夹根路径,比如 /home/wide-api/src/main/java/resources/_res, 这种在更新代码之后,可以直接请求到新的资源文件。之后会写一篇通过阿里云CDN来完成静态分离。

注: 由于我的是在虚拟机上的 Nginx 进行测试,也没有域名,且是minimal版本系统,没有桌面环境,所以需要配置宿主机的hosts, 在宿主机的浏览器中访问。在真实服务器且有自己绑定到服务器上域名的就直接测试即可。

使用 SwitchHosts 软件 配置 hosts,我的虚拟机 ip 为192.168.200.129

1
192.168.200.129 www.domain.com res.domain.com