| 关键词: Nginx 配置 缓存 请求 文件 keepalived localhost proxy 压缩 开启 | |||
引言 早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
因此在这种背景下,引入负载均衡技术可带来的收益:
OK~,既然引入负载均衡技术可给我们带来如此巨大的好处,那么又有那些方案可供选择呢?主要有两种负载方案,「「硬件层面与软件层面」」 ,比较常用的硬件负载器有A10、F5等,但这些机器动辄大几万乃至几十万的成本,因此一般大型企业会采用该方案,如银行、国企、央企等。而成本有限,但依旧想做负载均衡的项目,那么可在软件层面实现,如典型的Nginx等,软件层的负载也是本文的重点,毕竟Boss们的准则之一就是:「「能靠技术实现的就尽量不花钱。」」
一、性能怪兽-Nginx概念深入浅出 Nginx是目前负载均衡技术中的主流方案,几乎绝大部分项目都会使用它,Nginx是一个轻量级的高性能HTTP反向代理服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。 Nginx与Redis相同,都是基于多路复用模型构建出的产物,因此它与Redis同样具备 「「资源占用少、并发支持高」」 的特点,在理论上单节点的Nginx同时支持5W并发连接,而实际生产环境中,硬件基础到位再结合简单调优后确实能达到该数值。 先来看看Nginx引入前后,客户端请求处理流程的对比: ![]() 原本客户端是直接请求目标服务器,由目标服务器直接完成请求处理工作,但加入Nginx后,所有的请求会先经过Nginx,再由其进行分发到具体的服务器处理,处理完成后再返回Nginx,最后由Nginx将最终的响应结果返回给客户端。 了解了Nginx的基本概念后,再来快速搭建一下环境,以及了解一些Nginx的高级特性,如动静分离、资源压缩、缓存配置、IP黑名单、高可用保障等。 二、Nginx环境搭建 首先创建Nginx的目录并进入: 下载Nginx的安装包,可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包: 没有wget命令的可通过yum命令安装: 解压Nginx的压缩包: 下载并安装Nginx所需的依赖库和包: 也可以通过yum命令一键下载(推荐上面哪种方式): 执行完成后,然后ls查看目录文件,会看一大堆依赖: ![]() 紧接着通过rpm命令依次将依赖包一个个构建,或者通过如下指令一键安装所有依赖包: 进入解压后的nginx目录,然后执行Nginx的配置脚本,为后续的安装提前配置好环境,默认位于/usr/local/nginx/目录下(可自定义目录): 编译并安装Nginx: 最后回到前面的/soft/nginx/目录,输入ls即可看见安装nginx完成后生成的文件。 修改安装后生成的conf目录下的nginx.conf配置文件: 制定配置文件并启动Nginx: Nginx其他操作命令: 开放80端口,并更新防火墙: 在Windows/Mac的浏览器中,直接输入刚刚配置的IP地址访问Nginx: ![]() 最终看到如上的Nginx欢迎界面,代表Nginx安装完成。推荐:Java面试题 三、Nginx反向代理-负载均衡 首先通过SpringBoot+Freemarker快速搭建一个WEB项目:springboot-web-nginx,然后在该项目中,创建一个IndexNginxController.java文件,逻辑如下: 在该Controller类中,存在一个成员变量:port,它的值即是从application.properties配置文件中获取server.port值。当出现访问/资源的请求时,跳转前端index页面,并将该值携带返回。 前端的index.ftl文件代码如下: 从上可以看出其逻辑并不复杂,仅是从响应中获取了port输出。 OK~,前提工作准备就绪后,再简单修改一下nginx.conf的配置即可:
最终来看看效果: ![]() 负载均衡效果-动图演示 因为配置了请求分发的权重,8080、8090的权重比为2:1,因此请求会根据权重比均摊到每台机器,也就是8080一次、8090两次、8080一次...... Nginx请求分发原理 客户端发出的请求192.168.12.129最终会转变为:http://192.168.12.129:80/,然后再向目标IP发起请求,流程如下: ![]() 请求分发原理
四、Nginx动静分离 动静分离应该是听的次数较多的性能优化方案,那先思考一个问题:「「为什么需要做动静分离呢?它带来的好处是什么?」」 其实这个问题也并不难回答,当你搞懂了网站的本质后,自然就理解了动静分离的重要性。先来以淘宝为例分析看看: ![]() 淘宝首页 当浏览器输入www.taobao.com访问淘宝首页时,打开开发者调试工具可以很明显的看到,首页加载会出现100+的请求数,而正常项目开发时,静态资源一般会放入到resources/static/目录下: ![]() IDEA 工程结构 在项目上线部署时,这些静态资源会一起打成包,那此时思考一个问题:「「假设淘宝也是这样干的,那么首页加载时的请求最终会去到哪儿被处理?」」 答案毋庸置疑,首页100+的所有请求都会来到部署WEB服务的机器处理,那则代表着一个客户端请求淘宝首页,就会对后端服务器造成100+的并发请求。毫无疑问,这对于后端服务器的压力是尤为巨大的。
既然有这么多请求属于静态的,这些资源大概率情况下,长时间也不会出现变动,那为何还要让这些请求到后端再处理呢?能不能在此之前就提前处理掉?当然OK,因此经过分析之后能够明确一点:「「做了动静分离之后,至少能够让后端服务减少一半以上的并发量。」」 到此时大家应该明白了动静分离能够带来的性能收益究竟有多大。 OK~,搞清楚动静分离的必要性之后,如何实现动静分离呢?其实非常简单,实战看看。 ①先在部署Nginx的机器,Nginx目录下创建一个目录static_resources: ②将项目中所有的静态资源全部拷贝到该目录下,而后将项目中的静态资源移除重新打包。 ③稍微修改一下nginx.conf的配置,增加一条location匹配规则: 然后照常启动nginx和移除了静态资源的WEB服务,你会发现原本的样式、js效果、图片等依旧有效,如下: ![]() 其中static目录下的nginx_style.css文件已被移除,但效果依旧存在(绿色字体+蓝色大边框): ![]() 移除后效果动图 最后解读一下那条location规则:
综上所述,简单一句话概述:该配置表示匹配以.html~.css为后缀的所有资源请求。 「最后提一嘴,也可以将静态资源上传到文件服务器中,然后location中配置一个新的upstream指向。」 五、Nginx资源压缩 建立在动静分离的基础之上,如果一个静态资源的Size越小,那么自然传输速度会更快,同时也会更节省带宽,因此我们在部署项目时,也可以通过Nginx对于静态资源实现压缩传输,一方面可以节省带宽资源,第二方面也可以加快响应速度并提升系统整体吞吐。 在Nginx也提供了三个支持资源压缩的模块ngx_http_gzip_module、ngx_http_gzip_static_module、ngx_http_gunzip_module,其中ngx_http_gzip_module属于内置模块,代表着可以直接使用该模块下的一些压缩指令,后续的资源压缩操作都基于该模块,先来看看压缩配置的一些参数/指令:
最新评论
72小时资讯榜
2
19岁黑客跨三国换IP狂奔,还是被Windows一
网安动态
382人已阅读
3
18K Star,让AI自己跑渗透测试,这个开源项
渗透测试
356人已阅读
4
一个 1.5B 的模型,把网络安全攻防都装进了
安全学院
402人已阅读
5
多家电商遭“银狐”木马攻击,央视披露细节
网安动态
592人已阅读
6
手机也能AI养龙虾:安卓和iOS版OpenClaw应
AI动态
566人已阅读
社区热门
1
━※☆※━★===二〇二六年论坛每日签到帖=
2026-03-13
4
从上大学一直玩黑基 到现在已经37岁 感谢黑
2025-06-03
6
好久没来这里了,居然能正常登录,佩服站长
2025-05-19
|