Nginx的静态处理能力很强,但是动态处理能力稍有不足.因此,在企业开发中常用动静分离技术.
动静分离技术其实是采用代理的方式,在nginx.conf配置文件的server{}代码段中加入带正则匹配的location来指定匹配项针对Java的动静分离-->静态页面交给Nginx处理,动态页面交给Apache Tomcat处理.在Nginx的配置中,是通过location配置段配合正则表达式匹配实现静态与动态页面的不同处理方式.
动静分离简单架构示例

动静分离主要用于一些较大型的站点架构,这样做一定程度上可以有效减轻后端节点压力.也就是说,有时候你在前端url中看到的一个目录,其后端对应的很可能就是一个集群.
另外,这样会使网站更加静态化,利于缓存,可显著提高网站访问速度,有效实现前后端解耦.但这样无疑会加大开发的繁琐程度,前后端只能通过各种接口进行通信.
三. 动静分离实现本教程中,我们采用一台Nginx服务器,端口号为8083,2台tomcat服务器,端口号分别为8180和8280.我们将静态资源和动态资源分别存放在8180和8280tomcat服务器上.然后配置 Nginx,当请求的是 jpg等静态资源时,就访问8180服务器上的静态资源目录,当用户提出动态资源的请求时,则将请求转发到后端的8280服务器上,交由 Tomcat 处理,再由 Nginx 将结果返回给请求端.
1. 本教程动静分离示意图如下:

2. 动静分离优点
看到上面的结构图,你可能会有疑问,动态请求要先访问 A ,A 转发访问 B,再由 B 返回结果给 A,A 最后又将结果返回给客户端,这是不是有点多余?
初看的确多余,但是这样做至少有 2 点好处. 1️⃣.为负载均衡做准备,因为随着系统的发展壮大,只用一台 B 来处理动态请求显然是是不够的,要有 B1,B2 等等才行.那么基于图 2 的结构,就可以直接扩展 B1,B2,再修改 Nginx 的配置就可以实现 B1 和 B2 的负载均衡.
2️⃣.对于程序开发而言,这种结构的程序撰写和单台主机没有区别.我们假设只用一台 Tomcat 作为服务器,那么凡是静态资源,如图片、CSS 代码,就需要编写类似这样的访问代码:
,当静态资源过多,需要扩展出其他的服务器来安放静态资源时,访问这些资源就可能要编写这样的代码:
.可以看到,当服务器进行变更或扩展时,代码也要随之做出修改,对于程序开发和维护来说非常困难.而基于上面的结构,程序都只 要 、
,无需关心具体放置资源的服务器地址,因为具体的地址 Nginx 为帮您绑定和选择.
2. 本教程动静分离服务器结构示意图

在8180服务器的/webapps目录下创建staticTest文件夹,里面存放一个logo.jpg文件.
在8280服务器的/webapps目录下创建dynamicTest文件夹,里面存放一个test.jsp文件.
3. 测试目的
访问jpg文件的时候,会转发到192.168.87.108:8180上面; 访问jsp等其他文件会转发到192.168.87.108:8280上面.
注:nginx的安装配置详见前面的博客.
4. nginx的动静分离配置如下.
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#动静分离配置
upstream static_pools {
server 192.168.87.108:8180;
}
upstream dynamic_pools {
server 192.168.87.108:8280;
}
server {
listen 8083;
location / {
root html;
index index.html index.htm;
proxy_pass http://dynamic_pools;
}
#如果请求包含这些后缀,请求被转发到静态池,否则转发到动态池
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
proxy_pass http://static_pools;
}
}
}

5. 重新加载配置文件
service nginx reload
四. 测试
1. 访问jpg文件
因为jpg文件只在tomcat1上面有,所以可以看到静态请求被转发给了8180的机器上.
因为dynamicTest的目录只在tomcat2上面有,所以动态资源的请求被转发到了8280上面.
有时候有可能工程没有做成动静分离,但是通过nginx的配置可以做静态的请求转发给一些服务器,动态的请求转发给另外一些服务器.