nginx和tomcat负载均衡,动静分离

文章目录

一,tomcat

Tomcat,全称为 Apache Tomcat ,是由 Apache 软件基金会开发和维护的开源 Java Servlet 容器和 Web 服务器。Tomcat 是一个轻量级的应用服务器,广泛用于开发和部署基于 Java 的 Web 应用程序。

它支持从简单的静态网站到复杂的动态 Web 应用的各种需求,适用于中小型企业、开发者和个人项目。

1.tomca用途

1.1Web 应用程序服务器

运行 Java Web 应用程序:Tomcat 是 Java Servlet 和 JSP (JavaServer Pages) 规范的实现,它允许开发者将 Java Web 应用程序部署到 Tomcat 上运行。它可以处理动态内容生成、会话管理和请求调度等任务。
1.2开发与测试环境

轻量级开发服务器:由于 Tomcat 易于安装和配置,启动速度快,占用资源少,开发人员常用它作为开发和测试环境的 Web 服务器。它支持热部署和调试功能,使开发周期更加高效。
1.3静态内容和动态内容服务

提供静态资源服务:除了处理动态内容,Tomcat 还可以作为静态资源(如 HTML、CSS、JavaScript 文件)的服务器,将这些资源直接提供给客户端浏览器。

动态内容生成:Tomcat 运行 Servlet 和 JSP 文件,生成动态 Web 内容,并将其返回给客户端。
1.4反向代理和负载均衡

反向代理功能:通过配置,Tomcat 可以充当反向代理服务器,将客户端请求转发到其他服务器上处理,适用于分布式架构。

负载均衡:Tomcat 可以与其他 Tomcat 实例一起配置,形成集群,实现负载均衡和高可用性。
1.5WebSocket 应用支持

实时通信应用:Tomcat 支持 WebSocket 协议,可以运行需要实时双向通信的应用程序,如在线聊天、股票交易平台等。
1.6嵌入式服务器

嵌入式使用:Tomcat 可以作为嵌入式服务器,集成到 Java 应用程序中,使应用程序具备 Web 服务功能,适合开发独立的 Java Web 应用。
1.7企业级应用

中小型企业应用:Tomcat 被广泛应用于中小型企业的生产环境中,处理各种 Web 服务请求,支持企业应用的部署和运行。

RESTful Web 服务:Tomcat 支持基于 Servlet 的 RESTful Web 服务开发,可以用来构建和部署 REST API。

2.tomcat重要目录

  • bin:存放启动和关闭tomcat脚本
  • conf:存放tomcat不同的配置文件
  • doc:存放tomcat文档
  • lib:存放tomcat运行需要的库文件
  • logs:存放tomcat执行时的log文件
  • src:存放tomcat的源代码
  • webapps: tomcat的主要web发布目录
  • work:存放jsp编译后产生的class文件

二,nginx

Nginx(发音为 "Engine-X")是一个开源、高性能的 HTTP 服务器和反向代理服务器,同时也是一个邮件代理服务器和通用的 TCP/UDP 代理服务器。它最初由俄罗斯开发者 Igor Sysoev 编写,并于 2004 年首次发布,旨在解决当时服务器性能瓶颈问题,特别是在处理大量并发连接的情况下。

1.Nginx应用

1.1Nginx是非常优秀的HTTP服务器软件

  • 支持高达50 000个并发连接数的响应
  • 拥有强大的静态资源处理能力
  • 运行稳定
  • 内存、CPU等系统资源消耗非常低

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

2.nginx作用

  • 做负载均衡(一个tomcat不需要负载均衡)和反向代理
  • 静态资源直接返还客户端
  • 动态资源转发tomcat处理
  • 多个请求可以加权

3.nginx的正向代理和反向代理

3.1正向代理

正向代理是代理客户端去访问服务器,目的是为了加快访问速度。

正向代理是一种代理服务器,位于客户端和目标服务器之间,帮助客户端访问目标服务器。当客户端无法直接访问目标服务器时,可以将请求发送给正向代理服务器,由代理服务器代替客户端访问目标服务器,并将服务器的响应结果返回给客户端。
正向代理的主要特点

  1. 客户端知道目标服务器:客户端知道自己想访问哪个目标服务器,但由于某些原因(如防火墙、网络限制、地理位置等),它无法直接访问目标服务器。
  2. 目标服务器不知道客户端:目标服务器并不知道请求实际来自哪个客户端。它只知道请求来自正向代理服务器,因此客户端的真实 IP 地址被代理服务器隐藏了。
  3. 隐藏或屏蔽客户端信息:正向代理可以隐藏客户端的 IP 地址和其他信息,使目标服务器无法识别真正的请求来源。这种机制可以用于保护用户隐私、突破网络限制等。

正向代理:站在客户端一方,帮助客户端访问目标服务器,隐藏客户端信息。

3.2反向代理(单级)

反向代理代理的是服务端目的是为了负载均衡

反向代理是指代理服务器位于客户端和目标服务器之间,代理客户端的请求,并将请求转发到目标服务器上,然后将目标服务器的响应结果返回给客户端。在反向代理的场景中,客户端并不知道目标服务器的真实地址,它只知道反向代理服务器的地址。
反向代理的特点
1. 隐藏后端服务器

隐藏真实 IP:反向代理服务器隐藏了后端服务器的真实 IP 地址。客户端只能看到反向代理服务器的 IP,而无法直接访问后端服务器。这增加了后端服务器的安全性,防止直接攻击。

统一访问入口:所有客户端请求都通过反向代理服务器进入,提供一个统一的入口。这使得后端服务器的架构和部署可以灵活调整,而不影响客户端的访问。
2. 负载均衡

请求分发:反向代理可以将客户端的请求分发到多个后端服务器上,从而实现负载均衡。它可以根据多种算法(如轮询、最少连接、IP 哈希)将流量均匀分布到后端服务器,优化资源利用率,提升系统的可扩展性和稳定性。

自动故障切换:如果某个后端服务器出现故障,反向代理可以自动将流量转移到其他正常运行的服务器上,确保服务的连续性和高可用性。
3. 缓存功能

提高响应速度:反向代理可以缓存来自后端服务器的静态内容(如 HTML、CSS、JavaScript 文件)或动态内容的响应。缓存减少了后端服务器的负担,并加快了客户端的响应速度,特别是在处理大量相同请求时效果显著。

减少带宽使用:通过缓存机制,反向代理可以减少对后端服务器的重复请求,从而减少带宽的使用,提高资源利用效率。
4. 安全增强

防火墙和访问控制:反向代理可以作为应用层的防火墙,过滤和限制不安全或不合法的请求,防止恶意攻击,如 DDoS 攻击、SQL 注入等。

SSL/TLS 终结:反向代理可以负责处理 SSL/TLS 加密通信,将 HTTPS 请求解密为 HTTP 请求,并将其转发给后端服务器。这减轻了后端服务器的加密解密负担,并集中管理 SSL 证书。
5. 协议转换

支持多种协议:反向代理可以处理来自不同协议的请求,如 HTTP、HTTPS、WebSocket、TCP、UDP 等,并将其转发给支持相应协议的后端服务器。这种协议转换功能使得系统能够支持更多种类的应用场景。

应用层协议的升级或降级:反向代理可以将请求从一个协议(如 HTTP/1.1)升级到另一个协议(如 HTTP/2),从而提升应用的性能和兼容性。
6. 优化网络流量

压缩和减小数据量:反向代理可以对从后端服务器返回的数据进行压缩,以减少传输的数据量,从而提高传输效率,尤其是在带宽有限的环境中。

内容优化和修改:反向代理可以动态修改或优化返回给客户端的内容,如注入 HTTP 头、重写 URL、添加或移除 Cookies 等。
7. 负载均衡之外的扩展功能

A/B 测试和蓝绿部署:反向代理可以用于进行 A/B 测试,将流量有选择地导向不同版本的后端服务器,从而评估不同版本的效果。它还可以实现蓝绿部署,平滑地推出新版本。

内容分发:反向代理可以根据客户端请求的地理位置、设备类型、语言等特征,智能地选择最合适的后端服务器或 CDN 节点,提供个性化的内容分发服务。
反向代理:站在服务器一方,帮助服务器处理客户端请求,隐藏服务器信息。

3.3反向代理(多级)

被代理的服务器是多台

4.nginx负载均衡

4.1Nginx·支持的常见的分流算法

1. 轮询(Round Robin):

轮询算法是Nginx默认分流算法。

按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量。

特点:请求均匀分布,无视服务器的当前负载和响应时间。
配置格式

upstream backend {

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}

2.最少连接数(Least·Connections):

最少连接数算法将请求分配给当前活动连接数最少的服务器。

适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载。

数据流向是每个请求被分配到当前连接数最少的服务器。
配置格式

upstream backend {

least_conn;

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}

3.ip哈希(IP Hash)

通过计算客户端 IP 地址的哈希值,将请求分配给特定的服务器。使用这种方法确保来自同一客户端(相同 IP 地址)的所有请求都被分配到同一台后端服务器。
配置格式

upstream backend {

ip_hash;

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}

4. 加权轮询(Weighted· Round Robin):

加权轮询算法允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。较少的请求分配给处理能力较弱或负载较高的服务器。 适用于服务器性能不均衡的情况。

数据流向:根据服务器设置的权重值分配请求。

特点:高权重服务器接收更多的请求,适用于服务器性能差异较大的场景。
配置格式

upstream backend {

server backend1.example.com weight=3;

server backend2.example.com weight=1;

server backend3.example.com weight=2;

}

5. 最少时间算法(Least Time):

基于后端服务器的响应时间和当前的连接数,将新的请求分配给预计能最快完成请求处理的服务器。这种算法不仅考虑了每台服务器的当前负载,还考虑了各服务器的历史响应时间,从而更加精确地进行负载均衡。在Nginx 1.15.3 及以后版本中可以使用

数据流是每个请求分配到响应时间最短或平均连接时间最短的服务器。

特点:进一步优化了最少连接算法,适用于高负载环境下的动态负载均衡。
配置格式

upstream backend {

least_time header;

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}


6.一致性哈希(Consistent Hashing)

一致性哈希能有效地将数据项均匀分布到各个节点上,从而平衡负载,避免某些节点过载 。

数据流向是根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。

特点:适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景。
配置格式

需要第三方模块如 ngx_http_upstream_hash_module

upstream backend {

hash $request_uri consistent;

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}

三,负载均衡和反向代理配置

Nginx 服务器:192.168.88.20:80

Tomcat服务器1:192.168.88.60:8080

Tomcat服务器2:192.168.88.70:8080

Tomcat服务器3:192.168.88.80:8080

将压缩包上传设备/opt

nginx-1.20.2.tar

1.Nginx

1.1关闭防火墙,强制模式

复制代码
systemctl stop NetworkManager
systemctl stop firewalld
setenforce 0

1.2下载nginx的依赖包

复制代码
yum install -y pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

1.3创建nginx用户不创建主,并且查看创建情况

复制代码
useradd -M -s /sbin/nologin nginx
tail -1 /etc/passwd

1.4解压缩到opt

复制代码
tar xf nginx-1.20.2.tar.gz -C /opt

1.5切换到/opt/nginx-1.20.2编译安装

复制代码
cd /opt/nginx-1.20.2/
./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 \
--with-http_ssl_module 

1.6make

复制代码
make -j 2 && make install

1.7创建软链接,启动nginx验证创建软链接是否成功

复制代码
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx
lsof -i:80

1.8配置 /lib/systemd/system/nginx.service

复制代码
vim /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

1.9重新加载

复制代码
systemctl daemon-reload

1.10给文件/lib/systemd/system/nginx.service授权754

复制代码
chmod 754 /lib/systemd/system/nginx.service

1.11启动nginx,开机启动nginx

复制代码
systemctl start nginx.service
systemctl enable nginx.service

1.12设置主机名

复制代码
hostnamectl set-hostname nginx01
bash

1.12备份

复制代码
cp /usr/local/nginx/conf/nginx.conf{,_bak}

1.13Nginx 配置

复制代码
vim /usr/local/nginx/conf/nginx.conf

#取消server内的字符集注释,修改成下面
charset utf-8; 

#在httpd里面#gzip on后面添加
 upstream tomcat_server {
                server 192.168.88.70:8080 weight=1;
                server 192.168.88.80:8080 weight=1;
                server 192.168.88.90:8080 weight=1;
        }

#在server后面添加一个localtion
location ~ .*\.jsp$ {
			proxy_pass http://tomcat_server;
      proxy_set_header HOST $host; 
      proxy_set_header X-Real-IP $remote_addr; #要使用这个需要把log_format  main的注释取消
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}      

#配置Nginx处理静态图片请求,将 .jsp文件请求转发到Tomcat服务器处理,在server里面添加
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
			root /usr/local/nginx/html/img;
			expires 10d;
}

nginx -t

1.14解释

proxy_pass http://tomcat_server;

#设置后端的Web服务器可以获取远程客户端的真实IP

##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。

proxy_set_header HOST KaTeX parse error: Expected 'EOF', got '#' at position 10: host; #̲#把remote_addr赋值给X-Real-IP,来获取源IP

proxy_set_header X-Real-IP $remote_addr;

##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来

1.15 配置nginx静态页面和静态图片

复制代码
echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/g.jpg /usr/local/nginx/html/img

切换到/usr/local/nginx/html/img上传图片

1.15重新加载nginx

复制代码
nginx -s reload

2.tomcat

上传jdk-8u91-linux-x64.tar.gz ,apache-tomcat-8.5.16.tar.gz 压缩包到设备

192.168.88.70,192.168.88.80,192.168.88.90分别设置主机名tomcat01,tomcat02,tomcat03

2.1关闭防火墙,强制模式

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
systemctl stop NetworkManager
systemctl stop firewalld
setenforce 0

2.2解压jdk-8u91-linux-x64.tar.gz 到/usr/local/

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/

2.3配置/etc/profile

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
vim /etc/profile
export JAVA_HOME=/usr/local1/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile

2.4apache-tomcat-8.5.16.tar.gz,移动到/usr/local

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
tar xf apache-tomcat-8.5.16.tar.gz 
mv apache-tomcat-8.5.16 /usr/local/tomcat

2.5将jdk1.8.0_91从192.168.88.70传到192.168.88.80,192.168.88.90机器上

复制代码
scp -r /usr/local/jdk1.8.0_91 /usr/local/tomcat/ 192.168.88.80:/usr/local/
scp -r /usr/local/jdk1.8.0_91 /usr/local/tomcat/ 192.168.88.90:/usr/local/

2.6配置/etc/profile

192.168.88.70,192.168.88.80,192.168.88.90都要安装

复制代码
vim /etc/profile
export JAVA_HOME=/usr/local1/jdk1.8.0_91   #有问题
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile

2.7创建目录,配置index.jsp(动静分离)

192.168.88.70,192.168.88.80和192.168.88.90都需要,分别是test1,test2,test3

复制代码
 mkdir /usr/local/tomcat/webapps/test1 #有问题
 vim /usr/local/tomcat/webapps/test1/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>

2.8备份

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
cp /usr/local/tomcat/conf/server.xml {,_bak}

2.9配置server.xml

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
vim /usr/local/tomcat/conf/server.xml
<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>

 scp -r /usr/local/tomcat/conf/server.xml 192.168.88.80:/usr/local/tomcat/conf/ #把配置好的传给192.168.88.80
 scp -r /usr/local/tomcat/conf/server.xml 192.168.88.90:/usr/local/tomcat/conf/ #把配置好的传给192.168.88.80

2.10关闭启动,查看状况

192.168.88.70,192.168.88.80,192.168.88.90都要操作

复制代码
/usr/local/tomcat/bin/catalina.sh start 
lsof -i :8080
或
netstat -antulp|grep java

3验证

相关推荐
☆凡尘清心☆6 分钟前
CentOS Stream 9 源码编译搭建 Zabbix7.0.29 完整部署方案(部署成功)
linux·运维·centos
予昊18 分钟前
Linux 资源控制实战分析:用 LXC 亲手造一个 “迷你虚拟机“
linux·运维·服务器
allforgood25 分钟前
管理网络安全
linux
灵晔君1 小时前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
wsad05321 小时前
CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 论坛完整教程
linux·docker·centos·discuz
张宇Joaquin1 小时前
openEuler编译和更换内核的方法
java·linux·服务器
小此方1 小时前
Re:Linux系统篇(五十六)线程篇 · 九:基于阻塞队列的生产者消费者模型与条件变量
linux·运维·服务器
迷途之人不知返1 小时前
自动化工程的构建
linux·自动化
Escalating_xu1 小时前
【Linux】库制作与链接原理:从静态库、动态库到 ELF、重定位、GOT 与 PLT
linux·运维·服务器
三言老师11 小时前
秘诀-如何远程SSN访问家里的八台电脑(frp 实操方案)
linux·运维·ssh