【运维】 第02讲(上):企业 Nginx 高性能优化配置实战总结

news2024/11/27 20:30:17

本课时讲解关于 Nginx 配置优化的内容,相信对于 Nginx 你一定并不陌生,它是一款轻量级的开源 Web 服务及代理程序。在 Nginx 出现之前市场上主流两款 Web 服务,一款是 Windows 系统上的 IIS,另外一款是 Linux 系统上的 Apache。而在 Nginx 诞生后,因其轻量化、支持高并发等特性,逐渐蚕食了这两款 Web 服务的市场份额。目前国内大量企业早已广泛的使用 Nginx。既然 Nginx 使用这么广泛,那么我们在运维工作中如何对其进行优化和配置便成了重中之重。

基础配置优化

在学习如何优化和配置 Nginx 之前,我们需要提前掌握一些基础知识,包括:

  • 熟悉 Linux 的基础操作;
  • 了解 Nginx 安装和基础配置;
  • 对 HTTP 请求过程有一定了解。

接下来的课程内容会涉及以上这三点知识内容,但是不会像初学那样面面俱到来讲,所以希望遇到疑问时再回来按照这三个方面提前巩固基础知识。

Nginx 的优化这个课时主要内容分为两部分来讲,一部分是基础配置优化,另外一部分是缓存配置优化,本课时我们主要学习基础配置优化的部分。

基础配置优化主要包括:

  • CPU亲和性优化;
  • Nginx 模型优化;
  • Nginx 传输方式优化;
  • Nginx 文件压缩优化。

在 Nginx 用于普通的绝大部分 Web 服务时这些优化场景都是需要了解的。

CPU 亲和性

那么,首先来介绍的是 Nginx 的 CPU 亲和性。

所谓的 CPU 亲和性是作什么呢?现在的CPU通常是多核的,并可以通过超线程来虚拟更多核数 ,那亲和力就是为多核 CPU 需做到让 Nginx 服务充分的配合使用,从而提高性能。 Ngin x运行时会启用 1 个 master 进程及多个 worker 进程,worker 进程负责处理请求,如果 worker 进程在多核 CPU 中发生频繁的调度就会损耗性能。在这种情况下,我们希望减少这种频繁调度,让每一个 Nginx 的 worker 线程都能够固定到具体的 CPU 核心上,所以就需要配置 Nginx 的 CPU 亲和性来解决这个问题。

接下来讲一下具体配置方式,那由于 Nginx CPU 亲和性配置本身有多套配置方案,这里推荐你直接将配置项设置成 auto(worker_cpu_affinity ),即采用了 Nginx 推荐的 CPU 绑核策略方式。另外的一个方式是手动绑定,将 worker 线程数量与 CPU 核心数一一绑定方式设置。我们设置成 auto Nginx 会自动识别并按照推荐策略来分配 worker 线程和 CPU。

在这里插入图片描述

如图所示,我们看到 CPU 的核心有 8 个,即 CPU0~CPU7,如果我们设置成 auto 后,那么 Nginx 会将 8 个 worker 线程一对一地按照推荐策略绑定到 CPU 核心上,这样避免 CPU 频繁对 worker 线程进行调度,从而降低 CPU 损耗。

IO 流事件模型

Nginx 第二个基础配置优化项是 IO 流事件模型,我们经常可以在 Nginx 下面看到的 events 配置模块中默认设置了 use epoll,表示 Nginx 使用 epoll 这个 IO 流事件模型,那为什么 Nginx 会选择使用 epoll 呢?这是因为 epoll 有以下这些得天独厚的优势。我们来详细讲解一下:

  1. 首先,Linux 系统下一切皆文件,比如我们打开一个设备,它便会产生一个文件描述符。在产生一个进程时,这个进程便需要一个进程描述符,这个进程描述符也是一个文件。所以在 Nginx 处理请求的时候,每一个请求都会产生处理请求的描述符。

  2. 其次,在 Nginx 处理大规模请求的时候,为了提高并发效率需要采用异步非阻塞模型,这又和 epoll 有什么关系呢?epoll 本身是以异步非阻塞模型来处理请求流中的事件流。

这里还需要注意一点,并不是所有的 Linux 操作系统都可以使用 epoll,它是在 kernel 2.6 版本以后提出的,早期内核使用的 select\poll 模型,select 模型比 epoll 模型性能要低很多,有经验的运维同学一定深有体会。

通过上面的背景铺垫,我们再来详细介绍下 epoll 相比于 select 模型具备的优势:

  • epoll 处理事件流模型是线程安全的;
  • epoll 跟 select 模型相比调用 fd 文件描述符时使用了 mmap 共享用户和内核的部分空间,提高了效率;
  • epoll 是基于事件驱动的,相比 select 需要扫描整个文件描述符的相关状态,epoll
    基于事件驱动避免频繁扫描文件描述符,可以直接调用 callback 回调函数,效率更高;
  • 取消了 select 模型里面单个进程能够监视的文件描述符的数量存在的最大限制(1024),如果你有使用过早期的 Apache
    版本的,它使用的select 模型,当请求超过 1000 以后就会出现延迟或者请求错误,而改用 Nginx 的话性能会得到明显的改善。

另外补充下,在 events{} 配置中还涉及一个优化的地方就是 worker_connections,这个也是在 events 里面来进行设置的,通过上面的学习我们知道了 worker 线程作用,那每一个 work线程所支持的连接是有限的,这里会默认设置成 1024,而我们在处理高并发的场景时,单个 worker 线程设置成 1024 的话往往偏低,这里建议你将 worker_connections 调大一些,你可以参考实际业务所需 Nginx 处理最大峰值来调大这个设置值。

零拷贝

第三个基础配置优化是零拷贝,所谓零拷贝的配置是在 Nginx 中的 HTTP 配置模块中添加一个 sendfile on 配置项,它便是一个零拷贝,所谓零拷贝并不代表不拷贝了,而是说它做到了文件的内核态到用户态的零拷贝。

在这里插入图片描述

如图所示,我们先来看下没有零拷贝时文件传输是什么样子的?首先 Nginx 在处理文件时,会将文件传入操作系统内核态的 Buffer Cache,然后传递到操作系统上层的用户态,经用户态的 Buffer Cache 再传回内核态中,最后通过 Socket 将文件转发出去。

这个时候你会发现一个问题,对于静态文件并不需要流转到用户态中,直接通过内核态效率更高,所以这时我们就需要在 Nginx 中开启 sendfile on,这样静态文件就可以通过红色的路径在内核态中完成转发,而不用再去绕道用户态,提高了效率。

文件压缩

Nginx 基础配置优化的最后一项是文件压缩,我们希望做到 Nginx 服务端往客户端发送的数据越小,占用的延迟越低用户体验便会越好。所以往往在代理或 Nginx 中会设置文件压缩,我们主要通过 gzip 方式进行设置,主要的设置项如下:

  • gzip on 负责打开后端的压缩功能;
  • gzip_buffer 16 8k 表示设置 Nginx 在处理文件压缩时的内存空间;
  • gzip_comp_level 6 表示 Nginx
    在处理压缩时的压缩等级,通常等级越高它的压缩比就越大,但并不是说压缩比越大越好,还是需要根据实际情况来选择合适的压缩比,压缩比太大影响性能,压缩比太小起不到应有的效果,一般来说推荐你设置成6 就比较合适;
  • gzip_http_version 1.1 表示只对 HTTP 1.1 版本的协议进行压缩;
  • gzip_min_length 256 表示只有大于最小的 256 字节长度时才进行压缩,如果小于该长度就不进行压缩;
  • gzip_proxied any 代表 Nginx 作为反向代理时依据后端服务器时返回信息设置一些 gzip 压缩策略;
  • gzip_vary on 表示是否发送 Vary:Accept_Encoding 响应头字段,实现通知接收方服务端作了 gzip 压缩;
  • application/vnd.ms-fontobject image/x-icon; gip 压缩类型;
  • gzip_disable “msie6”; 关闭 IE6 的压缩。

最后这两项表示设置 zip 的压缩类型及是否关闭 客户端使用 IE6 浏览器请求过来的压缩,以上就是对文件压缩的典型配置,你可以根据具体情况做一些细节上的调整。

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

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

相关文章

c++11 标准模板(STL)(std::basic_istream)(七)

定义于头文件 <istream>template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的…

​“你的期望薪资是多少?” Hr现身说法,以退为进多杀2k

面试是初见1小时就要相互了解优缺点的过程&#xff0c;在你问我答的交锋中如何不露声色、不卑不亢的展现自己&#xff0c;通过以下几个常见问题的拆解&#xff0c;你会得到答案的~ 1.你的期望薪资是多少&#xff1f; 菜鸟的回答:假设上家公司是10K&#xff0c;一般人会说我想…

命令行系列:windows cmd官方文档

官方文档 和java开发、Android开发一样。cmd也有官方文档&#xff1a; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/windows-commands 如下图&#xff0c;我们可以看到经典的cd,clean命令。 cd命令的全程是什么&#xff1f; cd命令…

基于51单片机的红外测温系统的设计与实现

功能框图 功能描述 本设计以STC89C52单片机为核心控制器&#xff0c;加上其他的模块一起组成非接触人体红外测温的整个系统&#xff0c;其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机&#xff0c;其主要作用是获取输入部分数据&#xff0c;经过内部处理…

基于SpringBoot+vue的校园闲置物品交易网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【测试开发】软件测试的常用概念

目录 一. 软件测试的生命周期 1. 需求分析 2. 测试计划 3. 测试设计&#xff0c;测试开发 4. 测试执行 5. 测试评估 ​编辑 二. 软件的生命周期 1. 需求分析 2. 计划阶段 3. 设计阶段 4. 编码阶段 5. 测试阶段 6. 运行维护 三. 如何描述一个BUG 1. 发现问题…

Mac 谷歌浏览器选中查看悬浮出现的元素样式

Mac 谷歌浏览选中查看悬浮出现的元素样式 1. Mac 暂停脚本执行快捷键 command \或F8 2.以斗鱼主站下载悬浮面板为例 3. 操作步骤 &#xff08;1&#xff09;打开控制台&#xff0c;选中源代码 &#xff08;2&#xff09;鼠标选中下载&#xff0c;让面板悬浮出来 &#xf…

网络安全面试题

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

Linux命令----modprobe命令详解

【原文链接】Linux命令----modprobe命令详解 一、modprobe命令的作用 加载内核模块&#xff1a; 使用modprobe命令可以加载指定的内核模块到运行中的内核中。加载内核模块可以在运行时添加新的功能、驱动程序或修改内核行为。 解决模块依赖关系&#xff1a; modprobe命令可以…

机器学习学习笔记——第二章:模型评估与选择

机器学习 机器学习学习笔记——第二章&#xff1a;模型评估与选择 文章目录 机器学习一、经验误差与过拟合1.1、经验误差与泛化误差1.2、过拟合与欠拟合 二、 三个问题三、评估方法3.1、留出法&#xff08;hold-out&#xff09;3.2、k折-交叉验证法&#xff08;k-fold cross v…

银河麒麟系统无法进入桌面拷贝备份文件

最近使用VMWare搭建银河麒麟系统升级后&#xff0c;无法进入桌面&#xff0c;而是进入tty1界面 这个时候如何想导出里面的文件就可以用文件共享的方式右键到虚拟机设置-选项&#xff0c;如图所示 选择一个共享目录 如d盘vm目录 登录tty1账号密码 ls列出文件 如图进行文件拷贝…

.NetCore录屏生成Gif动图程序(Form)的开发过程[代码已上传GitCode]

&#x1f32e;.NetCore录屏生成Gif动图程序(Form)的开发过程 前言: 开发环境&#xff1a;.NetCore3.1 GitCode地址&#xff1a;罗马苏丹默罕默德 / RecordDesktopGif GitCode FrameWork版本地址&#xff1a;尚未同步功能 实现功能 选中屏幕的一块矩形区域按照设置的参数录制…

Qt中QMainWindow的相关介绍

目录 菜单栏 工具栏 状态栏&#xff1a; 停靠窗口&#xff1a; QMainWindow 是标准基础窗口中结构最复杂的窗口&#xff0c;其组成如下: 提供了菜单栏 , 工具栏 , 状态栏 , 停靠窗口 菜单栏&#xff1a;只能有一个&#xff0c;位于窗口的最上方 工具栏&#xff1a;可以有多…

《爱的教育》超全思维导图

思维导图是帮助理解和记忆的高效生产力工具&#xff01; 思维导图以图形的形式表达信息&#xff0c;可视化和关联性&#xff0c;可以更好的激发创作和想象力。 在思维导图中&#xff0c;我们使用简洁的关键词或短语来表达思想&#xff0c;而不是完整的句子或段落。可以帮助我们…

MAYA鲨鱼的绑定

最后一个柚有问题 轴向正确的旋转&#xff0c;成C型 弄乱了 W整体移动 D单个移动 X轴没指向下一个关节 控制器创建 根控制器 控制器很好匹配关节 建组 出来了&#xff0c;控制器位置还在 确保旋转关节是0 处理层级 控制器不跟着 没办法刷蒙皮 # 错误: file: H:/Autodesk/May…

安达发|如何选择适合企业的APS排程系统?

APS是一个优化的排程调度工具&#xff0c;归根结底&#xff0c;APS追求的是企业生产效率的提升&#xff0c;而不是替代人工排程。如何验证呢&#xff1f;对于APS用户来说&#xff0c;检验衡量的最简单的方法就是&#xff0c;拿出过去某一个月实际生产计划的历史数据&#xff0c…

微信小程序创建步骤图文

1.登录微信公众平台 首先&#xff0c;通过网址登录https://mp.weixin.qq.com/&#xff0c;找到立即注册 进行点击。 2.进入该页面时&#xff0c;选择点击小程序 3.注册开发者账号点击立即注册 4.进入该页面 账号信息注册 5.下一步 邮箱激活 注意 &#xff1a;登录邮箱&…

【AntD】Antd Table组件的头部单元格水平居中,单元格居左:

文章目录 一、效果图:二、实现代码: 一、效果图: 二、实现代码: customHeaderCell: () > ({ style: { textAlign: center } }),//头部单元格水平居中

Vue3间距(Space)

可自定义设置以下属性&#xff1a; 对齐方式&#xff08;align&#xff09;&#xff0c;类型&#xff1a;‘start’|‘end’|‘center’|‘baseline’&#xff0c;默认 undefined间距方向&#xff08;direction&#xff09;&#xff0c;类型&#xff1a;‘horizontal’|‘vert…

小程序Url Link跳转怎么获取query参数?

onLoad(options){if (options) {let value1 decodeURIComponent(options.value1)let value2 decodeURIComponent(options.value2)...调用后台接口查询数据} } 我是通过这种方式接收参数的&#xff0c;如果想验证可以通过编译器模拟&#xff1a;