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

news2024/11/18 19:32:50

前言

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

在这里插入图片描述

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

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

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

文章目录

  • 前言
  • 一、动静分离架构和原理
    • 1.1 什么是动静分离?
    • 1.2 动静结合架构组成
    • 1.3 动静结合原理
    • 二. nginx+tomcat 实现动静分离
    • 2.1 实验环境
    • 2.2 所需软件环境
    • 2.3 nginx服务器的实现
    • 2.4 tomcat的安装
    • 2.5 动静分离的配置
  • 总结

请添加图片描述

一、动静分离架构和原理

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


```bash
[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 \
> --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]# make && make install              #执行编译安装
  • 安装后的测试
[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 动静分离的配置

  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服务器后台创建动态目录test,在目录中创建一个动态页面:
[root@mufeng102 ~]# 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("动态页面1,http://www.test1.com");%>
</body>
</html>
  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.120:8080 weight=1;                   #通过8080提供web服务,配置权重
       server 192.168.31.130:8081 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天的延期时间
    }
}
  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.110/test.html,发现静态页面已经由Nginx服务器提供静态解析并反馈浏览器显示如下:

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

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

总结

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/398248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【专项训练】泛型递归、树的递归

递归和循环没有明显的边界! 不要进行人肉递归! 找最近重复子问题,直接写递归! 数学归纳法思维:1,2,…… 70. 爬楼梯 https://leetcode.cn/problems/climbing-stairs/ 互斥,且加在一起是全部答案! 动态规划法:用数组做递推,就是动态规划!!! class Solution

k8s-Kubernetes--pod管理-基本操作

文章目录前言一、简介一些简单的入门小命令二、pod基本操作1.pod创建2.pod删除&#xff0c;查看日志三、service和deployment(控制器)1.deployment基本操作2.Pod扩容与缩容3.expose暴露端口3.1ClusterIP默认类型暴露端口3.2 NodePort类型暴露端口4.升级pod镜像/应用版本5.回滚6…

萤火虫算法优化SVM变压器故障分类预测,fa-svm分类预测,libsvm参数优化

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于fa-svm分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是…

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

一、背景 很久没有启动过Android studio了,今天突然需要,却打不开了,报错如下,因此记录下我的解决办法,希望能帮到更多朋友! 二、过程 刚开始以为时java的环境变量问题,配置好java环境变量依然不行,所以大家不必折腾了。 后面经过一片博文的启发,https://blog.csdn.ne…

信息系统分析与设计——信息、管理与信息系统

&#x1f31f;所属专栏&#xff1a;信息系统分析与设计&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新信息系统分析与设计课程的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&…

SpringBoot学习笔记(四)Web开发

在之前我们的项目都是以jar包结尾的&#xff0c;没有放webapp的地方。springboot最大的特点&#xff1a;自动装配&#xff0c;创建应用&#xff0c;选择模块导入starter&#xff0c;只需要专注于业务代码springboot到底帮我们配置了什么&#xff0c;我们能不能修改&#xff1f;…

【微信小程序】-- 案例 - 本地生活(列表页面)(三十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

什么是图神经网络?

什么是图神经网络&#xff1f; GNN 将深度学习的预测能力应用于丰富的数据结构&#xff0c;这些数据结构将对象及其关系描述为图中由线连接的点。 当两种技术融合时&#xff0c;它们可以创造出新奇而美妙的东西——比如手机和浏览器融合在一起打造智能手机。 如今&#xff0…

Java使用Springboot+Mybatis构建第一个项目

一、java安装&#xff1a;安装 Java1.8环境 maven3.6.1环境 Gradle-6.9.1环境 IntelliJ IDEA 2022.1.3 下载旗舰版&#xff08;因为包含springboot&#xff09;二、项目构建-数据库是sqlserver&#xff1a;1、打开idea&#xff0c;点击File->New->Project&#xff0c;选中…

华为OD机试题,用 Java 解【英文输入法】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

输入两个数,可以进行加减乘除的操作。

完整代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…

博客系统 -- 静态页面

文章目录1. 前言2. 页面展示3. 实现3.1 博客列表页3.2 博客详情页3.3 登录页面3.4 博客编辑页4. 整体代码1. 前言 到此 我们对 HTML &#xff0c; CSS &#xff0c; JavaScript 已经有了个简单的了解 &#xff0c; 但是还不太熟悉 &#xff0c;下面就通过 写一个博客系统的 网站…

易优cms load 加载资源文件标签使用方法

【基础用法】 标签&#xff1a;load 描述&#xff1a;资源文件加载&#xff0c;比如&#xff1a;css/js 用法&#xff1a; {eyou:load href/static/js/common.js veron /} 属性&#xff1a; file 资源文件路径 href 远程资源文件URL ver 开启版本号自动刷新浏览器缓存 …

知著见微——读《战略与路径》

前几天刚读完《战略与路径&#xff1a;黄奇帆的十二堂经济课》&#xff0c;这本书是根据2020-2021年期间黄奇帆先生在复旦大学讲的12堂课编辑成书。放在前几年我是基本不怎么看这种讲宏观经济类的书&#xff0c;但近几年宏观的变化正以前所未有的方式展开&#xff0c;切切实实影…

让AI帮你工作(2)-如何阅读pdf论文

这个系列快结束了&#xff0c;后面会有一到两篇文章介绍&#xff0c;如何用AI实实在在的应用在工业生产研发&#xff0c;如何指导化工分子合成&#xff0c;如何做DNA的研究预测&#xff0c;合成。背景最近chatpdf在各媒体传的风风火火&#xff0c;从效果上是很震撼的。原因大概…

Linux内核Thermal框架详解一、总述

本文部分内容参考万字长文 | Thermal框架源码剖析&#xff0c;特此致谢&#xff01; Linux Thermal Framework是Linux系统下温度控制相关的一套架构&#xff0c;主要用来解决随着设备性能不断增强而引起的日益严重的发热问题&#xff0c;控制系统运行过程中各个器件所产生的热量…

【web前端开发】CSS最常用的11种选择器

文章目录1.CSS介绍2.CSS的语言规则3.CSS的引入方式4.选择器标签选择器类选择器id选择器通配符选择器复合选择器后代选择器子代选择器并集选择器交集选择器伪类选择器hover伪类选择器active伪类选择器结构伪类选择器结语1.CSS介绍 CSS (Cascading Style Sheets&#xff0c;层叠样…

分布式架构-流量治理-服务容错

系列目录 分布式架构-流量治理-服务容错 分布式架构-流量治理-流量控制 引子 容错性设计(Design for Failure)是微服务的一个核心原则。随着拆分出的服务越来越多&#xff0c;随之而来会面临以下两个问题的困扰&#xff1a; 由于某一个服务的崩溃&#xff0c;导致所有用到这个服…

MyBatis的基本使用

MyBatis 为啥MyBatis会使用xml 在一个程序中&#xff0c;若需要操作数据表&#xff0c;那么 SQL 语句有两种存放方式&#xff1a;1. 放到 Java 类里面&#xff08;这个就存在大量的字符串拼接&#xff0c;还有占位符需要处理-----JDBC&#xff09;&#xff1b;2&#xff1a;放…

TypeScript深度剖析: TypeScript 装饰器的理解?应用场景?

面试官&#xff1a;说说你对 TypeScript 装饰器的理解&#xff1f;应用场景&#xff1f; 一、是什么 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c; 访问符&#xff0c;属性或参数上 是一种在不改变原类和使用继承的情况下&#…