【Web服务器】Nginx+Tomcat负载均衡、动静分离群集

nginx+Tomcat(反向代理、动静分离、负载均衡) 本文主要介绍如何搭建nginx与tomcat结合的反向代理、负载均衡及动静分离的架构,希望对你有帮助! 阅读详情


一、Tomcat 简介

1. Tomcat 重要目录

目录功能
bin存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件
conf存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
lib存放Tomcat日志
temp存放Tomcat运行时产生的文件
webapps存放项目资源的目录
workTomcat工作目录,一般清除Tomcat缓存的时候会使用到

二、Nginx 负载均衡

1. Nginx 应用

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

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

2. Nginx 负载均衡实现原理

2.1 正向代理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g1rloRJR-1686048625935)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606133251539.png)]

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

2.2 反向代理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgQl7qNe-1686048625936)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606133307295.png)]

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

2.3 负载均衡原理总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1HrWRwMM-1686048625936)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606134125984.png)]

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

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

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

upstream 服务池名{}

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

proxy_pass http://服务池名

2.5 Nginx 代理转发类型

4层代理

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

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 静态处理优势

  • Nginx处理静态页面的效率高于Tomcat的处理能力;
  • 若Tomcat的请求为1000次,则Ntginx的请求两位6000次;
  • Tomcat每秒的吞吐量位0.6M,Nginx的每秒吞吐量位3.6,;
  • Nginx处理静态资源的能力是Tomcat处理的6倍。

2.1 吞吐量

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

2.2 并发量

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

四、案例

1. 案例一:7层代理

1.1 准备三台服务器,Nginx作为负载均衡器,Tomcat作为应用服务器

Nginx 服务器:192.168.145.15:80
Tomcat服务器1:192.168.145.30:80
Tomcat服务器2:192.168.145.45:8080 192.168.2.200:8081

1.2 部署 Nginx 服务器(192.168.145.15)

前提虚拟机需要配置本地yum源以及挂载镜像

环境配置

###关闭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.
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

测试访问ip地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RKgl4U9f-1686048625937)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606151734228.png)]

1.3 部署 tomcat 服务器 1(192.168.145.30)——含有一台tomcat

环境设置

###关闭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

安装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环境变量

[root@localhost opt]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
###刷新配置文件
[root@localhost opt]# source /etc/profile.d/java.sh
[root@localhost opt]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

安装tomcat

[root@localhost opt]# tar xf apache-tomcat-9.0.16.tar.gz 
[root@localhost opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat

tomcat设置位服务

###编写tomcat服务文件
[root@localhost system]# vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_201-amd64"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
###重新加载服务
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl start tomcat

浏览器访问验证

在这里插入图片描述

1.4 部署 tomcat 服务器2 (192.168.145.45)——含有两台tomcat

安装jdk

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

[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u91-linux-x64.tar.gz  rh
###解压
[root@localhost opt]# tar xf jdk-8u91-linux-x64.tar.gz 
[root@localhost opt]# mv jdk1.8.0_91/ /usr/local/
[root@localhost opt]#  cd 
[root@localhost ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=$JAVA_HOME/jre
export CATALINA=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=%JAVA_HOME/bin:$JRE_HOME/bin:$PATH
###加载文件
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

安装 tomcat

[root@localhost opt]# tar zxvf apache-tomcat-9.0.16.tar.gz

###创建目录
[root@localhost opt]# mkdir /usr/local/tomcat
###移动tomcat到/usl/local/tomcat/改名为tomcat1
[root@localhost opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
###复制 tomcat1 改名为 tomcat2
[root@localhost opt]# cd /usr/local/tomcat/
[root@localhost tomcat]# ls
tomcat1
[root@localhost tomcat]# cp -a tomcat1/ tomcat2/
[root@localhost tomcat]# ls
tomcat1  tomcat2

配置tomcat环境变量

[root@localhost ~]# 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
[root@localhost ~]# source /etc/profile.d/tomcat.sh

修改 tomcat2 中的 server.xml 文件,要求各 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" />

修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件

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

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

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

[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

启动各 tomcat 中的 /bin/startup.sh

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

[root@localhost ~]# netstat -lntp | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      12737/java          
tcp6       0      0 :::8081                 :::*                    LISTEN      12802/java          
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      12737/java          
tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      12802/java          
tcp6       0      0 :::8009                 :::*                    LISTEN      12737/java          
tcp6       0      0 :::8010                 :::*                    LISTEN      12802/java

浏览器测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjgIg2VO-1686048625938)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606162039067.png)]

1.5 动静分离Tomcat1 server 配置

Tomcat1 server 配置
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/test
[root@localhost ~]# 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>
<h1>动态页面1</h1>
</body>
</html>

[root@localhost ~]# cd /usr/local/tomcat/conf/
###备份
[root@localhost conf]# cp /usr/local/tomcat/conf/server.xml  /usr/local/tomcat/conf/server.xml.bak
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
	</Context>
</Host>
[root@localhost conf]# systemctl restart tomcat
Tomcat2 server 配置

配置测试文件

[root@localhost ~]# mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test

[root@localhost ~]# vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<h1>动态页面2</h1>
</body>
</html>


##备份
[root@localhost ~]# cp /usr/local/tomcat/tomcat1/conf/server.xml /usr/local/tomcat/tomcat1/conf/server.xml.bak
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/conf/server.xml
###删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>

配置测试文件

[root@localhost ~]# vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>
</head>
<body>
<h1>动态页面3</h1>
</body>
</html>


###备份
[root@localhost ~]# cp /usr/local/tomcat/tomcat2/conf/server.xml /usr/local/tomcat/tomcat2/conf/server.xml.bak
[root@localhost ~]#vim /usr/local/tomcat/tomcat2/conf/server.xml
###删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>

重新启动服务

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

[root@localhost ~]# /usr/local/tomcat/tomcat2/bin/shutdown.sh 
[root@localhost ~]# /usr/local/tomcat/tomcat2/bin/startup.sh 
Nginx server 配置
#准备静态页面和静态图片
[root@localhost ~]# echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
[root@localhost ~]# mkdir /usr/local/nginx/html/img
[root@localhost ~]# cp /root/game.jpg /usr/local/nginx/html/img

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream tomcat_server {
		server 192.168.145.30:8080 weight=1;
		server 192.168.145.45:8080 weight=1;
		server 192.168.145.45:8081 weight=1;
	}
	
	server {
		listen 80;
		server_name www.accp.com;
	
		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/img;
			expires 10d;
		}
		
		location / {
			root html;
			index index.html index.htm;
		}
......
	}
......
}

重启服务

[root@localhost ~]# 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
[root@localhost ~]# systemctl restart nginx.service

1.6 使用虚拟机测试

测试静态页面效果
浏览器访问 http://192.168.145.15/
浏览器访问 http://192.168.145.15/game.jpg

测试负载均衡效果,不断刷新浏览器测试
浏览器访问 http://192.168.145.15/index.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4twrJCKQ-1686048625939)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606174329420.png)]

2. 案例二:4层代理

2.1 配置Nginx服务器(192.168.145.60)

同192.168.145.15 配置

在这里插入图片描述

2.2 动静态分离 Nginx 配置

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
stream {
	
    upstream appserver {
		server 192.168.145.30:8080 weight=1;
		server 192.168.145.45:8080 weight=1;
		server 192.168.145.45:8081 weight=1;
    }
    server {
        listen 8080;
        proxy_pass appserver;
    }
}

http {
......
server {
        listen       80;
        server_name  localhost;

        charset utf-8;
		...
		}
		...
}

2.3 使用虚拟机访问

测试静态页面效果
浏览器访问 http://192.168.145.60/

测试负载均衡效果,不断刷新浏览器测试
浏览器访问 http://192.168.145.60:8080

基于端口访问,但是会有60s左右的缓存时间才会实现跳转到别的tomcat服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCbR6Avu-1686048625941)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230606184953663.png)]

五、总结

1. Nginx 的反向代理的类型

四层反向代理:基于IP+PORT实现的代理转发

七层反向代理:基于http、https、mail等七层协议转发

2. 七层反向代理的配置

(1)在 http{} 配置段里设置 upstream 定义后端应用服务器池的名称和节点参数配置

upstream backend {							###backend是服务器池名称
	server IP:PROT weight=1   				###weight设置权重
	...
}

(2)在server{}配置段里用 location{} 匹配用户的访问路径,使用 proxy_pass 基于协议进行转发

location ~ .*\.jsp$ {		###正则表达式,匹配 .jsp 结尾的文件
	proxy_pass http://backend;
}

3. 四层反向代理的配置

(1)编译安装时需要 --with-stream 添加四层反向代理模块;

./configure --with-stream

(2)和 http{} 配置段同层级别,一般在 http{} 配置段上面添加是 stream{} 配置段,在 stream{} 配置段中定义服务器池、监听端口和转发等配置

stream{
	upstream backend {
		server IP:PROT weight=1
		...
	}
	server {
		listen PROT;
		server_name localhost;
		
		location / {
			proxy_passhttp://backend;
		}
	}
}
Nginx+Tomcat负载均衡、动静分离集群 一.Nginx负载均衡实现原理 Nginx实现负载均衡是通过反向代理实现 2、反向代理的概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。 反向代理对服务端是透明的,对我们是非透明的,即我. 阅读详情

相关推荐

Nginx+Tomcat的负载均衡动静分离群集

文章目录一、Tomcat简介二、Nginx负载均衡,动静分离原理三、部署ngnix负载均衡器1,安装nginx关闭防火墙和setenforce安装依赖关系包上传安装包并解压进入目录进行编译安装新建用户以便于管理建立软链接配置system开启服务并查看在网页上测试nginx2.安装部署tomcat 一、Tomcat简介 最初是由Sun的软件构架师詹姆斯邓肯戴维森开发 安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件 Tomcat重要目录 bin:存放启动和关闭Tomcat脚

a568911的博客 2466

Nginx和Tomcat

Nginx用于处理静态内容、负载均衡和SSL终止,而Tomcat用于执行Java Web应用程序和处理动态内容。Nginx具有内置的负载均衡功能,可以将请求分发到多个后端服务器,而Tomcat通常需要与其他负载均衡器一起使用,以实现负载均衡。Nginx可以用于SSL终止,而Tomcat也可以处理SSL/TLS,但通常将其代理给Nginx等前端服务器以提高性能。它们主要用于不同的应用类型。Nginx主要用于处理静态内容和路由请求,而Tomcat主要用于生成和处理动态内容,特别是Java Web应用程序。

weixin_49555380的博客 1855

Fusion 360嵌入式外壳建模实战:从草图到可装配结构

参数化三维建模是现代电子结构设计的核心能力,其本质是通过几何约束与特征驱动实现设计意图的精确表达和快速迭代。Fusion 360作为集成CAD/CAM/CAE的云端平台,以时间轴驱动的参数化工作流、基于基准面的草图约束机制和面向制造的特征操作逻辑,显著提升了嵌入式硬件的结构验证效率。该技术价值在于支持工程师在无专业机械背景前提下,独立完成PCB适配、散热布局、接口开孔与装配干涉检查等关键任务,广泛应用于3D打印原型、CNC加工外壳及IoT终端结构开发。本文以ESP32冰箱监控终端为实例,详解从基准定义、草图

weixin_35671843的博客 588

nginx和apache和tomcat对比

Apache:主要作为Web服务器,能够处理静态内容和动态内容,也能够作为反向代理服务器。Apache:灵活的配置方式,支持在配置文件中直接配置各种模块和指令。nginx:在处理静态内容时表现极佳,能够高效地响应请求,在处理动态内容时也表现优秀。Apache:能够处理静态和动态内容,但在处理动态内容时表现较差。Tomcat:使用基于线程池的模型来处理请求,能够支持大量并发请求,但在高负载情况下性能可能会下降。Apache:使用多线程的方式来处理请求,在高并发情况下可能会受到线程切换的开销,导致性能下降。

Aprilqxs的博客 1232

DC竞赛 国能日新功率预测题 rank21 解决方案(适合新手)

DataCastle国能日新光伏功率预测 数据异常处 本题在测试集中提供了时间、辐照度、风速、风向、温度、压强、湿度、实发辐照度8个特征,以及标签**实际功率**。 而在训练集中只有前七个特征,无实发辐照度。 策略 在观察了数据之后,我们确定实发辐照度是一个强力特征,于是我们采取了stacking的策略: 1. 第一次训练以实发辐照度为标签,预测 测试集的实发辐照度 2....

yyhhlancelot的博客 7294

FreeRTOS --(15)信号量之概述

FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步; 针对不同的应用场景,信号量分为两种: 1、二值信号量; 2、计数信号量; 1、二值信号量 1.1、Usage 顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.

StephenZhou 6517

Nginx和Tomcat的区别

nginx和tomcat的区别 web上的server都叫web server,但是大家分工也有不同的。 nginx常用做静态内容服务和代理服务器(不是你翻墙那个代理),直面外来请求转发给后面的应用服务(tomcat,django什么的),tomcat更多用来做做一个应用容器,让java web app跑在里面的东西,对应同级别的有jboss,jetty等东西。 但是事无绝对,nginx也可以通过模块开发来提供应用功能,tomcat也可以直接提供http服务,通常用在内网和不需要流控等小型服务的场景。

m0_38054145的博客 2554

Manus通用AI智能体完全使用指南(2025最新版)——从注册到高阶技巧全解析

Manus通用AI智能体完全使用指南(2025最新版)——从注册到高阶技巧全解析

m0_69718028的博客 8116

Web服务器群集:Nginx+Tomcat实现负载均衡与动静分离集群

多实例是在一台服务器上同时开启多个不同的服务端口,同时运行多个服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。Nginx实现负载均衡是通过反向代理实现。Nginx动静分离中静态资源由Nginx提供服务,动态资源Nginx转发至后端。

cronaldo91的博客 1931

4、海洋哺乳动物运动能量学:潜水与生存的奥秘

本文深入探讨了海洋哺乳动物在潜水与运动中的能量消耗机制,涵盖其生理反应、代谢成本、节能行为策略及测量方法。通过分析不同物种的能量利用特点,揭示了它们如何在极端水下环境中维持能量平衡,并讨论了该研究在保护生物学、生态系统动态和动物健康管理中的实际意义。文章还展望了未来多学科交叉、长期监测及应对环境变化的研究方向,为理解海洋哺乳动物的生存奥秘提供了系统性视角。

p5l2m9n4o6q的博客 116

jieba分词

jieba

sikh_0529的博客 1万+

Nginx + Tomcat负载均衡群集

Nginx 是一个非常强大的静态 web 服务,Tomcat 处理动态请求效率不高,而一般网站大 多数的内容都是静态文件(如图片、html、css、js 等),经过 Nginx 前端的反向代理加速 和过滤,后端Tomcat 处理请求的压力便可大大减少,只需负责处理动态内容就可以了。Nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 50000 个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存、CPU 等系统资源消耗非常低。配置完整的 nginx.conf 文件内容如下。

2501_91344566的博客 1417

使用cutoff包基于最小p值法方法计算最佳截断值(基于LIRI基因数据集) R语言

这个方法在生物学研究中具有重要的意义,能够帮助我们从大规模基因表达数据中准确地找到差异显著的基因。在上述代码中,calculate_p_values函数是一个自定义函数,用于计算差异表达基因的p值。在本文中,我们将介绍如何使用R语言的cutoff包来基于最小p值法方法计算最佳的截断值,以便筛选出差异显著的基因。通过以上步骤,我们成功地使用cutoff包基于最小p值法方法计算了最佳的截断值,并筛选出了差异显著的基因。最后,我们可以根据得到的最佳截断值将基因表达数据集进行筛选,提取出差异显著的基因。

ByteKnight的博客 1291

Nginx+Tomcat负载均衡群集

通常情况下,一台 Tomcat 站点由于可能出现单点故障及无法应付过多客户复杂多样的请求等问题,不能单独应用于生产环境下,所以需要一套更可靠的解决方案来完善 Web 站点架构。Nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 50000 个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存、CPU 等系统资源消耗非常低。目前很多大型网站都会应用 Nginx 服务器作为后端网站程序的反向代理及负载均衡器,来提升整个站点的负载并发能力。

2301_80376513的博客 1296

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

nginx+tomcat负载均衡群集

京北点指科技有限公司发布 V3 版移联建站管理系统,该项目为 Java 语言开发的Web 站点。目前,IBM 的WebSphere 及Oracle 的WebLogic 占据了市面上 Java 语言 Web 站点的 大部分份额。这两种软件以其无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司 的Web 场景中,但是其高昂的价格也使得小型互联网公司对此望而却步。

2401_84242106的博客 1619

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LVS负载均衡群集

京北点指科技有限公司发布V3版移联建站管理系统,该项目为Java 语言开发的Web 站点。目前,IBM 的 WebSphere 及 0racle 的 WebLogic 占据了市面上 Java 语言 Web站点的大部分份额。这两种软件以其无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司 的Web 场景中,但是其高昂的价格也使得小型互联网公司对此望而却步Tomcat 自 5.x版本以来,其性能上已经得到了大幅的提升,再加上其开放性的框架和 可二次开发等特性,已经完全可以用在访问量不是很大的生产环境下。

tkzcmz的博客 1558

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LVS负载均衡群集:Nginx+Tomcat负载均衡群集

京北点指科技有限公司发布V3版移联建站管理系统,该项目为Java 语言开发的Web 站点。目前,IBM 的 WebSphere 及Oracle 的 WebLogic 占据了市面上 Java 语言 Web 站点的 大部分份额。这两种软件以其无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司 的 Web 场景中,但是其高昂的价格也使得小型互联网公司对此望而却步。

zlyyljlckx的博客 1263

Nginx+Tomcat负载均衡、动静分离

Nginx+Tomcat负载均衡、动静分离1. Tomcat 概述1.1 Tomcat 简介1.2 应用场景1.3 安装过程2. Nginx+Tomcat 负载均衡、动静分离群集实验2.1 Tomcat1 192.168.100.202.2 Tomcat1 192.168.100.30 1. Tomcat 概述 1.1 Tomcat 简介 Tomcat 最初是由 Sun 的软件构架师詹姆斯·邓肯·戴维森开发的。后来他 帮助将其变为开源项目,并由 Sun 贡献给 Apache 软件基金会。由于大部分开源项目

weixin_48190892的博客 174

Haproxy搭建 Web 群集

haproxy 的日志默认是输出到系统的 syslog 中,查看起来不是非常方便,为了更好的管理 haproxy 的日志,我们在生产环境中一般单独定义出来。这就需要将 haproxy 的 info 及 notice 日志分别记录到不同的日志文件中。有两种实现方法。

m0_67475830的博客 1481

Nginx + Tomcat 负载均衡、动静分离群集

Apache Tomcat 是一个开源的 Servlet 容器,由 Apache 软件基金会开发和维护。它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL) 和 WebSocket 等技术规范,是运行 Java Web 应用程序的核心平台。

2501_91350469的博客 2872

Nginx+Tomcat高可用负载均衡群集——动静分离

Tomcat概述Tomcat简介Tomcat重要目录Nginx应用Nginx是一款非常优秀的HTTP服务器软件Nginx负载均衡实现原理Nginx配置反向代理的主要参数Nginx动静分离实现原理Nginx静态处理优势生产环境实操实验设计一、部署Tomcat【1】1.安装JDK环境2.安装Tomcat服务3.测试Tomcat服务器4.定义一个Tomcat虚拟主机5.访问测试页二、部署Tomcat【2】1.安装JDK环境2.安装Tomcat服务3.测试Tomcat服务器4.定义一个Tomcat虚拟主机5.访问.

CN_LiTianpeng的博客 4948

Nginx+Tomcat负载均衡、动静分离群集方案

在现代 Web 服务架构中,Tomcat 和 Nginx 是两个至关重要的组件,负责处理用户请求并实现高性能的服务。本篇博客将深入探讨这些技术的原理和部署配置方法。最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发。安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件。

weixin_62922268的博客 1922

Nginx+Tomcat负载均衡、动静分离群集

这里写目录标题部署Nginx负载均衡器关闭防火墙和安全防护,把nginx安装包移动到opt目录下 部署Nginx负载均衡器 关闭防火墙和安全防护,把nginx安装包移动到opt目录下 安装依赖包 创建运行用户 编译安装 优化路径 添加Nginx系统服务 赋予权限并开启服务 ...

weixin_55609833的博客 1117

nginx+Tomcat负载均衡群集

LVS:四层性能王者,适合基础设施层的流量转发。HAProxy:四层 / 七层全能型选手,适合需要灵活路由和复杂健康检查的场景。Nginx:七层 Web 场景首选,轻量高效,适合反向代理和静态资源处理。京北点指科技有限公司发布V3版移联建站管理系统,该项目为Java 语言开发的Web 站点。目前,IBM 的 WebSphere 及 0racle 的 WebLogic 占据了市面上 Java 语言 Web 站点的 大部分份额。

2501_91344113的博客 1607

理论+实验:Nginx+Tomcat负载均衡、动静分离群集

目录一、Tomcat简介1.1 Tomcat简介1.2 Tomcat重要目录 一、Tomcat简介 1.1 Tomcat简介 ■ 最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发 ■ 安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件 1.2 Tomcat重要目录 ■ bin:存放启动和关闭Tomcat脚本 ■ conf:存放Tomcat不同的配置文件 ■ doc:存放Tomcat文档 ...

优快云著名博主 1万+
上一篇: 【Web服务器】Tomcat的优化
下一篇: 【集群】LVS负载均衡群集
我的宝贝大唐
博客等级 码龄7年 96粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的宝贝大唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值