高性能群集部署技术-Nginx+Tomcat负载均衡群集

目录

#1.1案例概述

  1.1.1案例前置知识点

  1.1.2案例环境

#2.1案例实施

  2.1.1实施准备

  2.1.2查看JDK是否安装

  2.1.3安装配置Tomcat

  2.1.4Tomcat主配置文件说明

  2.1.5建立Java的Web站点

#3.1Nginx+Tomcat负载均衡,动静分离群集的实验案例

  3.1.1案例概述

  3.1.2案例环境

  3.1.3案例实施

  3.1.4Nginx服务器配置

  3.1.5测试效果


1.1案例概述

   目前,IBM 的 WebSphere 及 Oracle 的 WebLogic 占据了市面上 Java 语言 Web 站点的大部分份额。这两种软件以其无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司的 Web 场景中,但是其高昂的价格也使得小型互联网公司对此望而却步。

   Tomcat 自 5.x 版本以来,其性能上已经得到了大幅的提升,再加上其开放性的框架和可二次开发等特性,已经完全可以用在访问量不是很大的生产环境下。目前,大多数用于 JSP 技术开发的电子商务网站基本应用了 Tomcat,而且 Tomcat 的 Servlet 和 JSP 这两种 API 也完全可以适用于 V3 版移联建站管理系统。

1.1.1案例前置知识点

(1)Tomcat 简介
     名称由来:Tomcat 最初是由 Sun 的软件构架师詹姆斯・邓肯・戴维森开发的。后来他帮助将其变为开源项目,并由 Sun 贡献给 Apache 软件基金会。由于大部分开源项目 O’Reilly 都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名,因为他希望这种动物能够自己照顾自己,最终,他将其命名为 Tomcat(公猫)。而 O’Reilly 出版的介绍 Tomcat 的书籍的封面也被设计成了一个公猫的形象。而 Tomcat 的 Logo 兼吉祥物也被设计成了一只公猫。
    其实 Tomcat 在开始研发的时候并不叫这个名字,早期 Tomcat 项目的名字叫 Catalina,所以当我们安装完 Tomcat 后会发现安装路径下面有很多和 Catalina 有关的目录和文件,而这些文件通常也是我们使用或者配置 Tomcat 的重要文件。

(2)应用场景
    Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端,如图 5.1 所示。

1.1.2案例环境

主机IP 地址操作系统应用
Tomcat 服务器OpenEuler24192.168.10.101apache-tomcat-9.0.8

2.1案例实施

2.1.1实施准备

(1)关闭防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

 (2)在安装Tomcat之前必须安装JDK

     JDK 的全称是 Java Development Kit,是 Sun 公司免费提供的 Java 语言的软件开发工具包,其中包含 Java 虚拟机(JVM)。编写好的 Java 源程序经过编译可形成 Java 字节码,只要安装了 JDK,就可以利用 JVM 解释这些字节码文件,从而保证了 Java 的跨平台性。

     在平台兼容性方面,JDK 作为解释字节码文件并据此调用操作系统 API 实现对应功 Java 虚拟机,与操作系统类型和平台位数密切相关,因此存在不同类型的版本,而 Tomcat 也具有上述特征,默认情况下 JDK 已经安装,所以需要预先下载 Tomcat,本章中所使用的 Tomcat 软件的源码包为 apache-tomcat-9.0.8.tar.gz。

2.1.2查看JDK是否安装

[root@localhost tomcat9]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

2.1.3安装配置Tomcat

(1)Tomcat的安装和配置

[root@localhost ~]# tar xf apache-tomcat-9.0.8.tar.gz

(2)解压并移动到/usr/local下

[root@localhost ~]# mv apache-tomcat-9.0.8/ /usr/local/tomcat9

(3)启动tomcat

[root@localhost tomcat9]# /usr/local/tomcat9/bin/startup.sh
Using CATALINA_BASE:  /usr/local/tomcat9
Using CATALINA_HOME:  /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME:       /usr
Using                 CLASSPATH: /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Tomcat started.

Tomcat默认运行在8080端口

[root@localhost ~]# netstat -anpt | grep 8080
tcp6  0  0 ::8080 :::*  LISTEN  2809/java

(4)打开浏览器验证

2.1.4Tomcat主配置文件说明

xml
<?xml version="1.0" encoding="UTF-8"?>
......                             //省略部分内容
<Server port="8005" shutdown="SHUTDOWN">
// Tomcat 关闭端口,默认只对本机地址开放,可以在本机通过 telnet 127.0.0.1 8005
访问
// 对 Tomcat 进行关闭操作
......                             //省略部分内容
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
//Tomcat 启动的默认端口号 8080,可以根据需要进行更改......                             //省略部分内容<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
//Tomcat 启动 AJP 1.3 连接器时默认的端口号,可以根据需要进行更改
......                             //省略部分内容
//以下为 Tomcat 定义虚拟主机时的配置及日志配置
<Host   name="localhost"    appBase="webapps"    unpackWARs="true"
autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" /> -->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory =
"logs"prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t &quot ;%r&quot ; %s %b" /></Host>
</Engine>
</Service>
</Server>

 2.1.5建立Java的Web站点

(1)在根目录下建立一个web目录,并在里面建立一个webapp1目录,用于存放网站文件。

[root@localhost ~]# mkdir -pv /web/webapp1
mkdir: created directory "/web"
mkdir: created directory "/web/webapp1"

 (2)在webapp1目录下建立一个index.jsp的测试页面。

[root@localhost ~]# vim /web/webapp1/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>
<body>
<div>静态页面的图片 1</div><br><img src="logo.jpg">
</body></html>

 (3)修改Tomcat的server.xml文件。

plaintext
[root@localhost ~]# vim /usr/local/tomcat9/conf/server.xml
......省略部分内容
<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs" prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><Context docBase="/web/webapp1" path="" reloadable="false" ></Context>
</Host>
//docBase: web 应用的文档基准目录
//reloadable:  设置监视"类"是否变化
//path=""  设置默认"类"......省略部分内容

(4)关闭Tomcat,再重新启动。

[root@localhost ~]# /usr/local/tomcat9/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat9/bin/startup.sh

 (5)确认Web站点

3.1Nginx+Tomcat负载均衡,动静分离群集的实验案例

3.1.1案例概述

   通常情况下,一台 Tomcat 站点由于可能出现单点故障及无法应付过多客户复杂多样的请求等问题,不能单独应用于生产环境下,所以需要一套更可靠的解决方案来完善 Web 站点架构。

   Nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 50000 个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存、CPU 等系统资源消耗非常低。目前很多大型网站都应用 Nginx 服务器作为后端网站程序的反向代理及负载均衡器,来提升整个站点的负载并发能力。

   Nginx 是一个非常强大的静态 web 服务,Tomcat 处理动态请求效率不高,而一般网站大多数的内容都是静态文件(如图片、html、css、js 等),经过 Nginx 前端的反向代理加速和过滤,后端 Tomcat 处理请求的压力便可大大减少,只需负责处理动态内容就可以了。在性能与稳定性的权衡下,使用 Nginx+Tomcat 搭配便可让它们在各自擅长的领域大展拳脚。

    本案例介绍以 Nginx 作为负载均衡器、静态页面处理,Tomcat 作为应用服务器的负载群集、动态页面处理的设置方法。网站拓扑架构如图 5.4 所示。

3.1.2案例环境

主机IP 地址操作系统应用
Tomcat1 服务器OpenEuler24192.168.10.101apache-tomcat-9.0.8
Tomcat2 服务器OpenEuler24192.168.10.102apache-tomcat-9.0.8
Nginx 服务器OpenEuler24192.168.10.103nginx-1.26.3

 3.1.3案例实施

1.Tomcat2 server配置

      Tomcat2 server 配置方法基本同 Tomcat1,其中包括:
    (1)关闭防火墙。
    (2)确认是否安装 JDK,JAVA 版本与 Tomcat1 server 保持一致。
   (3)安装配置 Tomcat,版本与 Tomcat1 server 保持一致。
   (4)创建 /web/webapp1 目录,修改 Tomcat 配置文件 server.xml,将网站文件目录更改到 /web/webapp1 / 路径下。
   (5)在 /web/webapp1 / 路径下建立 index.jsp,为了区别将测试页面 index.jsp 的内容更改如下。

[root@localhost ~]# vim /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html>
<head>
<title>JSP test2 page</title> </head>
<body>
<% out.println("动态页面 2,http://www.test2.com") ;%> </body>
<body>
<div>动态页面的图片 2</div><br><img src="logo.jpg">
</body>
</html>

3.1.4Nginx服务器配置

   在 Nginx 服务器 192.168.10.103 上安装 Nginx,反向代理到两个 Tomcat 站点,并实现负载均衡。
(1)关闭防火墙。

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

(2)安装相关软件包。

[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker

(3)解压并安装 Nginx。

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
[root@nodel ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar zxf nginx-1.26.3.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-pcre
[root@localhost nginx-1.26.3]# make && make install

(4)配置 nginx.conf。
     配置命令如下:

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

   在 http {…} 中加入以下代码,设定负载均衡的服务器列表,weight 参数表示权重,权重越高,被分配到的概率越大。为了使测试效果比较明显,我们把权重设置为一样。

upstream tomcat_server {
server 192.168.10.101:8080 weight=1;
server 192.168.10.102:8080 weight=1;
}

下面是编辑 Nginx 静态页面文件。

[root@nginx conf]# vim /usr/local/nginx/html/index.html
server {
listen 80;
server_name localhost;
#charset koi8-r; 把 #号去掉,utf-8
#access_log logs/host.access.log main;
location ~ .jsp{ proxy_set_header Hosthost; 
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tomcat_server;
}
location ~ .(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 30d;
}
location / {
root html;
index index.html index.htm;
}
…… // 省略部分内容
…… // 省略部分内容
}

下面在 Nginx 上准备静态图片。

[root@nginx ~]# mkdir /usr/local/nginx/html/img // 创建静态文件目录
[root@nginx ~]# cp /root/logo.jpg/usr/local/nginx/html/img

测试 Nginx 配置文件是否正确。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
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@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

查看 Nginx 服务进程。

root@localhost ~]# ps aux | grep nginx
root 5279 0.0 0.0 9836 2264 ? Ss 09:00 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 5280 0.0 0.0 11568 4052 ? S 09:00 0:00 nginx: worker process
root 5315 0.0 0.1 21988 7852 pts/0 S+ 09:03 0:00 grep --color=auto nginx

nginx 查看端口号及 PID 进程号。

[root@localhost ~]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13304/nginx: master

3.1.5测试结果   

      打开浏览器访问 http://192.168.10.103/index.jsp。不断刷新浏览器测试,可以看到由于权重相同,页面会反复在以下两个页面来回切换。第一次访问,出现 test1 的测试页面,并且能正常加载 nginx 上的静态页面图片,如图 5.6 所示。刷新后,第二次访问,出现 test2 的测试页面,如图 5.7 所示。

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

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

相关文章

《Go语言圣经》函数值、匿名函数递归与可变参数

《Go语言圣经》函数值、匿名函数递归与可变参数 函数值&#xff08;Function Values&#xff09; 在 Go 语言中&#xff0c;函数被视为第一类值&#xff08;first-class values&#xff09;&#xff0c;这意味着它们可以像其他值一样被操作&#xff1a;拥有类型、赋值给变量、…

vtk和opencv和opengl直接的区别是什么?

简介 VTK、OpenCV 和 OpenGL 是三个在计算机图形学、图像处理和可视化领域广泛使用的工具库&#xff0c;但它们在功能、应用场景和底层技术上存在显著差异。以下是它们的核心区别和特点对比&#xff1a; 1. 核心功能与定位 工具核心功能主要应用领域VTK (Visualization Toolk…

最新豆包大模型发布!火山引擎推出Agent开发新范式

Datawhale大会 2025火山引擎 Force 原动力大会 6月11日-12日&#xff0c;北京国家会议中心人山人海&#xff0c;2025 火山引擎 Force 原动力大会如约而至。 作为开发者社区的一员&#xff0c;这场大会上的一系列新发布让我们感受到了&#xff1a;这个 Agent 技术落地元年的关键…

RFC4291-IPv6地址架构解说

RFC 4291 是由互联网工程任务组&#xff08;IETF&#xff09;发布的关于 IPv6 地址架构 的标准文档。 该文档详细定义了 IPv6 地址的格式、类型、表示方法以及分配方式。 以下是对 RFC 4291 中 IPv6 地址架构的全面解析&#xff0c;包括地址格式、类型、表示方法、特殊地址以…

简单对比 **HTTP**、**MQTT** 和 **CoAP** 这三种通信协议

对比 HTTP、MQTT 和 CoAP 这三种通信协议&#xff0c;从 消息结构、资源占用、安全性 等方面进行全面分析。 &#x1f310; HTTP vs MQTT vs CoAP 对比 特性HTTPMQTTCoAP协议层级应用层基于 TCP应用层基于 TCP / WebSocket应用层基于 UDP (也支持 TCP)消息模式请求/响应 (客户…

【Dify 案例】【自然语言转SQL案例】【五】【实战二】【财务管理查询商品信息数据】

援引实战一,进行数据业务处理化 1.开始 2.自然语言转SQL的工具 3.参数提取器 4.SQL查询

FPGA基础 -- Verilog语言要素之标识符

一、什么是标识符&#xff08;Identifier&#xff09; 在 Verilog 中&#xff0c;标识符是用户定义的名字&#xff0c;用于标识模块、变量、端口、函数、任务、参数、宏定义等各种语言要素。 就像 C 语言的变量名、函数名一样&#xff0c;Verilog 中的标识符为 HDL 代码提供了…

Tomcat双击startup.bat闪退的解决方法

首先需要确认java环境是否配置正确&#xff0c;jdk是否安装正确 winR打开cmd&#xff0c;输入该命令 java -version 出现对应的版本就说明jdk配置正确 如果没有&#xff0c;则参考jdk的安装及配置 如果以上都没有问题&#xff0c;就继续排查 确认Tomcat的环境变量配置 概…

计算机基础(三):深入解析Java中的原码、反码、补码

计算机基础系列文章 计算机基础(一)&#xff1a;ASCll、GB2312、GBK、Unicode、UTF-32、UTF-16、UTF-8深度解析 计算机基础(二)&#xff1a;轻松理解二进制、八进制、十进制和十六进制 计算机基础(三)&#xff1a;深入解析Java中的原码、反码、补码 目录 引言一、 基础概念&…

phpstudy无法启动mysql,一启动就关闭,完美解决

phpstudy无法启动mysql&#xff0c;一启动就关闭&#xff0c;完美解决 phpstudy的mysql无法启动&#xff0c;一启动就关闭如何解决。 问题出现的原因&#xff1a;phpstudy自带的mysql&#xff0c;可能与之前单独安装的mysql发生冲突。(之前安装的mysql已经占用3306端口) 解决方…

mysql中的<>和!=

在MySQL中&#xff0c;<> 运算符表示 不等于。它与 ! 运算符功能完全相同&#xff0c;都是用于比较两个表达式是否不相等。 SELECT * FROM table_name WHERE column_name <> value;当 column_name 的值不等于 value 时&#xff0c;返回该行当值相等或为 NULL 时&a…

C#学习日记

命名空间 知识点一 命名空间基本概念 概念 命名空间是用来组织和重用代码的 作用 就像是一个工具包&#xff0c;类就像是一件一件的工具&#xff0c;都是申明在命名空间中的 知识点二 命名空间的使用 基本语法 namespace 命名空间名 {类类 } namespace MyGame {class GameO…

第八十二篇 大数据开发基础:树形数据结构深度解析与实战指南(附创新生活案例)

目录 一、树的本质&#xff1a;层次化数据组织二、生活中的树形智慧&#xff1a;无处不在的层次案例1&#xff1a;图书馆图书分类系统案例2&#xff1a;电商平台商品类目树案例3&#xff1a;城市行政区域划分 三、大数据中的核心树结构1. B树&#xff1a;数据库索引的脊梁2. 决…

从0开始学计算机视觉--Day1--计算机视觉的起源

我们经常能听到计算机视觉这个词语&#xff0c;像数字图像处理&#xff0c;算法设计&#xff0c;深度学习等领域。但很少有人会先去了解清楚这门知识&#xff0c;而是用到什么再学什么&#xff0c;虽然这在项目进度上能节省不少时间&#xff0c;但有时候囫囵吞枣式地学习容易落…

简单的 ​Flask​ 后端应用

from flask import Flask, request, jsonify, session import os app Flask(__name__) app.secret_key os.urandom(24) users { 123: admin, admin: admin } # 登录接口 app.route(/login, methods[POST]) def login(): data request.get_json() username data.get(usern…

spring-webmvc @PathVariable 典型用法

典型用法 基础用法 GetMapping("/users/{id}") public String getUser(PathVariable Long id) {return "User ID: " id; } 请求&#xff1a;/users/1001 输出&#xff1a;User ID: 1001---- GetMapping("/users/{userId}/orders/{orderId}") …

LVS+Keepliaved高可用群集

目录 keepalived双击热备基础知识1.keepallived概述及安装keepalived的热备方式 2.使用keepalived实现双机热备 案例1.基础主备调度器环境配置2.配置主调度器3.配置从调度器4.配置两台节点服务器5.测试 keepalived双击热备基础知识 Keepalived 起初是专门针对 LVS 设计的一款强…

在Unreal Engine 5(UE5)中,Get PlayerPawn和Get PlayerController的区别以及如何计算玩家和目标之间的距离。

一、两者区别 在Unreal Engine 5&#xff08;UE5&#xff09;中&#xff0c;获取玩家的位置信息通常有两种方式&#xff1a;通过PlayerPawn或通过PlayerController。具体使用哪一个取决于你想要获取的是哪个实体的位置。 1.Get Player Pawn&#xff1a; PlayerPawn是玩家实际…

linux线程同步

互斥锁 同步与互斥概述** 现代操作系统基本都是多任务操作系统&#xff0c;即同时有大量可调度实体在运行。在多任务操作系统中&#xff0c;同时运行的多个任务可能&#xff1a; 都需要访问/使用同一种资源 多个任务之间有依赖关系&#xff0c;某个任务的运行依赖于另一个任…

Spring 的IoC 和 AOP

第一部分&#xff1a;关于 IoC (控制反转) 1. 核心思想 (What & Why) 首先&#xff0c;我会先解释 IoC 的核心思想&#xff0c;而不是直接讲技术。 “IoC&#xff0c;即控制反转&#xff0c;它是一种重要的设计思想&#xff0c;而不是一个具体的技术。它的核心是将传统上…