极地雪狼 2020-06-01
Nginx 动静分离,指的是静态资源请求由 Nginx 处理,动态资源请求由 php-fpm 处理或 tomcat 处理,tomcat 服务本身是用来处理 JSP 代码的,同时 tomcat 也能处理静态资源,但 tomcat 本身处理静态效率不高,还会带来资源开销,动静分离的架构中让 tomcat 只处理JSP代码 。
在负载均衡服务器的服务器上, Nginx 根据客户端请求 URI 判断请求的是否为静态资源,如果请求的 URI 包含了 JPG、PNG 等字段,则由处理静态请求的服务器处理(部署 Nginx);如果请求的 URI 包含了 .php、.jsp 等字段,则由处理动态请求的服务器处理(部署 Tomcat)。
将动态请求和静态请求分配到不同的服务器,如获取数据库信息的请求分配到动态请求服务器,获取静态资源图片的请求分配到静态请求服务器,使用 Nginx 负载均衡代理实现动静分离,模拟环境如下:
服务器主机名 | 作用 | 服务 | IP |
---|---|---|---|
lb01 | 负载均衡 | nginx proxy | 10.0.0.5 |
web01 | 静态资源 | nginx static | 10.0.0.7 |
web02 | 动态资源 | tomcat server | 10.0.0.8 |
负载均衡服务器配置:
# 负载均衡服务器 nginx 配置文件,根据请求的 URI 区分动态请求和静态请求 [ ~]# vi /app/nginx/conf/conf.d/static_dynamic.conf upstream static { server 10.0.0.7; } upstream dynamic { server 10.0.0.8:8080; } server { listen 80; server_name all.com; location / { root /code; index index.html; } location ~ \.(jpg|gif|png)$ { proxy_pass http://static; } location ~ \.jsp { proxy_pass http://dynamic; } } # 前端代码,使用 Ajax 获取 .jsp 文件 [ ~]# cat /code/index.html <html lang="en"> <head> <meta charset="UTF-8" /> <title>AJAX 实现动静分离</title> <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> </head> <script type="text/javascript"> $(document).ready(function(){ $.ajax({ type: "GET", url: "http://all.com/random.jsp", success: function(data){ $("#get_data").html(data) }, error: function() { alert("动静分离没有实现!"); } }); }); </script> <body> <h1>动静分离测试</h1> <img src="http://all.com/1.jpg"> <div id="get_data"></div> </body> </html> [ ~]# nginx -s reload
静态资源服务器配置:
# 静态资源服务器 nginx 配置文件 [ ~]# cat /app/nginx/conf/conf.d/static.conf server { listen 80; server_name static.com; root /static; index index.html; location ~* \.(jpg|png|gif)$ { root /static/images/; } } # 静态资源目录 [ ~]# tree /static/ /static/ ├── images │?? └── 1.jpg └── index.html [ ~]# nginx -s reload
动态资源服务器配置:
# 动态资源服务器,需要安装 tomcat [ ~]# yum -y install tomcat # 在 webapps 下创建一个 ROOT 目录,存放 .jsp 文件 [ ~]# mkdir -p /usr/share/tomcat/webapps/ROOT # 编辑一个生成随机数的 .jsp 文件 [ ROOT]# cat random.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <HTML> <HEAD> <TITLE>zzzwqh JSP Page</TITLE> </HEAD> <BODY> <% Random rand = new Random(); out.println("<h1>Random:<h1>"); out.println(rand.nextInt(99)+100); %> </BODY> </HTML> [ ~]# systemctl start tomcat