• Nginx+Tomcat实现动静分离


    一.动静分离的原理及架构

    1.1 动静分离是什么?

    动静分离(Separation of Concerns)是一种常见的Web架构设计模式,通过将动态内容(如Java应用程序、PHP脚本等)和静态内容(如HTML文件、图片、CSS、JavaScript等)分开处理,可以提高网站的性能和可伸缩性。在实现动静分离时,通常会使用Nginx作为反向代理服务器,将请求分发到不同的后端服务器上。

    1.2 动静分离的原理

    • 服务端接收来自客户端的请求中。既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端。

    原理图如下:
    在这里插入图片描述
    在这里插入图片描述

    1.3 动静分离的架构组成

    • Nginx 很少处理动态页面,说起来,它其实是一个基于多路复用模型构建的产品,常用来高性能HTTP和反向代理服务器,在运行的过程汇总占用较低的内存,可以支持更多的并发连接。
    • nginx处理静态资源是tomcat的6倍
    • Tomcat是一个Jsp/Servlet容器服务器,在最新的Tomcat版本中,支持epoll模型,如果要处理动态应用,比如java的动态应用,肯定是首选,但Tomcat处理静态请求能力就比较弱。

    所以 Nginx与Tomcat的整合正好结合了两者的优点,在企业级生产环境应用中,这种组合去实现动静分离也非常常见。

    二.Nginx+Tomcat实现动静分离

    2.1实验环境

    本次实验所用版本介绍:

    CentOS7.9,jdk-11.0.22,nginx-1.20.1,tomcat-10.1.19
    
    • 1

    本次实验所用主机:

    hostname          ip             port
    nginx         10.0.0.103.         80
    tomcat1       10.0.0.102         8080
    tomcat2       10.0.0.104         8080
    
    • 1
    • 2
    • 3
    • 4

    2.2所需软件环境

    [root@tomcat1 ~]# java -version                                             #检查java版本
    openjdk version "11.0.22" 2024-01-16 LTS
    OpenJDK Runtime Environment (Red_Hat-11.0.22.0.7-1.el7_9) (build 11.0.22+7-LTS)
    OpenJDK 64-Bit Server VM (Red_Hat-11.0.22.0.7-1.el7_9) (build 11.0.22+7-LTS, mixed mode,
    sharing)
    
    systemctl stop firewalld.service           #停止防火墙服务
    systemctl disable firewalld.service        #关闭防火墙服务  
    setenforce 0                               #设置selinux模式为不可用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    关于jdk的安装可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128245144

    注意: 在tomcat1和tomcat2两台服务器都需要安装jdk和tomcat

    2.3nginx服务的实现

    10.0.0.103为nginx服务器,本文采用yum安装的方式
    nginx的其它安装方法可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128107565

    • 安装nginx
    [root@nginx ~]# yum install  -y nginx
    
    [root@nginx ~]# systemctl daemon-reload         
    [root@nginx ~]# systemctl start nginx.service                  #启动nginx                
    [root@nginx ~]# systemctl enable nginx.service                 #设置nginx开机启动
    [root@nginx ~]# ps -ef|grep nginx                              #检查nginx运行进程
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.4配置动静分离

    nginx服务器设置静态页面:

    1.在Ngnix服务器后台创建用于静态页面目录static,并在其中添加静态测试页面:

    [root@nginx ~]# mkdir /usr/local/nginx/html/static
    [root@nginx ~]# cd /usr/local/nginx/html/static
    [root@nginx static]# vim test.html
    
    
     

    这是a rookie的页面

    "a rookie.jpg"/> [root@nginx static]# ls #a rookie.jpg图片通过xshell工具从windows本机上传至static目录 a rookie.jpg test.html
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.在tomcat1、tomcat2服务器上分别创建动态目录test,在目录中各自创建一个动态页面:

    mkdir -p /usr/local/tomcat/webapps/test/
    
    [root@tomcat1 ~]# vim /usr/local/tomcat/webapps/test/index.jsp        #编辑动态jsp文件
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>
    <head>
    <title>JSP test1 page</title>
    </head>
    <body>
    <% out.println("这是第一个页面");%>
    </body>
    </html>
    [root@tomcat2 ~]# vim /usr/local/tomcat/webapps/test/index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>
    <head>
    <title>JSP test1 page</title>
    </head>
    <body>
    <% out.println("这是第二个页面");%>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    修改server.xml文件中的Context和appBase

    [root@tomcat1 ~]# vim /usr/local/tomcat/apache-tomcat-10.1.19/conf/server.xml
    [root@tomcat2 ~]# vim /usr/local/tomcat/apache-tomcat-10.1.19/conf/server.xml
    
    • 1
    • 2

    在这里插入图片描述
    3.配置nginx配置文件

    • upstream模块用于设置后端服务器的服务池和负载均衡策略,以提供响应数据。
    • location模块用于设置正则表达式对用户发起的URL进行匹配,也就是实现动静分离的功能

    更多nginx配置文件模块可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128212937

    [root@nginx ~]# vim /etc/nginx/nginx.conf
          upstream tomcatserver {                       #制定负载均衡器名字为tomcatserver
           server 10.0.0.102:8080 weight=1;             #通过8080提供web服务,配置权重(默认轮询)
           server 10.0.0.104:8080 weight=1;             #通过8080提供web服务,配置权重(默认轮询)
      }
      server {
            listen       80;                            #监听端口80
            server_name  localhost;                     #默认本机地址
            charset 'utf-8';                            #使用utf-8字符集
    
        location ~* .*\.jsp$ {                          #正则表达式匹配动态页面
        proxy_pass    http://tomcatserver;              #反向代理服务域名
        proxy_redirect off;                             #当上游服务器返回响应式重定向或者刷新时
        proxy_set_header Host $host;                    #设置由后端服务器获取用户主机名、真实IP地址以及代理者的真实IP地址
        proxy_set_header X-Real-IP $remote_addr;        #只添加客户端IP到请求报文头部,转发至后端服务器
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部
        }
        location ~ .*\.(jpg|jpeg|png|htm|html|css)$ {   #正则表达式匹配静态文件
        root /usr/local/nginx/html/static/;             #指定静态文件
        expires 1d;                                     #指定1天的延期时间
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    4.重启服务

    [root@tomcat1/2 bin]# /usr/local/tomcat/bin/shutdown.sh       #停止tomcat进程
    [root@tomcat1/2 bin]# /usr/local/tomcat/bin/startup.sh        #重启tomcat进程
    
    [root@nginx ~]# systemctl restart nginx
    
    • 1
    • 2
    • 3
    • 4

    5.访问测试
    首先验证静态页面,用户只需要访问Nginx服务器地址,两台Tomcat服务器对用户是透明的,在浏览器输入访问地址http://10.0.0.103/test.html,发现静态页面已经由Nginx服务器提供静态解析并反馈浏览器显示如下:
    在这里插入图片描述

    验证动态页面,在浏览器输入访问地址http://10.0.0.103/index.jsp,发现动态页面已经由Nginx服务器提供动态解析,并且随着用户对页面的访问刷新,按照轮询负载均衡策略,交替显示“第一个页面”与“第二个页面”,如下所示:
    在这里插入图片描述
    在这里插入图片描述
    以上就是本篇的全部内容,实现了Nginx+Tomcat动静分离

  • 相关阅读:
    Linux操作系统之文件系统详解
    (六)Mybatis中接口代理机制及使用
    Window11右键菜单没有新建菜单解决
    数据安全:.[bkpsvr@firemail.cc].EKING勒索病毒的特点和数据恢复方法
    图论---拓扑排序
    单源最短路径问题(Java)
    elasticsearch基本语法
    微软用它取代了`Nginx`吞吐量提升了百分之八十!
    1.1 OpenCV随手简记(一)
    制作macOS Ventura U盘启动盘教程
  • 原文地址:https://blog.csdn.net/zhanghongshun624/article/details/136292170