zl程序教程

您现在的位置是:首页 >  工具

当前栏目

手把手演示Ngnix+Tomcat实现动静分离

Tomcat 实现 分离 手把手 演示 动静
2023-09-14 09:15:47 时间

前言

大家好,又见面了,我是沐风晓月,本文首发于csdn作者:我是沐风晓月 的【运维系列-系统服务与架构】专栏,专栏还在持续更新中,欢迎关注。

在这里插入图片描述

此专栏是沐风晓月对操作系统中常见的服务进行总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。

如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业,阿里云专家博主😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘


请添加图片描述

一、动静分离架构和原理

1.1 什么是动静分离?

动静分离(Separation of Concerns)是指将一个大型系统分解成若干个独立的部分,每个部分都关注于不同的功能或问题领域。这种分解的目的是简化系统的复杂度,提高系统的可维护性和可扩展性。

在软件开发中,动静分离通常指将系统的业务逻辑与界面表示分离开来,使得系统的前端可以独立开发和维护,而不会受到后端业务逻辑的影响。这样可以降低系统的耦合度,提高代码的复用性和可读性。

动静分离也可以应用于其他领域,比如网络安全中的访问控制和数据保护、系统架构设计中的模块划分等。通过动静分离,可以将不同的功能或问题领域独立开来,使得系统更加清晰和易于管理。

但在这里,动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护性。

1.2 动静结合架构组成

这里我们使用nginx+Tomcat来实现动静分离,我们先来介绍一下,nginx和Tomcat:

  • Nginx 很少处理动态页面,说起来,她其实是一个基于多路复用模型构建的产品,常用来高性能HTTP和反向代理服务器,在运行的过程汇总占用较低的内存,可以支持更多的并发连接。

  • nginx处理静态资源是tomcat的6倍

  • Tomcat是一个Jsp/Servlet容器服务器,在最新的Tomcat版本中,支持epoll模型,如果要处理动态应用,比如java的动态应用,肯定是首选,但Tomcat处理静态请求能力就比较弱。

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

1.3 动静结合原理

我们使用nginx和Tomcat做动静结合:

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

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

二. nginx+tomcat 实现动静分离

2.1 实验环境

本次实验所用版本介绍:

软件版本
jdk1.8版本
CentOS7.9
nginx1.22.1
tomcat9.0.73

本次实验所用服务器介绍:

 hostname                   ip                  port            作用              安装软件   
 mufeng101               192.168.31.101          80           Nginx服务器       Nginx-1.22.1
 mufeng102               192.168.31.102          8080         Tomcat1服务器
 mufeng103               192.168.31.103          8080         Tomcat2服务器

2.2 所需软件环境

所有要安装tomcat的服务器都需要安装jdk,关闭selinux和防火墙,这里我们用102和103

[root@mufeng bin]# java -version                             #检查java版本                    
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
[root@mufeng101 ~]# systemctl stop firewalld.service           #停止防火墙服务
[root@mufeng101 ~]# systemctl disable firewalld.service        #关闭防火墙服务
[root@mufeng101 ~]# setenforce 0                               #设置selinux模式为不可用
setenforce: SELinux is disabled

关于jdk的安装可参考 csdn【我是沐风晓月】的这篇博文: https://blog.csdn.net/wisdom_futrue/article/details/129126308

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

2.3 nginx服务器的实现

我们把mufeng101服务器作为Ngnix服务器,使用二进制方式安装:

  • 安装依赖包
[root@mufeng101 ~]# cat /etc/redhat-release                                      #检查操作系统版本
CentOS Linux release 7.9.2009 (Core)
[root@mufeng101 ~]# yum -y install zlib pcre pcre-devel openssl openssl-devel    #安装必要组件
  • 创建nginx用户
[root@mufeng101 ~]# useradd -s /sbin/nologin nginx
[root@mufeng101 ~]# id nginx
uid=993(nginx) gid=989(nginx) groups=989(nginx)
  • 上传并解压nginx
[root@mufeng101 ~]# ll nginx-1.22.1.tar.gz 
-rw-r--r-- 1 root root 1073948 Mar  7 13:47 nginx-1.22.1.tar.gz
[root@mufeng101 ~]# tar zxvf nginx-1.22.1.tar.gz                                 #解压nginx
  • 开始编译
[root@mufeng101 ~]# cd nginx-1.22.1
[root@mufeng101 nginx-1.22.1]# ./configure \
> --user=nginx \                                        #指定服务启动用户是nginx
> --group=nginx \                                       #指定服务启动用户组是nginx
> --prefix=/usr/local/nginx \                           #指向nginx安装目录
> --sbin-path=/usr/local/nginx/sbin/nginx \             #指向执行程序文件
> --conf-path=/usr/local/nginx/conf/nginx.conf \        #指定Nginx配置文件路径
> --error-log-path=/user/local/nginx/logs/error.log \   #指定Nginx错误日志文件路径
> --http-log-path=/usr/local/nginx/logs/access.log \    #指定Nginx访问日志文件路径
> --pid-path=/var/run/nginx.pid \                       #设置Nginx的nginx.pid文件路径
> --lock-path=/var/lock/subsys/nginx \                  #设置Nginx的nginx.lock文件路径
> --with-http_stub_status_module \                      #安装用来监控Nginx状态的模块
> --with-http_ssl_module \                              #表示启动Nginx的SSL模块
> --with-http_gzip_static_module \                      #表示启用Nginx的gzip压缩
> --with-pcre                                           #设置Nginx启用正则表达式

[root@mufeng101 nginx-1.22.1]# make && make install              #执行编译安装

代码版便于下次复制:

[root@mufeng101 nginx-1.22.1]#
 ./configure  --user=nginx --group=nginx   --prefix=/usr/local/nginx     --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/user/local/nginx/logs/error.log  --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/var/run/nginx.pid  --lock-path=/var/lock/subsys/nginx  --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module  --with-pcre  
  • 安装后的测试
[root@mufeng101 nginx-1.22.1]# /usr/local/nginx/sbin/nginx -v    #检查nginx版本
nginx version: nginx/1.22.1
[root@mufeng101 nginx-1.22.1]# ln -s /usr/local/nginx/sibn/nginx /usr/local/sbin/nginx     #创建软链接
[root@mufeng101 nginx-1.22.1]# ll /usr/local/sbin/nginx               
lrwxrwxrwx 1 root root 27 Mar  7 14:22 /usr/local/sbin/nginx -> /usr/local/nginx/sibn/nginx
[root@mufeng101 sbin]# /usr/local/nginx/sbin/nginx -t            #检查nginx配置文件合法性          
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  • 配置nginx使用命令启动
[root@mufeng101 ~]# vim /lib/systemd/system/nginx.service        #将nginx添加到系统服务

[Unit]
Description=nginx
After=network.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid                             
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload                  
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
  • 测试命令的使用
[root@mufeng101 sbin]# systemctl daemon-reload         
[root@mufeng101 sbin]# systemctl start nginx.service                  #启动nginx                
[root@mufeng101 sbin]# systemctl enable nginx.service                 #设置nginx开机启动
[root@mufeng101 sbin]# ps -ef|grep nginx                              #检查nginx运行进程         
root      60803      1  0 14:24 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     60804  60803  0 14:24 ?        00:00:00 nginx: worker process
root      60819  50497  0 14:24 pts/0    00:00:00 grep --color=auto nginx

2.4 tomcat的安装

关于tomcat的安装可参考 csdn【我是沐风晓月】的这篇博文: https://blog.csdn.net/wisdom_futrue/article/details/129126308

这里只以mufeng102为例,展示tomcat执行代码过程:


[root@mufeng102 ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz

[root@mufeng102 ~]# ll apache-tomcat-10.1.7.tar.gz 
-rw-r--r--. 1 root root 12143798 37 04:54 apache-tomcat-10.1.7.tar.gz

[root@mufeng102 ~]# tar -zxvf apache-tomcat-9.0.73.tar.gz -C /usr/local    
[root@mufeng102 ~]# ln -s /usr/local/jdk1.8.0_261 /usr/local.jdk

[root@mufeng102 ~]# vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_261
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH


[root@mufeng102 bin]# lsof -i:8080                            #检查8080端口占用情况
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    1601 root   58u  IPv6  35871      0t0  TCP *:webcache (LISTEN)

[root@mufeng102 bin]# ps -ef|grep tomcat                      #检查tomcat服务进程
root       1601      1 18 21:44 pts/0    00:00:02 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root       1634   1565  0 21:44 pts/0    00:00:00 grep --color=auto tomcat

2.5 动静分离的配置

nginx服务器设置静态页面:

  1. 在Ngnix服务器后台创建用于静态页面目录static,并在其中添加静态测试页面:
[root@mufeng101 ~]# mkdir /usr/local/nginx/html/static
[root@mufeng101 ~]# cd /usr/local/nginx/html/static
[root@mufeng101 static]# vim test.html
<html>
<body>
 <h1>这是沐风晓月的页面</h1>
 <img src="mufeng.png"/>
</body>
</html>
[root@mufeng101 static]# ls         #mufeng.png图片通过xshell工具从windows本机上传至static目录
mufeng.png  test.html
  1. 在mufeng102、mufeng103服务器后台分别创建动态目录test,在目录中各自创建一个动态页面:
mkdir /usr/local/tomcat/webapps/test/

[root@mufeng102 ~]# 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@mufeng103 ~]# 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>

设置server.xml ,需要自己添加 Context

[root@mufeng101/103 test]# vim /usr/local/tomcat/conf/server.xml 
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
            <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />

在这里插入图片描述

  1. 配置nginx配置文件

对Nginx服务器参数文件进行配置,这里列出http配置段和server配置段,

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

需要特别注意的是,在location指令中使用正则表达式以后,proxy_pass后面的代理路径不能含有地址链接,也就是不能写成http://192.168.31.101:8080/,或者类似http://192.168.31.101:8080/jsp的形式。

若在location指令不使用正则表达式时,没有这个限制。

[root@mufeng101 ~]# vim /usr/local/nginx/conf/nginx.conf      #编辑nginx主要配置文件

  upstream tomcatserver {                                     #制定负载均衡器名字为tomcatserver
       server 192.168.31.102:8080 weight=1;                   #通过8080提供web服务,配置权重
       server 192.168.31.103:8080 weight=1;                   #通过8081提供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;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location ~ .*\.(jpg|jpeg|png|htm|html|css)$ {              #正则表达式匹配静态文件
    root /usr/share/nginx/static;                              #指定静态文件
    expires 1d;                                                #指定1天的延期时间
    }
}

nginx 配置文件原文:可以直接用

[root@mufeng101 conf]# cat nginx.conf

user  nginx;
worker_processes  1

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
       upstream tomcatserver {
       server 192.168.1.102:8080 weight=1;                   
       server 192.168.1.103:8080 weight=1;                   
  }
    server {
        listen       80;
        server_name  localhost;

        charset 'utf-8';

        #access_log  logs/host.access.log  main;

    location ~* .*\.jsp$ {                           
    proxy_pass    http://tomcatserver;                        
    proxy_redirect off;                              
    proxy_set_header Host $host;                          
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location ~ .*\.(jpg|jpeg|png|htm|html|css)$ {
    root /usr/local/nginx/html/static;                         #指定静态文件
    expires 1d;                                                #指定1天的延期时间
    }
    location / {
            root   html;
            index  index.html index.htm;
        }
      
    }

}


  1. 重启服务进行测试

通过tomcat自带脚本关闭进程并重新启动进程:

[root@mufeng102 bin]# /usr/local/tomcat/bin/shutdown.sh       #停止tomcat进程
[root@mufeng102 bin]# /usr/local/tomcat/bin/startup.sh        #重启tomcat进程

测试一下:

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

以上就实现了nginx+tomcat的动静结合

总结

  • 💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
  • 💕 博客主页:mufeng.blog.csdn.net
  • 💕 本文由沐风晓月原创,首发于CSDN博客
  • 💕 全力以赴,持续学习,不负如来不负卿

在这里插入图片描述