Nginx+Tomcat集群

一. 简介

Tomcat集群能带来什么?

  1. 提高服务的性能、并发能力、以及高可用性;
  2. 提高项目架构的横向扩展能力

提高服务的性能

实际公司线上生产环境都会选择一台机器部署一个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 服务器压力。

[[14.Tomcat部署及优化]] [[Nginx安装及配置]]