Nginx+Tomcat集群
一. 简介
Tomcat集群能带来什么?
- 提高服务的性能、并发能力、以及高可用性;
- 提高项目架构的横向扩展能力
提高服务的性能
实际公司线上生产环境都会选择一台机器部署一个tomcat,多台机器完成集群,毕竟一台机器部署多个tomcat还是有一些共享瓶颈的,例如它们的网卡只有一个,内存和磁盘IO等都是共用的。而多台机器共同提供相同的服务,能够充分利用每一台机器的资源,自然能够提高服务的性能。
并发能力
一台tomcat的http线程池是有限的,那么两台能承载的http线程自然是一台的2倍。
高可用性
简单理解在Nginx下面挂了多台tomcat节点,当其中一台tomcat挂掉的时候,可以把这个节点从Nginx负载均衡tomcat集群的配置当中移除,那么对于请求nginx还会打到可用的tomcat服务器上,并不影响我们提供的服务。所以tomcat集群就能带来一定的高可用性。
横向扩展能力
假设对于一台服务器,通过不断的升级它的cpu、内存、更换固态硬盘等,我们认为这是纵向提高机器的配置,来达到提高tomcat所提供服务的性能,随着硬件不断提高,成本是指数级上升的。
而横向扩展能力则不同,比如天猫的双11活动,因为平时访问量没有那么高,但是双11访问量非常高,当tomcat集群完成后我们就可以做一个横向扩展,只要增加tomcat节点就可以了,根据实际数据、历史数据去做一个评估,当然这个还要有一定的动态能力,根据实际的情况动态的增加几个节点,让nginx进行热部署,就把新增的节点加入到集群中。
Tomcat集群实现原理
通过Nginx负载均衡对多个tomcat进行请求转发,也就是说将多个用户的请求通过一定的策略打到集群的各个tomcat服务器中。
Tomcat集群中的一些问题:
1. Session登录信息存储及读取问题
通常在单tomcat环境下,我们都是将登录信息存储在原生提供的Session对象中。那么在集群环境下,当用户A发起登录请求被转发到tomcat1上,最终登录的session信息存储到了tomcat1上,用户A此时访问系统的某个服务,该请求被转发到了tomcat2上,但是tomcat2并没有该用户的登录信息,所以会提示用户未登录,显然这是不合理的。
所以在集群环境下我们必须要解决多个tomcat之间session共享问题,让用户只需要登录一次就可以继续访问其他的服务。
2. 服务器定时任务并发的问题
当服务器存在定时任务时,假设配置的30分钟执行一次,那么到了执行的时间点,多个tomcat就会同时启动这个定时任务,带来的问题首先是如果定时任务的业务逻辑很复杂时,非常容易造成线上的数据错乱,其次我们其实只希望有一台服务器去执行定时任务就够了,那么多台同时执行也会带来不必要的资源浪费。
3. 根据项目架构和现有业务还有可能有更多的问题
对于实际不同的场景还会有很多的问题,所以随着项目架构的演进,从架构层面的变化会引起代码层面的变化以及解决方案的变化,不要想当然的认为集群就是多部署几台tomcat就行了。
Tomcat集群架构
如图为tomcat集群后简要的架构图,左侧是一个分布式的Redis Session Server,无论用户请求哪台tomcat,都将session信息存储在这里,tomcat请求session也都从这里获取。所以这里还需要做单点登录功能。
同时可以利用分布式Redis来做一个分布式锁,解决多个tomcat在同一时间点启动定时任务的问题。
Nginx负载均衡配置
Nginx实现负载均衡是通过反向代理来实现的
Nginx配置反向代理的主要参数:
- upstream 服务池名 { }:
- 配置后端服务器池,以提供响应数据
- proxy_pass http://服务池名
- 配置将访问请求转发给后端服务器池的服务器处理
Nginx负载均衡常用策略主要有以下5种:
轮询
默认的负载均衡策略,每个请求会按时间顺序逐一分配到不同的后端服务器
优点:实现简单
缺点:不考虑每台服务器的处理能力
upstream www.shengzhe.com{
server 192.168.1.109:8080;
server 192.168.1.111:8080;
}
权重
在轮询策略的基础上指定轮询的几率,通过weight参数指定轮询几率,权重(weight)越高分配到需要处理的请求越多。
weight默认值为1,如果多台都配置了权重,比较相对值,意思是说如果两台服务器一台权重为15,一台为10,只代表访问第一台的概率是第二台的1.5倍,而不是说25次访问,有15次访问第一台。
优点:考虑了每台服务器处理能力的不同(实际生产环境用的比较多的策略)
upstream www.shengzhe.com{
server 192.168.1.109:8080 weight=10;
server 192.168.1.111:8080 weight=15;
}
ip hash
根据请求的IP,将IP进行哈希取模,分配到指定的服务器,对于同一客户端IP的请求将发送到相同的服务器。
优点:能实现同一个用户访问同一个服务器,可以解决session共享问题。
缺点:根据ip hash不一定分配平均,在IP变化的情况下也无法保证session会话。
upstream www.shengzhe.com{
ip_hash;
server 192.168.1.109:8080;
server 192.168.1.111:8080;
}
url hash (第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器
优点:能实现同一个服务访问同一个服务器
缺点:根据url hash分配请求会不平均,请求频繁的url会请求到同一个服务器上
upstream www.shengzhe.com{
server 192.168.1.109:8080;
server 192.168.1.111:8080;
hash $request_uri;
}
fair (第三方)
特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream www.shengzhe.com{
server 192.168.1.109:8080;
server 192.168.1.111:8080;
fair;
}
参数扩展
- down:表示当前的server暂时不参与负载
- backup:当其他非backup的机器down或者忙的时候,请求backup机器,backup相当于备用机器,能提高项目架构的一定高可用性,用的不多,毕竟机器也是资源,需要成本;
upstream www.shengzhe.com{
ip_hash;
server 192.168.1.109:8080 down;
server 192.168.1.111:8080 weight=2;
server 192.168.1.112:8080;
server 192.168.1.115:8080 backup;
}
二. 实现Nginx+Tomcat负载均衡
案例环境:
主机 | IP地址 | 系统 |
---|---|---|
lb-nginx | 192.168.100.100/24 | CentOS 7.7 |
tomcat01 | 192.168.100.110/24 | CentOS 7.7 |
tomcat02 | 192.168.100.120/24 | CentOS 7.7 |
1. 基本环境配置
- IP地址配置
- 主机名设置
- 关闭Selinux
2. 安装nginx
设置nginx YUM源
[root@lb-nginx ~]# yum install yum-utils -y
[root@lb-nginx ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
安装nginx服务,会安装1.16.0版本
[root@lb-nginx ~]# yum install nginx -y
设置nginx开机启动并开启nginx服务
[root@lb-nginx ~]# systemctl enable nginx.service
[root@lb-nginx ~]# systemctl start nginx.service
[root@lb-nginx ~]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-05-20 18:11:58 CST; 4s ago
Docs: http://nginx.org/en/docs/
Process: 1881 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 1882 (nginx)
CGroup: /system.slice/nginx.service
├─1882 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─1883 nginx: worker process
May 20 18:11:58 www.lnmp.com systemd[1]: Starting nginx - high performance web server...
May 20 18:11:58 www.lnmp.com systemd[1]: Started nginx - high performance web server.
防火墙放行http服务
[root@lb-nginx ~]# firewall-cmd --add-service=http --permanent
[root@lb-nginx ~]# firewall-cmd --add-service=http
测试是否可以访问nginx
[root@lb-nginx ~]# curl http://192.168.100.100
3. 安装tomcat
下载并安装JDK
oracle官方下载界面:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@tomcat01 ~]# ls jdk-8u221-linux-x64.rpm
jdk-8u221-linux-x64.rpm
[root@tomcat01 ~]# rpm -ivh jdk-8u221-linux-x64.rpm
warning: jdk-8u221-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8-2000:1.8.0_221-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
jdk安装目录在/usr/java/jdk1.8.0_221-amd64,设置jdk的环境变量,编辑/etc/profile 文件, 增加如下内容:
[root@tomcat01 ~]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@www ~]# source /etc/profile #令修改生效
查看jdk版本号,已经显示是我们安装的软件版本
[root@www ~]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
安装启动Tomcat
从Tomcat官网下载apache-tomcat-9.0.22.tar.gz稳定二进制版本
[root@tomcat01 ~]# wget https://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.22/bin/apache-tomcat-9.0.22.tar.gz
将安装包移动到/usr/local下面,并重命名为tomcat
[root@tomcat01 ~]# tar zxvf apache-tomcat-9.0.22.tar.gz
[root@tomcat01 ~]# mv apache-tomcat-9.0.22 /usr/local/tomcat
启动Tomcat
[root@tomcat01 ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_221-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
在防火墙中放行8080端口
[root@tomcat01 ~]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@tomcat01 ~]# firewall-cmd --reload
success
访问Tomcat,浏览器打开http://192.168.154.142:8080进行访问会出现Tomcat主页
4. 配置tomcat
修改默认页面
[root@tomcat01 ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@tomcat01 ROOT]# mv index.jsp index.jsp.bak
[root@tomcat01 ROOT]# vim index.jsp
<h1> tomcat01 test </h1>
[root@tomcat02 ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@tomcat02 ROOT]# mv index.jsp index.jsp.bak
[root@tomcat02 ROOT]# vim index.jsp
<h1> tomcat02 test </h1>
测试访问:
[root@lb-nginx ~]# curl http://192.168.100.110:8080
<h1> tomcat01 test </h1>
[root@lb-nginx ~]# curl http://192.168.100.120:8080
<h1> tomcat02 test </h1>
5. 配置nginx
配置新的基于域名的虚拟主机,这里server_name配置的是主机对应的域名,proxy_pass是反向代理配置,upstream是负载均衡配置。
[root@lb-nginx ~]# vim /etc/nginx/conf.d/www.shengzhe.conf
upstream www.shengzhe.com{
server 192.168.100.110:8080 weight=1;
server 192.168.100.120:8080 weight=2;
}
server {
listen 80;
autoindex on;
server_name shengzhe.com www.shengzhe.com;
access_log /var/log/nginx/shengzhe_access.log combined;
index index.html index.htm index.jsp index.php;
location / {
proxy_pass http://www.shengzhe.com;
add_header Access-Control-Allow-Origin *;
}
}
重启nginx服务即可。
6. 使用域名测试访问:
[root@lb-nginx ~]# curl http://www.shengzhe.com
<h1> tomcat01 test </h1>
[root@lb-nginx ~]# curl http://www.shengzhe.com
<h1> tomcat02 test </h1>
[root@lb-nginx ~]# curl http://www.shengzhe.com
<h1> tomcat02 test </h1>
Nginx+Tomcat负载均衡&动静分离
一. 什么是动静分离
在弄清动静分离之前,我们要先明白什么是动,什么是静。
在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指Html、img、js、css等文件。
动静分离就是将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。
1. Nginx静态处理优势
主要是 Nginx 处理静态页面的效率远高于 Tomcat 的处理能力,如果 Tomcat 的请求量为 1000 次,则 Nginx 的请求量为 6000 次,Tomcat 每秒的吞吐量为 0.6M,Nginx 的每秒吞吐量 为 3.6M,可以说,Nginx 处理静态资源的能力是 Tomcat 处理能力的 6 倍,优势可见一斑。
tomcat的优势在于少量的接收并处理复杂的http请求(将用户请求读写数据库等),nginx的优势在于能够大量的接收并处理简单的http请求(将http请求转发或者加个header、body等)。
将Html、img、js、css等这种静态资源交给nginx,将用户需要读写数据库等请求交给tomcat是对各自优势的最大利用。
2. 动静分离实现方式
动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。通过location指定不同的后缀名实现不同的请求转发。
3. 动静分离原理
服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html、css、js 和图片资源等等。有一部分是动态数据的请求。因为Tomcat处理静态资源的速度比较慢, 所以可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器(例如 Nginx)处 理,而把动态请求交给 Tomcat 处理。
如图所示,在机器上同时安装了 Nginx 和 Tomcat,把所有的静态资源都放置在Nginx的webroot目录下面,把动态请求的程序都放在 Tomcat 的目录下面。当客户端访问服务端的时候,如果是静态资源的请求,就直接到Nginx的目录下面获取资源。如果是动态资源的请求,Nginx 利用反向代理的原理,把请求转发给Tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。
二. Nginx+Tomcat 动静分离集群实现
本案例是基于集群环境实现,使用Nginx来作为负载平衡器,后端服务器有nginx来处理静态资源,Tomcat来处理动态资源。
案例环境:
主机 | IP地址 | 系统 |
---|---|---|
lb-nginx | 192.168.100.100/24 | CentOS 7.7 |
nginx01 | 192.168.100.110/24 | CentOS 7.7 |
tomcat01 | 192.168.100.120/24 | CentOS 7.7 |
1. 基本环境配置
- IP地址配置
- 主机名设置
- 关闭Selinux
2. 安装nginx
在lb-nginx和nginx01服务器上安装
设置nginx YUM源
[root@lb-nginx ~]# yum install yum-utils -y
[root@lb-nginx ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
安装nginx服务,会安装1.16.0版本
[root@lb-nginx ~]# yum install nginx -y
设置nginx开机启动并开启nginx服务
[root@lb-nginx ~]# systemctl enable nginx.service
[root@lb-nginx ~]# systemctl start nginx.service
[root@lb-nginx ~]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-05-20 18:11:58 CST; 4s ago
Docs: http://nginx.org/en/docs/
Process: 1881 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 1882 (nginx)
CGroup: /system.slice/nginx.service
├─1882 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─1883 nginx: worker process
May 20 18:11:58 www.lnmp.com systemd[1]: Starting nginx - high performance web server...
May 20 18:11:58 www.lnmp.com systemd[1]: Started nginx - high performance web server.
防火墙放行http服务
[root@lb-nginx ~]# firewall-cmd --add-service=http --permanent
[root@lb-nginx ~]# firewall-cmd --add-service=http
测试是否可以访问nginx
[root@lb-nginx ~]# curl http://192.168.100.100
3. 安装tomcat
在tomcat01服务器上进行安装
下载并安装JDK
oracle官方下载界面:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@tomcat01 ~]# ls jdk-8u221-linux-x64.rpm
jdk-8u221-linux-x64.rpm
[root@tomcat01 ~]# rpm -ivh jdk-8u221-linux-x64.rpm
warning: jdk-8u221-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8-2000:1.8.0_221-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
jdk安装目录在/usr/java/jdk1.8.0_221-amd64,设置jdk的环境变量,编辑/etc/profile 文件, 增加如下内容:
[root@tomcat01 ~]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@www ~]# source /etc/profile #令修改生效
查看jdk版本号,已经显示是我们安装的软件版本
[root@www ~]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
安装启动Tomcat
从Tomcat官网下载apache-tomcat-9.0.22.tar.gz稳定二进制版本
[root@tomcat01 ~]# wget https://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.22/bin/apache-tomcat-9.0.22.tar.gz
将安装包移动到/usr/local下面,并重命名为tomcat
[root@tomcat01 ~]# tar zxvf apache-tomcat-9.0.22.tar.gz
[root@tomcat01 ~]# mv apache-tomcat-9.0.22 /usr/local/tomcat
启动Tomcat
[root@tomcat01 ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_221-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
在防火墙中放行8080端口
[root@tomcat01 ~]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@tomcat01 ~]# firewall-cmd --reload
success
访问Tomcat,浏览器打开http://192.168.154.142:8080进行访问会出现Tomcat主页
4. 配置lb-nginx负载平衡器
[root@lb-nginx ~]# vim /etc/nginx/conf.d/www.shengzhe.conf
#定义静态服务器组
upstream static {
server 192.168.100.110 weight=1;
}
#定义动态服务器组
upstream dynamic {
server 192.168.100.120:8080 weight=1;
}
server {
listen 80;
autoindex on;
server_name shengzhe.com www.shengzhe.com;
access_log /var/log/nginx/shengzhe_access.log combined;
index index.html index.htm index.jsp index.php;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://static;
}
location ~* .*\.(css|html|js)$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://static;
}
location ~* .*\.(jsp|php)$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://dynamic;
}
}
5. 编辑静态页面
在nginx01上编辑静态页面如下:
[root@nginx01 html]# vim /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>静态页面</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>静态页面</h1>
<p>这是个静态页面</p>
</body>
</html>
6. 创建项目,并编写jsp动态文件
在tomcat01上编写动态文件
[root@tomcat01 ~]# cd /usr/local/tomcat/webapps/
[root@tomcat01 webapps]# mkdir test
[root@tomcat01 webapps]# vim test/index.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>动态页面</title>
</head>
<body>
<div>动态页面</div>
</body>
</html>
重启tomcat服务
7. 测试访问
测试访问静态页面:http://www.shengzhe.com
测试访问动态页面:http://www.shengzhe.com/test/index.jsp
8. 设置 Nginx 处理静态图片,后端 Tomcat 处理动态页面。
修改Tomcat01端 jsp 文件,指定图片文件。
[root@tomcat01 ~]# vim /usr/local/tomcat/webapps/test/index.jsp
<body>
<div>动态页面</div><br>
<img src='logo.jpg'>
</body>
修改lb-nginx配置文件,增加图像文件处理,然后重启nginx服务
[root@lb-nginx ~]# vim /etc/nginx/conf.d/www.shengzhe.conf
upstream static {
server 192.168.100.110 weight=1;
}
upstream dynamic {
server 192.168.100.120:8080 weight=1;
}
upstream images {
server 192.168.100.110:808 weight=1;
}
server {
listen 80;
autoindex on;
server_name shengzhe.com www.shengzhe.com;
access_log /var/log/nginx/shengzhe_access.log combined;
index index.html index.htm index.jsp index.php;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://static;
}
location ~* .*\.(css|html|js)$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://static;
}
location ~* .*\.(jsp|php)$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://dynamic;
}
location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://images;
}
}
修改nginx01的服务器配置文件,增加图片服务处理
#修改配置文件
[root@nginx01 nginx]# vim /etc/nginx/conf.d/images.conf
server {
listen 808;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/images;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 创建目录,并拷贝图片文件,注意:目录名称需要和java项目名称相同。
[root@nginx01 nginx]# mkdir /usr/share/nginx/images/test
[root@nginx01 nginx]# mkdir /usr/share/nginx/images/test
[root@nginx01 nginx]# ls
html images logo.jpg
[root@nginx01 nginx]# mv logo.jpg images/test/
#重启服务
[root@nginx01 nginx]# systemctl restart nginx
#防火墙放行端口
[root@nginx01 nginx]# firewall-cmd --add-port=808/tcp
success
[root@nginx01 nginx]# firewall-cmd --add-port=808/tcp --permanent
success
9. 访问测试
访问http://www.shengzhe.com/test/index.jsp,查看图片是否添加。
10. 查看访问日志
在lb-nginx上查看日志
[root@lb-nginx ~]# tail /var/log/nginx/shengzhe_access.log
192.168.100.11 - - [21/Jan/2020:21:37:50 +0800] "GET /test/index.jsp HTTP/1.1" 200 325 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
192.168.100.11 - - [21/Jan/2020:21:37:50 +0800] "GET /test/logo.jpg HTTP/1.1" 200 10289 "http://www.shengzhe.com/test/index.jsp" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
192.168.100.11 - - [21/Jan/2020:21:37:50 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://www.shengzhe.com/test/index.jsp" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
在tomcat01上查看访问日志
[root@tomcat01 ~]# tail /usr/local/tomcat/logs/localhost_access_log.2020-01-21.txt
192.168.100.100 - - [21/Jan/2020:00:01:32 +0800] "GET /test/index.jsp HTTP/1.0" 200 300
192.168.100.100 - - [21/Jan/2020:00:10:23 +0800] "GET /test/index.jsp HTTP/1.0" 200 300
192.168.100.100 - - [21/Jan/2020:21:37:51 +0800] "GET /test/index.jsp HTTP/1.0" 200 325
通过日志分析,可以得出 Nginx 处理图片的静态图片请求,Tomcat 处理页面的动态请 求,从而达到动静分离,减轻 Tomcat 服务器压力。