# Nginx 代理 - 动静分离
# 1. 动静分离基本介绍
# 1.1 什么是动静分离
简单来说就是将动态请求和静态请求分开处理。
# 1.2 为何需要动静分离
- 首先 Tomcat 应用服务器在处理静态资源时效率不高,但默认情况下无论 “动态、静态 “ 资源都是由 tomcat 处理,而 Tomcat 在处理静态资源时需要进行逻辑运算,从而会导致应用响应慢,并且会占用不必要的系统资源。
- 那么借助 Nginx 实现动态资源请求和静态资源请求分离后,可以减少系统不必要的消耗和延时。以便加快系统的处理性能。
# 1.3 如何实现动静分离
Nginx 通过用户请求的 uri 来区分请求的类型,并转发给不同的服务端。
- 如果请求的 uri 包含 png、jpg 等资源则由 Nginx 处理;
- 如果请求的 uri 包含 php、jsp 等资源则代理至 Tomcat 处理;
# **2.** 单机动静分离实践
单机实现动静分离 nginx + Tomcat
# 2.1 Tomcat 配置
[root@web01 ~]# wget https://download.oracle.com/otn/java/jdk/8u461-b11/68ce765258164726922591683c51982c/jdk-8u461-linux-x64.tar.gz | |
[root@web01 ~]# tar xf jdk-8u461-linux-x64.tar.gz -C /usr/local | |
[root@web01 ~]# ln -s /usr/local/jdk1.8.0_461/ /usr/local/jdk | |
#添加环境变量 | |
[root@web01 ~]# cat /etc/profile.d/jdk.sh | |
export JAVA_HOME=/usr/local/jdk | |
export PATH=$PATH:$JAVA_HOME/bin | |
export JRE_HOME=$JAVA_HOME/jre | |
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/ | |
[root@web01 ~]# source /etc/profile | |
[root@web01 ~]# java -version | |
[root@web01 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.108/bin/apache-tomcat-9.0.108.tar.gz | |
[root@web01 ~]# mkdir /soft | |
[root@web01 ~]# tar xf apache-tomcat-9.0.52.tar.gz -C /soft/ | |
[root@web01 ~]# ln -s /soft/apache-tomcat-9.0.108/ /soft/tomcat | |
[root@web01 ~]# /soft/tomcat/bin/startup.sh |
# 2.2 Nginx 配置
[root@lb01 conf.d]# cat java.hmallleasing.com.conf | |
server { | |
listen 80; | |
server_name java.hmallleasing.com; | |
#处理动态请求 | |
location / { | |
proxy_pass http://192.168.1.7:8080; | |
include proxy_params; | |
} | |
#如果匹配到.png .jpg 这样的后缀,则让其通过 Nginx 读取本地 /code/images 下的资源文件 | |
location ~* \.(png|jpg|svg|ioc)$ { | |
root /code/images; | |
expires 30d; | |
} | |
} | |
[root@lb01 yum.repos.d]# cat /etc/nginx/proxy_params | |
#启用长连接 | |
proxy_http_version 1.1; | |
proxy_set_header Connectin ""; | |
proxy_set_header Host $http_host; | |
proxy_set_header X-Real-IP $remote_addr; | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
proxy_connect_timeout 60; | |
proxy_send_timeout 60; | |
proxy_read_timeout 120; | |
proxy_buffering on; | |
proxy_buffer_size 32k; | |
proxy_buffers 4 128k; | |
proxy_temp_file_write_size 10240k; | |
proxy_max_temp_file_size 10240k; | |
[root@lb01 yum.repos.d]# nginx -t | |
[root@lb01 yum.repos.d]# systemctl reload nginx |
# 3. 集群动静分离实践
通过 nginx 负载均衡将动态请求和静态请求进行分离,基于用户请求 URI 实现路由功能;
# 3.1 环境准备
系统 | 服务 | 角色 | 地址 |
---|---|---|---|
CentOS7.6 | 负载均衡 | Nginx Proxy | 10.0.0.5 |
CentOS7.6 | 动态资源 | Tomcat Server | 10.0.0.7 |
CentOS7.6 | 静态资源 | Nginx Static | 10.0.0.8 |
# 3.2 配置静态节点
# 在 10.0.0.8 服务器上配置静态资源 | |
[root@web02 ~]# cat /etc/nginx/conf.d/ds.hmallleasing.com.conf | |
server { | |
listen 80; | |
server_name ds.hmallleasing.com; | |
root /code/images; | |
location / { | |
index index.html; | |
} | |
} | |
# 准备目录,以及静态相关图片 | |
[root@web02 ~]# mkdir /code/images -p | |
[root@web02 ~]# wget -O /code/images/nginx.png http://nginx.org/nginx.png | |
[root@web02 ~]# systemctl reload nginx |
# 3.3 配置动态节点
# 在 10.0.0.7 服务器上配置动态资源 | |
[root@web01 ~]# /soft/tomcat/bin/shutdown.sh | |
[root@web01 ~]# rm -rf /soft/tomcat/webapps/ROOT/* | |
# 编写 java 配置 | |
[root@web01 ~]# vim /soft/tomcat/webapps/ROOT/index.jsp | |
<%@ page language="java" | |
import="java.util.*" pageEncoding="utf-8"%> | |
<html> | |
<head> | |
<title>Nginx+Tomcat动静分离</title> | |
</head> | |
<body> | |
<% | |
Random rand = new Random(); | |
out.println("<h2>动态资源</h2>"); | |
out.println(rand.nextInt(99)+100); | |
%> | |
<h2>静态图片</h2> | |
<img src="nginx.png" /> | |
</body> | |
</html> | |
[root@web01 ~]# /soft/tomcat/bin/startup.sh |
# 3.4 配置负载均衡
# 负载均衡 10.0.0.5 上配置调度,根据不同的 url 调度到不同的服务器 | |
[root@lb01 conf.d]# cat proxy_ds.hmallleasing.com.conf | |
upstream java { | |
server 192.168.1.7:8080; | |
} | |
upstream static { | |
server 192.168.1.8:80; | |
} | |
server { | |
listen 80; | |
server_name ds.hmallleasing.com; | |
include proxy_params; | |
location / { | |
proxy_pass http://java; | |
} | |
location ~* .*\.(png|jpg)$ { | |
proxy_pass http://static; | |
} | |
} | |
[root@lb01 conf.d]# cat /etc/nginx/proxy_params | |
#启用长连接 | |
proxy_http_version 1.1; | |
proxy_set_header Connectin ""; | |
proxy_set_header Host $http_host; | |
proxy_set_header X-Real-IP $remote_addr; | |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
proxy_connect_timeout 60; | |
proxy_send_timeout 60; | |
proxy_read_timeout 120; | |
proxy_buffering on; | |
proxy_buffer_size 32k; | |
proxy_buffers 4 128k; | |
proxy_temp_file_write_size 10240k; | |
proxy_max_temp_file_size 10240k; | |
[root@lb01 conf.d]# systemctl restart nginx |
# 3.5 测试集群动静分离
测试效果动静分离效果
模拟静态资源集群故障。动态内容依旧能正常访问,静态内容则不会被请求到。