8月11日上课内容 nginx的多实例和动静分离

多实例部署 

在一台服务器上有多个tomcat的服务。

配置多实例之前,看单个实例是否访问正常。

1.安装好 jdk


2.安装 tomcat

cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

3.配置 tomcat 环境变量


vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1

#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2

export CATALINA_HOME1=/usr/local/tomcat/tomcat1

tomcat主目录的路径,包含所有tomcat的文件

export CATALINA BASE1=/usr/local/tomcat/tomcat1
指定tomcat实例目录
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1

tomcat主目录的路径,包含所有tomcat的文件

这三条在环境变量中声明,配置成全局变量,方便后面传参/赋值


source /etc/profile.d/tomcat.sh

进入控制tomcat运行的文件,把服务shutdown一下

基于Tomcat主目录,强行复制一个相同的

vim /etc/profile.d/tomcat.sh


4.修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号


vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">        #22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"        #69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />    
#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010

第一个连接器默认监听8080端口负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器默认监听8009端口,负责和其他的HTTP服务器建立连接
在把Tomcat与其他HTTP服务器集成时,需要用到这个连接器。

第三个连接器
port="8010":指定AJP连接器监听的端口号。在这个示例中,AJP连接器监听在8010端口上。

protocol="AJP/1.3":指定连接器所使用的协议。这里设置为AJP/1.3,表示使用AJP协议的版本1.3。

redirectPort="8443":指定重定向端口。当AJP连接器接收到HTTP请求时,如果请求是通过HTTPS(加密)访问的,
则会将请求重定向到8443端口。

AJP连接器用于将静态资源和动态请求从前端Web服务器(如Apache HTTP Server)转发到Tomcat服务器。
这样可以将Tomcat服务器隐藏在防火墙之后,提高安全性,同时提供更高的性能,特别是在处理动态请求时。
常见的AJP连接器配置是为了将Tomcat与Apache HTTP Server或Nginx等前端服务器集成,以实现负载均衡、反向代理等功能

引入一个很好用的功能,是第三方的,需要安装

telnet 测试服务器ip地址是否能正常通信和测试端口通信是否正常(工作当中用得到,面试会问)

通过什么方式检测出来80端口不通?telnet一测就知道

例:telnet 192.168.233.61 80

 

为什么能ping通却不能访问?因为服务器是基于端口通信的,所以也要检查端口

端口可能不存在 端口没有打开

telnet 192.168.233.61 80试试

出现Escape character is 就表示通信正常,已经建立了通信

去tomcat2,改tomcat2的端口,因为tomcat1已经占用8009,8080等端口。复制过来的tomcat2端口一样,所以得改

改之前先把配置文件复制一下。注:改主文件,备份文件只是预防你改错了好还原回去

把shutdown端口改为8006

 http通信端口8080也改为8081

和web服务器通信的端口8009改为8010

注:端口可以改为任意的数字,只要端口不被占用都可以,但是端口有范围65535以内

5.修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量

vim /usr/local/tomcat/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat2/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2


vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
步骤详解:

修改启动文件

先改tomcat1的

vim startup.sh

在尾行添加上一步设置的全局变量

export CATALINA_BASE=$CATALINA_BASE1

export CATALINA_HOME=$CATALINA_HOME1

export TOMCAT_HOME=_TOMCAT_HOME1

vim shutdown.sh

配置这两个的目的就是为了做系统服务控制,让他能够识别到我启动是谁,关的是谁

配置完tomcat1的接着配置一下tomcat2的

同样的在最后一行,把tomcat2的添加一下

vim startup.sh 同样配置一下startup

这样1和2的多实例就都配置好了

启动一下服务

6.浏览器访问测试


http://192.168.233.71:8080
http://192.168.233.71:8081

看一下页面是否能正常访问。都是基于71这台服务器,分别看一下8080和8081端口

nginx+tomcat实现动静分离

静:静态页面
动: 动态页面
分别可以对静态页面和动态页面发起不同的请求,会有不同的响应结果。


nginx反向代理------负载均衡------tomcat是后端服务器------web静态nginx------静态请求----->nginx

------动态页面------tomcat

tomcat并发量能力弱,只有nginx的六分之一,所以要有负载均衡进行合理的调用分配。

示例图:

开始正式操作

准备好了4台服务器

test1 192.168.233.10 作为客户端

nginx1 61 作为web服务器

tomcat 71 多实例

tomcat 72 单独后端web服务器,用来处理动态请求

先配置nginx1
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
    #gzip on;
    
    #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
    upstream tomcat_server {
        server 192.168.233.71:8080 weight=1;
        server 192.168.233.71:8081 weight=1;
    }
    
    server {
        listen 80;
        server_name localhost;
    
        charset utf-8;
    
        #access_log logs/host.access.log main;
        
        #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
        location ~ .*\.jsp$ {
            proxy_pass http://tomcat_server;
           #设置后端的Web服务器可以获取远程客户端的真实IP
           #设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,机器就被封了。
            proxy_set_header HOST $host;
           #把$remote_addr赋值给X-Real-IP,来获取源IP
            proxy_set_header X-Real-IP $remote_addr;
           #在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
          #配置Nginx处理静态图片请求
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root /usr/local/nginx/html;
            expires 10d;
        }
        
        location / {
            root html;
            index index.html index.htm;
        }
......
    }
......
}

location ~ .*\.jsp$ {
            proxy_pass http://tomcat_server;
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

备份配置文件

编辑配置文件 vim nginx.conf

在http模块当中配置

写上后端要调用的服务器,配置权重,多实例权重分配小一点,单实例权重稍高一点,让其访问量偏大一点

server里面配置处理动态请求的location

检查语法,没有问题,nginx配置完成

配置tomcat1 实例1

动态页面

建立一个动态页面访问内容,访问后端服务器,就会访问到这个页面

配置多实例中的tomcat2

 

再回到tomcat1

把默认配置的host删除掉

再去tomcat2,一样把server.vml配置一下

多实例tomcat配置完成,去验证一下单实例服务是否正常

正常,开始配置

单实例,只需部署一下访问页面即可

vim index.jsp配置

vim server.xml 一样把原来的host删除,再添加一个Host

注意路径指向要一直,否则获取不到index文件

从tomcat1开始,重启服务

tomcat2

看看是否能够访问到服务

因为路径错误,所以访问不到

/usr/local/tomcat/tomcat2不存在,改为/usr/local/tomcat2

改tomcat1的server文件 

 重启

 这样就可以了

把静态页面请求也配置一下

 

把图片拖进来

请求一下静态页面

请求一下动态页面:

这样就完成了动静分离

综合:

四层转发流量+七层后端代理+动静分离

架构如图:

四层转发流量+七层后端代理
环境:
192.168.233.61 nginx四层代理
192.168.233.62 nginx七层代理
192.168.233.63 nginx七层代理
192.168.233.71 tomcat1多实例
192.168.233.72 tomcat2单实例

systemctl stop firewalld
setenforce 0

192.1682.233.61 nginx四层代理:
vim /usr/local/nginx/conf/nginx.conf

pid /usr/local/nginx/run/nginx.pid;


events {
    worker_connections  1024;
}

stream {
   upstream test {
       server 192.168.233.62:80;
       server 192.168.233.63:80;


  }
  server {

       listen 8080;
       proxy_pass test;
 }

}

nginx七层代理62和63:
    upstream ky30 {
       server 192.168.233.71:8080 weight=1;
       server 192.168.233.71:8081 weight=1;
       server 192.168.233.72:8080 weight=1;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        location ~ .*\.jsp$ {
           proxy_pass http://ky30; #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
           
           proxy_set_header HOST $host; #设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),
           默认HOST的值为proxy_pass指令设置的主机名。
           
           proxy_set_header X-Real-IP $remote_addr;  #把$remote_addr赋值给X-Real-IP,来获取源IP
           
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
           #在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
           
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root /usr/local/nginx/html;
            expires 10d;
        }
配置相同

192.168.233.71 tomcat1多实例:

cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

#配置多实例tomcat
vim /etc/profile.d/tomcat.sh
#tomcat1的全局变量设置
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
 
#tomcat2的全局变量设置
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
 
#加载设置好的全局变量
source /etc/profile.d/tomcat.sh

修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">        #22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"        #69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />    #116行,修改Connector port AJP/1.3,
默认为8009 -> 修改为8010

修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1


vim /usr/local/tomcat/tomcat2/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2


vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

配置tomcat01的测试页面

 
mkdir /usr/local/tomcat/tomcat1/webapps/test 
 
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>tomcat01</title>   
</head>
<body>
<% out.println("tomcat01 running");%>
</body>
</html>

更进一步完整架构后面再说

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

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

相关文章

Linux系统管理:虚拟机ESXi安装

目录 一、理论 1.VMware Workstation 2.VMware vSphere Client 3.ESXi 二、实验 1.ESXi 7安装 一、理论 1.VMware Workstation 它是一款专业的虚拟机软件&#xff0c;可以在一台物理机上运行多个操作系统&#xff0c;支持Windows、Linux等操作系统&#xff0c;可以模拟…

使用selenium如何实现自动登录

回顾使用requests如何实现自动登录一文中&#xff0c;提到好多网站在我们登录过后&#xff0c;在之后的某段时间内访问该网页时&#xff0c;不会给出请登录的提示&#xff0c;时间到期后就会提示请登录&#xff01;这样在使用爬虫访问网页时还要登录&#xff0c;打乱我们的节奏…

item_get_sales-获取商品销量详情

一、接口参数说明&#xff1a; item_get_sales-获取商品销量详情&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_sales 名称类型必须描述keyString是调用key&#xff08…

ACM模式刷Leetcode题目

139题单词拆分 链接: link #include<iostream> #include<sstream> #include<string> #include<vector> #include<algorithm> #include<unordered_set> using namespace std;int main() {// 实现输入第一行为s字符串。// 第二行为wordDic…

【代码随想录day22】爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…

Spring的三种异常处理方式

1.SpringMVC 异常的处理流程 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们 try-cache 进行捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不 可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC 中&#xff0c;不管是编译异常还是运行…

java:JDBC

文章目录 什么是JDBCJDBC使用步骤详解各个对象DriverManagerConnectionStatementResultSetPreparedStatement JDBC控制事务操作步骤示例 什么是JDBC 我们知道&#xff0c;数据库有很多种&#xff0c;比如 mysql&#xff0c;Oracle&#xff0c;DB2等等&#xff0c;如果每一种数…

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】

wpf iconfont 外部图标引入&#xff0c;无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式&#xff0c;注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"&#xe7ae;…

不重启Docker能添加自签SSL证书镜像仓库吗?

应用背景 在企业应用Docker规划初期配置非安全镜像仓库时&#xff0c;有时会遗漏一些仓库没配置&#xff0c;但此时应用程序已经在Docker平台上部署起来了&#xff0c;体量越大就越不会让人去直接重启Docker。 那么&#xff0c;不重启Docker能添加自签SSL证书镜像仓库吗&…

经典人体模型SMPL介绍(一)

SMPL是马普所提出的经典人体模型&#xff0c;目前已成为姿态估计、人体重建等领域必不可少的基础先验。SMPL基于蒙皮和BlendShape实现&#xff0c;从数千个三维人体扫描结果得来&#xff0c;后通过PCA统计学习得来。 论文&#xff1a;SMPL: A Skinned Multi-Person Linear Mode…

Python读取svn版本

本文将详细介绍如何使用Python读取svn版本。 一、安装svn库 首先&#xff0c;我们需要使用Python来连接svn服务器&#xff0c;并获取版本号。这里我们使用pysvn库来完成这个工作。 pip install pysvn需要注意的是&#xff0c;如果你需要安装特定版本的pysvn&#xff0c;你可…

2023连锁收银系统该如何选?值得推荐的5款连锁收银系统

现在不管是连锁店还是零售店&#xff0c;只要是开店做生意赚钱的&#xff0c;都少不了要和钱打交道&#xff0c;尤其是对连锁店来说&#xff0c;收银工作更是重中之重。 连锁店涉及的门店较多&#xff0c;必须要有一套足够优秀的连锁收银系统&#xff0c;才能做好每个门店的收银…

【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 详细介绍】

文章目录 什么是GCC内建函数?GCC 常见内建函数GCC内建函数使用示例上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 什么是GCC内建函数? GCC提供了一些专门的功能,用于…

使用 `tailwindcss-patch@2` 来提取你的类名吧

使用 tailwindcss-patch2 来提取你的类名吧 使用 tailwindcss-patch2 来提取你的类名吧 安装使用方式 命令行 Cli 开始提取吧 Nodejs API 的方式来使用 配置 初始化 What’s next? tailwindcss-patch 是一个 tailwindcss 生态的扩展项目。也是 tailwindcss-mangle 项目重要…

redis的Key的过期策略是如何实现的?

Key的过期策略 一个redis中可能同时存在很多很多key&#xff0c;这些key可能有很大一部分都有过期时间&#xff0c;此时&#xff0c;redis服务器咋知道哪些key已经过期要被删除&#xff0c;哪些key还没有过期&#xff1f; 如果直接遍历所有的key&#xff0c;显然是行不通的&am…

Abandon_Ubuntu Declaration

鉴于以下几个原因&#xff0c;持续到明年考研结束&#xff0c;我将不再捣鼓ubuntu和任何linux系统&#xff0c; 原因如下&#xff1a; ubuntu23.04不支持wps编辑pdf这个核心功能&#xff0c;且开机向canonial公司发送远程遥测&#xff0c;暂时不会用iptables禁用&#xff0c;故…

第几天(day)

庐阳区2021年信息学竞赛试题 题目描述 Description 给定一个日期&#xff0c;求这一天是当年的第几天。每年的元旦&#xff0c;1月1日&#xff0c;都是每年的第一天&#xff0c;但是每年的最后一天&#xff0c;12月31日&#xff0c;有可能是第365天&#xff0c;也有可能是第3…

2023年上半年网络工程师上午真题及答案解析

1.固态硬盘的存储介质是( )。 A.光盘 B.闪存 C.软盘 D.磁盘 2.虚拟存储技术把( )有机地结合起来使用&#xff0c;从而得到一个更大容量的“内存”。 A.内存与外存 B.Cache与内存 C.寄存器与Cache D.Cache与外存 3.下列接口协议中&…

关于安卓高版本gradle(7.0+)引入aar包报错问题

背景 项目开发过程中&#xff0c;接入三方sdk&#xff0c;引入了本地aar包依赖&#xff0c;as rebuild项目的过程中&#xff0c;报错&#xff0c;提示依赖找不到问题。 报错&#xff1a;“bundleDebugAar FAILED”等 开发环境 win10 jdk11 gradle 7.5 原因 由于gradle的版…

找不到msvcp140.dll无法继续执行代码怎么解决?分享三个解决方法

当你在运行某个程序或游戏时遇到msvcp140.dll缺失的错误提示&#xff0c;你可能会感到困惑和烦恼。在修复msvcp140.dll的过程中&#xff0c;我遇到了一些挑战&#xff0c;但最终成功解决了这个问题。以下是我总结的三个解决方法&#xff0c;希望能帮助你解决这个问题。 找不到m…