Nginx 反向代理与负载均衡核心内容总结 - 实践

news/2025/9/30 13:08:27/文章来源:https://www.cnblogs.com/ljbguanli/p/19120924

Nginx 反向代理与负载均衡核心内容总结 - 实践

Nginx 反向代理与负载均衡核心内容总结

一、核心概念解析

1. 代理基础

代理是连接被代理角色与目标角色的渠道,类似专卖店作为厂家(被代理方)与用户(目标方)的中间枢纽,可分为正向代理与反向代理两种核心模式

2. 正向代理

3. 反向代理

  • 场景:Nginx 接收客户端请求后,按规则分发至后端多台业务服务器处理
  • 特点:客户端明确,但请求具体由哪台后端服务器处理未知;隐藏后端服务器信息,多用于服务器集群部署
  • 实际应用:常与正向代理结合使用 —— 正向代理客户端请求访问目标服务器,该目标服务器实为反向代理,连接多台真实业务服务器

二、Nginx 核心功能实现

1. 动静分离

  • 原理:反向代理时,静态资源直接从 Nginx 发布路径读取,无需请求后端服务器,提升响应效率。
  • 关键保障:需保证前后端程序一致性,可通过 Rsync 自动同步,或 NFS、MFS 分布式共享存储实现资源统一
  • 依赖模块:Http Proxy 模块为核心,常用proxy_pass(转发请求)和proxy_cache(缓存资源)指令;使用proxy_cache需安装时集成第三方ngx_cache_purge模块,用于清除指定 URL 缓存,安装命令为./configure --add-module=…/ngx_cache_purge-1.0 …

2. 负载均衡

三、Nginx 实战案例

1. 负载均衡配置案例

2. 动静分离配置案例

  • 环境扩展:新增 Tomcat 主机(192.168.100.40),部署测试页面(输出 “Hello World”)

  • 核心配置:定义静态资源集群(Rs1、Rs2)和 Tomcat 集群,通过不同location分发请求

    nginx

    http {upstream static {server 192.168.100.20;server 192.168.100.30;}upstream tomcat {server 192.168.100.40:8080;}server {listen 80;server_name localhost;location / {proxy_pass http://static; # 静态资源请求转发至static集群}location /test {proxy_pass http://tomcat; # 动态请求转发至Tomcat}}
    }
  • 测试效果:访问 Nginx 根路径获取静态页面,访问/test路径获取 Tomcat 动态页面,实现动静分离

具体详细示例:

三台主机都关闭防火墙和selinux,还需要配置好yum仓库

nginx主机已部署nginx服务

rs1主机上,安装httpd,然后添加一个测试网页:

[root@rs1 ~]# cd /etc/yum.repos.d/
[root@rs1 yum.repos.d]# ls
sy.repo
[root@rs1 yum.repos.d]# cat sy.repo
[aa]
name=aa1
baseurl=file:///mnt
enabled=1
gpgcheck=0
[root@rs1 yum.repos.d]# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
[root@rs1 yum.repos.d]# yum -y install httpd
[root@rs1 yum.repos.d]# echo "RS1" > /var/www/html/index.html
[root@rs1 yum.repos.d]# systemctl restart httpd
[root@rs1 yum.repos.d]# systemctl enable httpd

rs2主机上,安装httpd,然后添加一个测试网页:

[root@rs2 ~]# cd /etc/yum.repos.d/
[root@rs2 yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo
[root@rs2 yum.repos.d]# rm -rf *
[root@rs2 yum.repos.d]# vim sy.repo
[aa]
name=aa1
baseurl=file:///mnt
enabled=1
gpgcheck=0
~
[root@rs2 yum.repos.d]# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
[root@rs2 yum.repos.d]# yum -y install httpd
[root@rs2 yum.repos.d]# echo "RS2" > /var/www/html/index.html
[root@rs2 yum.repos.d]# systemctl restart httpd
[root@rs2 yum.repos.d]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

在nginx主机上,修改配置文件,设置负载均衡

在http{}中配置upstream:

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;upstream webserver {server 192.168.100.20;server 192.168.100.30;}location / {proxy_pass http://webserver;}

测试配置文件是否正确,然后重载nginx:

[root@nginx ~]# 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@nginx ~]# nginx -s reload

测试访问:

在这里插入图片描述

在这里插入图片描述

设置权重,如果想其中一台后端真实服务器,多承担一些访问量,可以去设置weight权重:

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;upstream webserver {server 192.168.100.20 weight=2;server 192.168.100.30;}

重载nginx并测试访问,此时会发现100.20主机(rs1),访问时,访问的2次后,才轮询到rs2中:

[root@nginx ~]# nginx -s reload

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三台主机都是使用80端口,所以,在nginx配置文件中的upstream中,对应的真实后端服务器,我们并没有设置端口。如果其中某台后端服务器使用8080端口呢?我们如何进行设置,rs1为8080端口,rs2为80端口

首先修改rs1的httpd服务,侦听8080端口,并重启httpd服务:

[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@rs1 ~]# systemctl restart httpd

在nginx中:

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;upstream webserver {server 192.168.100.20:8080;server 192.168.100.30;}
[root@nginx ~]# nginx -s reload

测试访问:

在这里插入图片描述

在这里插入图片描述

ip_hash配置:

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;upstream webserver {ip_hash;server 192.168.100.20:8080;server 192.168.100.30;}
[root@nginx ~]# nginx -s reload

在这里插入图片描述

在这里插入图片描述

ip_hash这种负载均衡模式根据个人理解就是:例如多个用户通过nginx访问到了后端的httpd集群中,这个时候因为有不同用户,所以ip也不同,ip+hash算法计算的hash值都传到了httpd,nginx就记录了这个ip和hash值,那么下次同一个ip过来还是会分配到这个httpd的

如果在集群中的某台服务器出现故障,我们想要从nginx的集群配置中移除掉,我们不可以直接的将那一行删掉,比如server 192.168.100.10:8080 weight=2;删掉,如果直接删掉会导致nginx的hash算法重新计算,那么用户的会话或者说缓存都会失效掉,所以这里如果不用这台服务器,直接比较为down即可,也就是 server 192.168.100.10:8080 down 这么做就可以了

动静分离nginx+tomcat 还是基于上面的环境添加一台tomcat

Tomcat:192.168.100.40

部署tomcat:

上传压缩包并解压:

[root@client ~]# rz -E
rz waiting to receive.
[root@client ~]# ls
anaconda-ks.cfg               Documents             Music     Templates
apache-tomcat-10.0.23.tar.gz  Downloads             Pictures  Videos
Desktop                       initial-setup-ks.cfg  Public
[root@client ~]# tar -zxvf apache-tomcat-10.0.23.tar.gz -C /usr/local/
[root@client ~]# cd /usr/local/
[root@client local]# ls
apache-tomcat-10.0.23  bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@client local]# ln -s apache-tomcat-10.0.23/ tomcat
[root@client local]# cd tomcat/
[root@client tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
[root@client tomcat]# cd webapps/
[root@client webapps]# ls
docs  examples  host-manager  manager  ROOT
[root@client webapps]# cd ROOT/
[root@client ROOT]# ls
asf-logo-wide.svg  bg-middle.png  bg-upper.png  index.jsp          tomcat.css  WEB-INF
bg-button.png      bg-nav.png     favicon.ico   RELEASE-NOTES.txt  tomcat.svg
[root@client ROOT]# ls
asf-logo-wide.svg  bg-middle.png  bg-upper.png  index.jsp          tomcat.css  WEB-INF
bg-button.png      bg-nav.png     favicon.ico   RELEASE-NOTES.txt  tomcat.svg
[root@client ROOT]# cp index.jsp index.jsp.bak
[root@client ROOT]# vim index.jsptest page<%out.println("Hello,World");%>~
[root@client ROOT]# cd ..
[root@client webapps]# cd ..
[root@client tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
[root@client tomcat]# bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@client tomcat]# ss -anlt
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128               *:111                           *:*
LISTEN     0      128               *:6000                          *:*
LISTEN     0      5      192.168.122.1:53                            *:*
LISTEN     0      128               *:22                            *:*
LISTEN     0      128       127.0.0.1:631                           *:*
LISTEN     0      100       127.0.0.1:25                            *:*
LISTEN     0      128       127.0.0.1:6010                          *:*
LISTEN     0      128              :::111                          :::*
LISTEN     0      100              :::8080                         :::*
LISTEN     0      128              :::6000                         :::*
LISTEN     0      128              :::22                           :::*
LISTEN     0      128             ::1:631                          :::*
LISTEN     0      100             ::1:25                           :::*
LISTEN     0      128             ::1:6010                         :::*
LISTEN     0      1      ::ffff:127.0.0.1:8005                         :::*             [root@client webapps]# mkdir test
[root@client webapps]# cp ROOT/index.jsp test/

部署完成后,测试访问以下tomcat的测试网页:

在这里插入图片描述

配置nginx,设置动静分离:

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;upstream static {server 192.168.100.20;server 192.168.100.30;}upstream tomcat{server 192.168.100.40:8080;}server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {proxy_pass http://static;}location /test {proxy_pass http://tomcat;}
[root@nginx ~]# nginx -s reload

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

没有网站的域名佛山网站搜索排名

Servlet是运行在Web服务器或应用服务器上的java程序&#xff0c;它是一个中间层&#xff0c;负责连接来自web浏览器或其他HTTP客户程序和[HTTP服务器]上应用程序 Servlet执行下面的任务: 1&#xff09;读取客户发送的显示数据。 2&#xff09;读取由浏览器发送的隐式请求数据。…

自己注册了个域名想做一个网站网站建设属于服务还是货物

模块简介&#xff1a; requests 库是一个 python中比较有名的 http请求的库&#xff0c;能处理 get,post,put,delete 等 restful请求&#xff0c;能设置 header&#xff0c;cookie,session 等操作&#xff0c;也是作为爬虫的基础库&#xff0c;它目前还不能异步请求,如果要支持…

海口 做网站百度搜一下

一、GoLand显示环境如下 修改环境变量 新建系统变量 GOROOT&#xff1a; D:\ENSPACE\golandsdk\1.23.1\go1.23.1新建系统变量 GOPATH&#xff1a;工作目录&#xff08;在下面目录下新建目录&#xff1a;src,项目工程目录都要建在src下如&#xff1a;demo1 demo2&#xff09; D…

这款免费Windows优化神器!只有5M电脑绿色工具!ZyperWin++下载安装教程

软件介绍 今天给大家安利一款我最近发现的宝藏软件,ZyperWinOptimize(ZyperWin++)是一款开源的 Windows 优化工具,基于 .NET + SunnyUI 的开源、轻量级 Windows 系统优化工具,适用于 Windows 7 至 Windows 11 系统…

完整教程:Clustering|聚类

完整教程:Clustering|聚类pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

网站制作可以询价么找建筑类工作哪个网站好

感受好久没写中文技术文章了。说实话&#xff0c;学东西都是基于英文&#xff0c;或者 别人从英文翻译成中文 咱们再捡二手货学习。因此用中文写技术文章怎么都感受是在骗人&#xff0c;怎么都以为很别扭。编程可是这一次的主角是百度。框架虽然认真来说&#xff0c;全部编程语…

深入解析:DAY 04 CSS文本,字体属性以及选择器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

原核蛋白表达与真核蛋白表达的差异选择

原核蛋白表达与真核蛋白表达的差异选择 重组蛋白表达是现代分子生物学、结构生物学和生物制药研究中的核心技术。不同蛋白(尤其是真核来源的蛋白)在异源表达时可能面临折叠、修饰、毒性、可溶性、活性保持等挑战。常…

网站开发找哪家好产品做网站推广

题目链接&#xff1a;https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意&#xff1a;一个长度为n的数组&#xff0c;数组的元素都在[L,R]之间&#xff0c;并且数组全部元素的和可以被3整除&#xff0c;问有多少种方法构建出该数组。答案模1000000007 例 输…

企业网站应该找谁做seo排名教程技术

1、位存储 只有0和1两种状态&#xff01; Bitmap 位图&#xff1a;数据结构&#xff0c;都是操作二进制位来进行记录 登录/未登录 活跃/不活跃 打卡 两个状态的都可以使用Bitmap&#xff01; 2、常用命令 2.1、用Bitmap来记录 周一到周日的登陆情况 127.0.0.1:6379> …

【MacOS】彻底卸载Navicat

sudo rm -Rf /Applications/Navicat\ Premium.appsudo rm -Rf /private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.playlistsudo rm -Rf ~/Library/Caches/com.apple.hel…

SpringAI 实战:解除 Netty 超时难题,优化 OpenAiApi 配置

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

泛型类型参数

泛型类型参数在Java泛型中,"T" 是一个类型参数的占位符,代表"Type"。它是一个约定俗成的命名方式:T:Type(类型)E:Element(元素)K:Key(键)V:Value(值)N:Number(数字)

哪些网站可以做一些任务挣钱网站前台做哪些工作

动态路由协议/静态路由协议 静态路由协议和动态路由协议的区别&#xff1a; 静态路由协议的缺点&#xff1a; 配置繁琐 针对拓扑的变化不能够自动收敛 只适用于小型网络 静态路由协议优点&#xff1a; 占用资源少 安全 稳定 动态路由协议的优点&#xff1a; 配置简单 针对拓…

CF1584E Game with Stones 题解

Sol 考虑一个区间 \([l,r]\) 要如何才能合法。 显然 \(l\) 只能和 \(l+1\) 消耗,所以 \(a_{l+1}\ge a_l\)。 然后接着让 \(l+1\) 和 \(l+2\) 消耗,所以 \(a_{l+2}\ge a_{l+1}-a_l\)。 以此类推 \(a_{i}\ge a_{i-1}-a…

做网站用什么插件使用html制作个人主页

目录 一、基础知识 二、两类密钥体制 三、数字签名实现功能 四、鉴别 五、密钥分配 六、互联网使用的安全协议 6.1网络层安全协议 6.2传输层安全协议 七、系统安全 7.1防火墙 7.2入侵检测系统 一、基础知识 计算机网络的通信方面面临两大类威胁&#xff1a;被动攻击…

高德解包和打包报错

解包和打包报错 解包报错 PS D:\code\amapauto-editor\resources> java -jar apktool.jar d gaode.apk -f I: Using Apktool 2.12.1 on gaode.apk with 8 threads I: Baksmaling classes.dex... I: Loading resourc…

用友U8Api 接口对接

U8 API接口集成主要用于第三方系统与用友U8ERP系统进行数据交互,实现业务系统对接 文档中接口集成了用友U8各个版本的数据对接功能,支持U8.9到 U818.0版本要求,摒弃了eai、openapi、api、暴力插库等接口的方式,全部…

实用指南:如何在WordPress中添加短代码

实用指南:如何在WordPress中添加短代码pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

填坑:VC++ 采用OpenSSL 3.0接口方式生成RSA密钥 - 教程

填坑:VC++ 采用OpenSSL 3.0接口方式生成RSA密钥 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…