Nginx负载均衡与动静分离

news2024/11/15 10:52:21

一、Nginx负载均衡:

1.概述:

Nginx是一款http服务器软件,支持高达50000个并发连接数的响应。

(1)拥有强大的处理静态资源的能力。

(2)运行稳定。

(3)CPU,内存等资源消耗低。

2.负载均衡实现原理:

(1)通过反向代理实现

(2)反向代理原理:指以代理服务器来接收客户端的请求,然后将请求转发到内部网络的服务器上。将服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。对于客户端来说,反向代理服务器相当于目标服务器,只需将反向代理当作目标服务器一样发送请求即可,且客户端不需要进行任何设置。

  • 正向代理:位于客户端和目标服务器之间的代理服务器,为了从目标服务器获得内容,客户端向代理服务器发送一个请求并指定目标服务器,然后代理服务器向目标服务器转交请求并获得内容,然后返回客户端。

  • 正向代理的作用:

    • 突破访问权限,通过代理服务器,可突破自身IP的访问限制,访问外网等。
    • 提高访问速度,代理服务器会设置硬盘缓冲区,并保存部分响应请求,当其他用户再访问相同信息时,由缓冲区传给用户信息,以提高访问速度。
    • 隐藏客户端真实IP。
  • 反向代理作用:

    • 负载均衡,根据所有真实服务器负载情况,将客户端请求发到不同的真实服务器上。
    • 提高访问速度反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
    • 提供安全保障,反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。

3.Nginx静态处理优势:

(1)动静分离原理:服务端接收客户端的请求中,既有静态资源,也有动态资源,静态资源由nginx提供服务,动态资源由nginx转发至后端。

(2)静态处理优势:

  • 处理静态页面的效率远高于tomcat的处理能力
  • 若tomcat请求量为1000次,则nginx为6000次
  • tomcat吞吐量为0.6M/s,nginx为3.6M/s
  • nginx处理静态能力是tomcat的6倍

二、实验:

1.部署虚拟机192.168.174.15(两个tomcat已部署完)

(1)关闭防火墙,安全机制:

 systemctl stop firewalld
 systemctl disable firewalld
 setenforce 0

(2)安装环境

1.先安装jdk
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
cp -a /usr/local/tomcat /usr/local/tomcat1
 
3.部署环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat
export CATALINA_BASE1=/usr/local/tomcat
export TOMCAT_HOME1=/usr/local/tomcat
 
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1
 
 
source /etc/profile.d/tomcat.sh

(3)修改 tomcat1 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号:

vim /usr/local/tomcat1/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和tomcat1 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/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/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
 
 
修改tomcat1
vim /usr/local/tomcat1/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/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

(4)启动各 tomcat 中的 /bin/startup.sh

/usr/local/tomcat/bin/startup.sh 
/usr/local/tomcat1/bin/startup.sh 
etstat -antp | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      7316/java           
tcp6       0      0 :::8081                 :::*                    LISTEN      7372/java           
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      7316/java           
tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      7372/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      7316/java           
tcp6       0      0 :::8010                 :::*                    LISTEN      7372/java 

(5)Tomcat server 配置

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>

<head>
<title>JSP test2 page</title>   #指定为 test2 页面
</head>

<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/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>
 
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh


mkdir /usr/local/tomcat1/webapps/test
 
vim /usr/local/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>   #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
vim /usr/local/tomcat1/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>
 
/usr/local/tomcat1/bin/shutdown.sh 
/usr/local/tomcat1/bin/startup.sh

2. 部署虚拟机192.168.174.17(第三个tomcat已开启)

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz
 
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
 
 
2.安装jdk
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm 
rpm -ivh jdk-8u201-linux-x64.rpm 
java -version
 
 
3.设置JDK环境变量
vim /ect/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
 
suorce /etc/profile.d/java.sh
java -version
 /etc/profile
 
 
4.安装启动Tomcat
cd /opt
tar zcvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/lcoal/tomcat/bin/startup.sh 
或
/usr/lcoal/tomcat/bin/catalina.sh strat
	
#前台启动
/usr/local/tomcat/bin/catalina.sh run		
 
netatst -antp | grep 8080

(2)部署192.168.174.17的tomcat server

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
      
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>

3.部署192.168.174.16 七层反向代理(nginx服务已开启)(50)

(1)配置:


1.关闭防火墙,将安装nginx所需软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0    
2.安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum -y install pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 gcc gcc-c++ make
 
3.创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
 
4.编译安装Nginx
cd /opt
tar zxvf nginx-1.18.0.tar.gz -C /opt/
 
cd nginx-1.18.0/
./configure \
--prefix=/usr/local/nginx \							#指定nginx的安装路径
--user=nginx \										#指定用户名
--group=nginx \										#指定组名
--with-http_stub_status_module						#启用 http_stub_status_module 模块以支持状态统计
操作
 
make -j 2 && make install
 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
 
 
5.启动nginx
/usr/local/nginx/sbin/nginx  #启动nginx,使用绝对路径或者绝对路径

(2)可以给他加入到system中去管理:


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
 
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service

(3)配置图片

#准备静态页面和静态图片
mkdir /usr/local/nginx/html/img
cd /usr/local/nginx/html
vim sehun.html
<html>    
  <body> 
     <h1>this is nginx test web</h1>
     <img src="sehun_1.jpg" />
  </body>    
</html>

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream tomcat_server {
		server 192.168.174.17:8080 weight=1;
		server 192.168.174.15:8080 weight=1;
		server 192.168.174.15:8081 weight=1;
	}
	
	server {
		listen 80;
		server_name www.exo.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;
		}
......
	}
......
}

  • 测试静态页面效果,浏览器访问:

在这里插入图片描述

  • 测试负载均衡效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、总结:

1.动静分离是一种优化 Web 服务器性能的方式,它的基本思路是把动态的请求和静态的请求分别交给不同的服务器处理,从而减轻 Web 服务器的负担,提高网站的访问速度和同时响应用户数量。

2.动静分离的具体实现方式一般是将静态资源(如 HTML、CSS、JavaScript、图片、视频等)部署在 CDN 或独立的静态资源服务器上,而动态资源则部署在应用服务器上。这样做的好处是静态资源可以直接从 CDN 或静态资源服务器上获取,而不需要经过应用服务器的处理,从而提高了访问速度和并发访问能力。而应用服务器则专注于处理动态请求,提供业务逻辑的处理和数据查询等服务。

3.负载均衡是一种提高服务器可用性和性能的方式,它的基本思路是将大量的请求分摊到多个服务器上进行处理,从而降低单个服务器的负担和风险,提高整个系统的稳定性和可用性。

4.负载均衡的具体实现方式一般是将多台服务器组成一个服务器集群,通过负载均衡设备或软件来实现请求的分发,把请求转发到不同的服务器上进行处理。负载均衡设备可以根据服务器的配置、负载、响应时间等指标来动态调度请求,从而保证各个服务器的负载均衡,提高系统的运作效率和资源利用率。

.动静分离的具体实现方式一般是将静态资源(如 HTML、CSS、JavaScript、图片、视频等)部署在 CDN 或独立的静态资源服务器上,而动态资源则部署在应用服务器上。这样做的好处是静态资源可以直接从 CDN 或静态资源服务器上获取,而不需要经过应用服务器的处理,从而提高了访问速度和并发访问能力。而应用服务器则专注于处理动态请求,提供业务逻辑的处理和数据查询等服务。

3.负载均衡是一种提高服务器可用性和性能的方式,它的基本思路是将大量的请求分摊到多个服务器上进行处理,从而降低单个服务器的负担和风险,提高整个系统的稳定性和可用性。

4.负载均衡的具体实现方式一般是将多台服务器组成一个服务器集群,通过负载均衡设备或软件来实现请求的分发,把请求转发到不同的服务器上进行处理。负载均衡设备可以根据服务器的配置、负载、响应时间等指标来动态调度请求,从而保证各个服务器的负载均衡,提高系统的运作效率和资源利用率。

5.动静分离和负载均衡都是常见的 Web 服务器优化技术,它们可以相互结合使用,共同提高服务器的性能和可用性。

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

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

相关文章

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

目录 1.部署nginx 2.部署两台tomcat 3.配置nginx 1.部署nginx vim /vim/lib/systemd/system/nginx.service 2.部署两台tomcat 进入第一台装第一个tomcat vim /etc/profile vim /usr/local/tomcat/webapps/test/index.jsp 重启 进入第二台安装第二台tomcat vim /usr/local/tom…

【电路原理学习笔记】第2章:电压、电流和电阻:2.1 原子结构

第2章&#xff1a;电压、电流和电阻 2.1 原子结构 元素&#xff1a;不能用化学方法分解成更简单形式的物质称为元素。原子&#xff1a;原子是体现元素特性的最小粒子。原子核&#xff1a;原子核由质子和中子组成&#xff0c;质子带有正电荷&#xff0c;中子呈中性。电子带有负…

原型模式的学习与使用

1、原型模式的学习 当我们需要创建一个对象&#xff0c;并且该对象的创建过程比较复杂或者耗时时&#xff0c;可以使用原型模式。原型模式通过复制现有对象的属性来创建新的对象&#xff0c;而不是从头开始创建。   在原型模式中&#xff0c;我们定义一个原型接口或抽象类&am…

CMU 15-445 -- Buffer Pool - 03

CMU 15-445 -- Buffer Pool - 03 引言Buffer PoolsBuffer Pool ManagerLock 和 Latch 的区别PAGE TABLE 和 PAGE DIRECTORYMultiple Buffer PoolsPrefetchingScan SharingBuffer Pool BypassOS Page Cache Buffer Replacement PoliciesLRUClockLRU 与 Clock 的问题LRU-KLocaliz…

如何优雅的将 Docker 镜像从 1.43G 瘦身到 22.4MB

Docker 镜像的大小对于系统的 CI/CD 等都有影响&#xff0c;尤其是云部署场景。我们在生产实践中都会做瘦身的操作&#xff0c;尽最大的可能使用 Size 小的镜像完成功能。下文是一个简单的 ReactJS 程序上线的瘦身体验&#xff0c;希望可以帮助大家找到镜像瘦身的方向和灵感。 …

Helm之深入浅出Kubernetes包管理工具使用

Chart 使用 作者:行癫(盗版必究) 一:Chart 模板使用 1.创建chart ​ templates目录包括了模板文件;当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates目录中;然后收集模板的结果并发送给Kubernetes ​ values.yaml 文件也导入到了模板;这个文件包含了c…

北京大学2016计算机学科夏令营上机考试

目录 A:分段函数【水题】 B:单词翻转【暴力不水】 C:反反复复【字符串】 D:文件结构“图”【图】 E:Exchange Rates【这不是我能做的】 F:Dungeon Master【没看懂题目什么意思】 G:重建二叉树【树】 A:分段函数【水题】 #include<iostream> using namespace std;…

如何自学入门网络安全/黑客?【建议收藏】

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

零基础学会Python编程——不同的运算:算术、关系与逻辑(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 学习目标 一. 运算 1.算术运算 2.加法运算 3.减法运算 4.乘法运算 5.除法…

Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解

文章目录 0. 前言1. 基本原理1.1 基于频道(Channel)的发布/订阅1.2 基于模式(Pattern)的发布/订阅 2. Redis 发布订阅实际应用2.1 Redis Sentinel2.1 SpringBoot Redis发布/订阅 3. Redis从入门到精通系列文章 0. 前言 发布订阅模式&#xff08;Publish-Subscribe Pattern&…

小而强大:通过容器化应用实现前端微服务

微服务架构是一种软件架构模式&#xff0c;用于构建复杂应用程序。它将一个大型的单体应用程序拆分为一组更小、更独立的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;并通过轻量级的通信机制进行交互。每个服务都专注于解决特定的业务功能或服务&#xff0c;并且…

Distractor-aware Siamese Networks for Visual Object Tracking(DaSiamRPN)

Distractor-aware Siamese Networks for Visual Object Tracking&#xff08;DaSiamRPN&#xff0c;ECCV2018&#xff09; 该论文针对以下三个问题&#xff0c;分别进行了改进&#xff1a; 常见的Siam类跟踪方法只能区分目标和无语义信息的背景&#xff08;即简单背景&#x…

MacBook(M1)上安装Ubuntu虚拟机

Mac&#xff08;M1&#xff09;上安装Ubuntu虚拟机 0.下载资料汇总 VMware Fusionhttps://www.vmware.com/products/fusion/fusion-evaluation.htmlubuntu-desktop-arm64.isohttps://cdimage.ubuntu.com/jammy/daily-live/current/ 1.安装VMware Mac版本的VMware叫 VMware …

SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks&#xff08;CVPR2019&#xff09; 为什么2018年提出的SiamRPN网络还在用老式的AlexNet作为Siamese Network的特征提取网络呢&#xff1f;其实SiamRPN也尝试过用ResNet替代AlexNet&#xff0c;但发现效…

gitlab使用教程

一&#xff1a;账号管理 1、管理员添加 gitlab的用户分为管理员用户和普通用户&#xff0c;在界面上管理员会多了如下图所示的管理员区域&#xff0c;管理员拥有用户管理的功能&#xff0c;普通用户没有此功能。 通过管理员区域的用户-添加用户&#xff0c;根据提示填写必要…

JVM02-JVM即时编译器JIT

1-类编译加载执行过程 先了解下Java从编译到运行的整个过程 类编译&#xff1a;在编写好代码之后&#xff0c;我们需要将 .java文件编译成 .class文件&#xff0c;才能在虚拟机上正常运行代码。文件的编译通常是由JDK中自带的Javac工具完成&#xff0c;一个简单的 .java文件&a…

使用Flutter开发俄罗斯方块小游戏

一、本篇文章主要是来讲解下俄罗斯方块游戏的开发思路&#xff08;当然可能不是最好的思路&#xff09;&#xff0c;博客文章顶部有代码&#xff08;仅供参考&#xff09; 二、效果图 视频效果图地址 三、UI页面思路拆解 游戏的主界面两部分组成&#xff0c;上面为15*10的格…

Proxyman 替换js

在真机排查问题时&#xff0c;js不能格式化&#xff0c;导致没法看问题出在那一行&#xff0c;此时可以用这个方法替换js。 方法&#xff1a; 安装proxyman后&#xff0c;以iOS设备为例&#xff0c;菜单-证书-在iOS上安装证书 电脑、真机连接同一个网络&#xff0c;配置代理&…

SparkCore

Spark是一种快速、通用、可扩展的大数据分析引擎 Spark的特点 Speed&#xff1a;快速高效 性能比Hadoop MapReduce快100倍。即便是不将数据cache到内存中&#xff0c;其速度也是MapReduce10 倍以上。 Ease of Use&#xff1a;简洁易用 Spark支持 Java、Scala、Python和R等…