Ngunx + Tomcat 负载均衡和动态分离

目录

一、tomcat简介

[二、Nginx 负载均衡](#二、Nginx 负载均衡)

[1. Nginx 应用](#1. Nginx 应用)

[2. Nginx 负载均衡实现原理](#2. Nginx 负载均衡实现原理)

[2.1 正向代理](#2.1 正向代理)

[2.2 反向代理](#2.2 反向代理)

[2.3 具体过程接收请求:Nginx作为反向代理服务器,接收客户端的请求。选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。转发请求:Nginx将接收到的请求转发给选定的后端服务器。返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。返回客户端:Nginx将接收到的响应返回给客户端。](#2.3 具体过程接收请求:Nginx作为反向代理服务器,接收客户端的请求。选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。转发请求:Nginx将接收到的请求转发给选定的后端服务器。返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。返回客户端:Nginx将接收到的响应返回给客户端。)

[2.4 负载均衡原理](#2.4 负载均衡原理)

[2.5 配置方向代理的主要参数](#2.5 配置方向代理的主要参数)

[2.6 Nginx 代理转发类型](#2.6 Nginx 代理转发类型)

[3. Nginx 负载均衡模式](#3. Nginx 负载均衡模式)

[三、Nginx 动静分离](#三、Nginx 动静分离)

1、nginx动静分离原理 

2、静态处理优势

3、吞吐量

4、并发量

四、案例


一、tomcat简介

在现代 Web 服务架构中,Tomcat 和 Nginx 是两个至关重要的组件,负责处理用户请求并实现高性能的服务。本篇博客将深入探讨这些技术的原理和部署配置方法。

最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发。

安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件。

二、Nginx 负载均衡

1. Nginx 应用

Nginx是一款非常优秀的HTTP服务器软件。Nginx支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。

目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力。

2. Nginx 负载均衡实现原理

2.1 正向代理

首先我们需要明确,我们作为用户是从客户端去访问服务端,因此从客户端-→服务端可以简单的认为是正向。换句话说正向代理时,我们往往明确的知道我们需要访问哪个服务端,比如我想访问google,但是由于某种原因,我无法直接访问它,因此我需要一个能访问呢google的代理服务器去帮我完成这个通信,通过一系列代理服务器的配置,当我输入google的网站时,代理服务器接收请求并转交给目标服务端即google,最终返回内容给我客户端。至此完成了一个简单的正向代理,通过上文我们可以发现,服务端仅仅只与代理服务器产生了通信,因此服务端并不知道该请求来自于哪个客户端,它知道是从代理服务器而来,因此正向代理的最大特点即:其屏蔽或者隐藏了真实客户端的信息,即保护了客户端。

2.2 反向代理

弄清了正向代理,其实反向代理也很清晰了,不就是一个逆向思维嘛,即保护了服务端。反向代理往往应用于分布式环境下,例如我们的淘宝,为了解决高流星带来的服务器压力,单台服务器往往不能够解决问题,此时则需要搭建一个集群环境,并且其也拥有一个反向代理服务器,当大量的客户端请求淘宝时,往往请求并不会直接到服务端,而是先到代理服务器,由代理服务器进行反向代理,采用负载均衡9策略将请求分法给各台服务器,保证资源的充分利用。这就是反向代理最大的用处,我们是否也能发现,从某种意义上来说,反向代理屏蔽或者隐藏了服务器的信息,相对于单一服务端,采用了反向代理之后我们只知道访问了淘宝,却不知道访问了其具体的哪台服务器

2.3 具体过程

接收请求:Nginx作为反向代理服务器,接收客户端的请求。
选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。
转发请求:Nginx将接收到的请求转发给选定的后端服务器。
返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。
返回客户端:Nginx将接收到的响应返回给客户端。

当使用Nginx服务器作为前端时,可以配置Nginx来进行静态页面的处理,而将动态页面请求转发给后端的Tomcat服务器来处理。由于Tomcat是轻量级应用服务器,可能无法满足所有访问量,因此需要多台Tomcat服务器,并通过Nginx的配置权重来进行负载均衡,以确保请求能够被分发到不同的Tomcat服务器上

2.4 负载均衡原理

客户端向反向代理发送请求,接着反向代理根据某种负载机制请求至目标服务器(这些服务器都运行着相同的应用),并把获取的内容返回给客户端,其中代理请求可能根据配置被发往不同的服务器。

2.5 配置方向代理的主要参数

配置后端服务器池,以提供响应数据

复制代码
upstream 服务池名{}

配置将访问请求发送给后端服务器池的服务器处理**。**

复制代码
proxy_pass http://服务池名
2.6 Nginx 代理转发类型

4层代理

使用NAT (Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给nginx,nginx数据包再做一次类似的修改,就返回给请求的客户端了。

四层代码配置:

复制代码
stream {
    
    upstream appserver {
        server 192.168.80.100:8080 weight=1;
        server 192.168.80.101:8080 weight=1;
        server 192.168.80.101:8081 weight=1;
    }
    server {
        listen 8080;
        proxy_pass appserver;
    }
}
 
http {
......

7层代理

nginx读取并解析Http请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

七层代码配置

3. Nginx 负载均衡模式

3.1 rr 轮询 负载均衡模式 (自带的)

每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。

3.2 least_conn 最少连接(自带的)

优先将客户端请求调度到当前连接最少的服务器。

3.3 weight 加权轮询(自带的)

weight代表权重的意思,用于指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例。

3.4 ip_hash (自带的)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。

3.5 url_hash(第三方)

基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

3.6 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

三、Nginx 动静分离

1、nginx动静分离原理

客户端发送请求想要访问服务器端,首先会经过一个代理服务器(即包含Nginx服务的服务器),如果发送的请求中既有静态资源也有动态资源,其中的静态资源会有Nginx提供服务进行返回响应给客户端,动态资源则会由Nginx转发给后端(即包含Tomcat服务的服务器),然后由后端在进行返回响应给代理服务器,再由代理服务器返回响应给客户端。其本质就是是location规则的匹配

2、静态处理优势

Nginx处理静态页面的效率高于Tomcat的处理能力;

若Tomcat的请求为1000次,则Ntginx的请求两位6000次;

Tomcat每秒的吞吐量位0.6M,Nginx的每秒吞吐量位3.6,;

Nginx处理静态资源的能力是Tomcat处理的6倍。

3、吞吐量

吞吐量可以理解成带宽流量,以每个请求0.5KB大小,并发每秒25万,0.5/1024MB*250000=122MB*8bit=977Mbps。

4、并发量

以10分钟有5000万用户平均每人访问2次为例,并发量为每秒(5000w*2)/(60*10)=16.7万,再double下,就说每秒25万并发量

四、案例

1、搭建七层代理准备三台服务器Nginx作为负载均衡器,Tomcat作为应用服务器

nginx:20.0.0.100:80

tomcat1:20.0.0.101:80

tomcat2:20.0.0.102:8080 20.0.0.200:8081

初始化三台机器

复制代码
###关闭firewalld
[root@localhost ~]# systemctl stop firewalld.service
###关闭防火墙开机自启
[root@localhost ~]# systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
关闭selinux
[root@localhost ~]# setenforce 0

部署nginx 编译安装

复制代码
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
nginx-1.24.0.tar.gz  rh
[root@localhost opt]# tar xf nginx-1.24.0.tar.gz 
[root@localhost opt]# ls
nginx-1.24.0  nginx-1.24.0.tar.gz  rh
[root@localhost opt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \									#启用文件修改支持
--with-http_stub_status_module \					#启用状态统计
--with-http_gzip_static_module \					#启用 gzip静态压缩
--with-http_flv_module \							#启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module								#启用 SSL模块,提供SSL加密功能
--with-stream										#启用 stream模块,提供4层调度
###编译安装
[root@localhost nginx-1.24.0]# make -j2 && make install
 
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream

添加nginx服务

复制代码
###把nginx服务的可执行程序文件放入路径环境变量的目录中便于系统识别
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
###修改nginx服务的配置文件
[root@localhost nginx-1.24.0]# vim /lib/systemd/system/nginx.service
[Unit]                    					#服务的说明
Description=nginx         		 			#描述服务
After=network.target       					#依赖,当依赖的服务启动之后再启动自定义的服务
[Service]                           		#服务运行参数的设置
Type=forking                				#是后台运行的形式,使用此启动类型应同时指定  
PIDFile=/usr/local/nginx/logs/nginx.pid 	 #PID文件位置以便systemd能够跟踪服务的主进程
ExecStart=/usr/local/nginx/sbin/nginx  	 	#服务的具体运行命令
ExecReload=/bin/kill -s HUP $MAINPID  	 	#重启命令
ExecStop=/bin/kill -s QUIT $MAINPID     	#停止命令
PrivateTmp=true                     	 	#给服务分配独立的临时空间
[Install]                             		#服务安装的相关设置
WantedBy=multi-user.target           	 	#可设置为多用户
 
###给予文件权限
[root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
###启动nginx服务
[root@localhost ~]# systemctl start nginx.service
###开机自启nginx服务
[root@localhost ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

测试访问ip地址

tomcat1部署

安装jdk

复制代码
[root@localhost opt]# cd /opt
###查询指定软件包的文件列表
[root@localhost opt]# rpm -qpl jdk-8u201-linux-x64.rpm 
###安装jdk
[root@localhost opt]# rpm -ivh jdk-8u201-linux-x64.rpm 
###查看jdk版本号
[root@localhost opt]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

然后配置jdk环境变量

vim /etc/profile

保存退出 然后 source /etc/profile

然后到根目录下 创建一个 XXX.java文件 我这里创建的是Hello.java文件

配置内容如图

保存退出

此时 jdk环境变量配置好了

安装tomcat

此时 到浏览器访问本地路径

出现tomcat服务 就是安装启动好了

部署第二台tomcat 操作一样 但是端口号不能一样

复制代码
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
###22行,修改Server prot,默认为8005 -> 修改为8006
<Server port="8006" shutdown="SHUTDOWN">
 
###69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8081" protocol="HTTP/1.1"
 
###116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
相关推荐
泽虞9 分钟前
《LINUX系统编程》笔记p3
linux·运维·服务器·c语言·笔记·面试
dingcb1682 小时前
4090服务器无法sudo apt update 问题解决
运维·服务器
头发那是一根不剩了2 小时前
服务器硬盘进行分区和挂载
linux·运维·服务器
stark张宇3 小时前
Linux 零基础入门,看这一篇就够了
linux·服务器
彬彬醤4 小时前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
Sadsvit6 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos
网硕互联的小客服6 小时前
如何配置安全的SFTP服务器?
运维·服务器·安全
sinat_286945196 小时前
AI服务器介绍
服务器·人工智能·算法·chatgpt·transformer
ALLSectorSorft6 小时前
搭子交友 app 动态分享与打卡系统设计实现
java·服务器·数据库·人工智能·oracle·交友
Clownseven8 小时前
Linux服务器健康检查Shell脚本:一键生成自动化巡检报告
linux·服务器·自动化