Nginx的性能分析与调优简介

Nginx的性能分析与调优简介

一、Nginx的用途

‌Nginx是一种高性能的HTTP和反向代理服务器,最初作为HTTP服务器开发,主要用于服务静态内容如HTML文件、图像、视频等。与传统的Apache相比,Nginx在处理静态文件时表现出色,因为它采用了事件驱动的架构,能够处理大量的并发连接而不会消耗过多的资源。此外,Nginx还可以作为反向代理服务器,接收客户端请求并将其转发到后端服务器处理,从而提高系统的可用性和性能。‌

Nginx还具备强大的负载均衡功能,可以将客户端请求分发到多个后端服务器,支持多种负载均衡算法,如轮询、最少连接和IP哈希等,从而实现高可用性和扩展性。作为缓存服务器,Nginx可以缓存静态内容和动态生成的页面,减少对后端服务器的请求数量,提高网站的响应速度。

Nginx也属于一种Web中间件[1](#1),Nginx不管是在作为Web静态资源访问管理,或者作为动态的请求代理,性能都是非常高效的。当然Nginx有时候也会存在性能瓶颈,需要进行性能分析和调优以支持更高的并发处理能力。

二、Nginx负载均衡策略介绍与调优

在一般情况下,Web中间件最大的作用就是负责对请求进行分发,也就是我们常说的起到负载均衡的作用。当然负载均衡只是 Nginx的作用之一,Nginx常见的负载均衡策略一般包括轮询、指定权重(weight)、ip_hash、least_conn、fair、url_hash等六种。

其中默认执行的策略为轮询,fair和url_hash属于第三方策略,这两种策略不是Nginx自带支持的策略,需要安装第三方的插件来辅助支持。在不同的场景下,每一种策略的选择对系统的整体性能影响都非常大,一般建议根据实际场景和服务器配置来选择对应的负载均衡策略。

序号 策略 配置方式 应用场景 简而言之
1 轮询(默认执行) 如果在upstream中没有指定其他任何的策略时,Nginx会自动执行轮询转发策略,upstream中配置每台服务器的权重都一样,会按照顺序依次转发 upstream中配置指定的服务器进行轮询,请求会按照接收到的顺序,依次轮询地转发给对应的服务器进行执行;Nginx能自动感知需要转发到的后端服务器是否挂掉,如果挂掉,Nginx会自动将那台挂掉的服务器从upstream中剔除 平均转发请求
2 指定权重 通过在upstream配置中给相应的服务器指定weight权重参数来实现按照权重分发请求 weight参数值的大小和请求转发比率成正比,该配置一般用于后端应用程序服务器硬件配置差异大而导致承受的访问压力不一样的情况 按照指定权重比转发请求
3 ip_hash 通过在upstream配置ip_hash参数 每个请求按原始访问ip的hash结果来进行请求转发,由于同一个ip的hash值肯定是不变的,这样每个固定客户端就会只访问一个后端应用程序服务器,该配置一般可解决多个应用程序服务器的session复制和同步的问题,因为同一个ip的请求都转发到了同一台服务器的应用程序上了,所以也就不会有session不同步的问题了。但是这可能会导致后端应用服务器的负载不均的情况,因为在这种策略下后端应用服务器收到的请求数肯定很难一样多 按照ip_hash转发请求主要解决session不同步问题
4 least_conn 通过在upstream配置中增加least_conn配置 Nginx在接收到请求后会把请求转发给连接数较少的后端应用程序服务器 请求优先转发给连接数较少的服务器
5 fair fair属于第三方策略,即不是Nginx本身自带的策略,需要安装对应的第三方插件 fair是按照服务器端的响应时间来分配请求给后端应用程序服务器,响应时间短的优先分配 响应时间短的优先分配
6 url_hash url_hash属于第三方策略,也是需要安装对应的第三方插件 url_hash是按照访问的目标url的hash值来分配请求,使同一个url的请求转发到同一个后端应用程序服务器,请求的分发策略和ip_hash有点类似;在进行性能调优时,主要是适用对缓存命中进行调优,同一个资源(也就是同一个目标url地址)多次请求,可能会到达不同的后端应用程序服务器上,会导致不必要的多次下载。使用url_hash后,可以使得同一个目标url(也就是同一个资源请求)会到达同一台后端应用程序服务器,这样可以在服务端进行资源 缓存,再次收到请求后,就可以直接从缓存中读取了 按照url_hash转发请求主要适用于缓存命中调优

使用轮询策略时,其他非必填的辅助参数

三、其他调优方式简介

序号 调优方式 应用场景 备注
1 进程数的配置调优 可以配置worker进程数=CPU的核数或者CPU的核数的两倍,还可以将每一个worker进程绑定到不同的CPU核上,这样可以避免出现CPU的争抢 Nginx服务启动后会包括两个重要的进程:(1)master进程:可以控制Nginx服务的启动、停止、重启、配置文件的重新加载。(2)worker进程处理用户请求信息,将收到的用户请求转发到后端应用服务器上。
2 事件处理模型调优 为了性能得到最优处理,Nginx的连接处理机制在不同的操作系统中一般会采用不同的I/O事件模型 在Linux操作系统中,一般使用epoll的I/O多路复用模型;在FreeBSD操作系统中,使用kqueue 的I/O多路复用模型;在Solaris操作系统中,使用/dev/pool方式的 I/O多路复用模型;在Windows操作系统中,使用的icop模型。在实际使用Nginx时,我们也是需要根据不同的操作系统来选择事件处理模型
3 客户端连接数调优 配置Nginx单个进程允许的客户端最大连接数、配置Nginx worker进程可以打开的最大文件数
4 文件传输性能调优 可以通过修改在nginx.conf配置文件中参数配置进行调优,例如:sendfile、tcp_nopush、tcp_nodelay参数
5 FastCGI配置调优 Nginx本身并不支持对外部动态程序的直接调用或者解析,所有的外部编程语言编写的程序(比如Python、PHP)必须通过FastCGI接口才能调用,可以通过配置FastCGI相关参数进行调优 FastCGI是一个传输快速可伸缩的、用于HTTP服务 器和动态脚本语言间通信的接口,它为所有Internet应用程 序提供了 高性能 , 而不受 Web服务器 API 的限制 。 包括Apache、Nginx在内的大多数Web服务都支持FastCGI,同时FastCGI也被许多脚本语言(例如Python、PHP等)所支持。

--补充

客户端连接数调优方式:

1、配置Nginx单个进程允许的客户端最大连接数:

可以修改Nginx中的nginx.conf配置文件中的配置

复制代码
events #可以设置Nginx的工作模式以及连接数上限
 {
	 worker_connections 1024;
 }

2、配置Nginx worker进程可以打开的最大文件数:

可以修改Nginx中的nginx.conf配置文件中的配置

worker_processes 2;

worker_rlimit_nofile 2048; # 设置worker进程可以打开的文件数

四、Nginx的性能监控

Nginx自带了监控模块,但是需要在Nginx编译安装时指定安装监控模块。默认情况下是不会安装该监控模块的,需要指定的编译参数为--with-http_stub_status_module。

编译安装完成后,Nginx的配置文件nginx.conf中还是不会开启监控,需要在配置文件中增加如下配置,其中allow 192.168.1.102 代表允许访问监控页面的IP地址

修改完配置文件后,通过执行nginx-s reload来重新加载配置信息,然后通过访问http://nginx服务器IP地址:端口号/nginx_status 就可以进入监控页面了

参考书籍《软件性能测试、分析与调优实践之路》

wuu~~又是学到东西的一天!

给自己点个赞!!!


  1. Web中间件一般主要负责静态资源(也可以称作静态请求)的处理和动态请求的转发,而动态请求一般都是由应用中间件来进行处理的。 ↩︎
相关推荐
stark张宇15 小时前
攻克 CRMRB 部署难点:从 PHP 扩展、数据库配置到进程守护
nginx·centos·php
罗政16 小时前
【免费】轻量级服务器centos监控程序+内存+cpu+nginx+适合小型站长使用
服务器·nginx·centos
椎4951 天前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
2301_787328491 天前
25.负载均衡-Nginx、HAProxy、LVS 全解析
nginx·负载均衡·lvs
siriuuus1 天前
Nginx 负载均衡调度算法
运维·nginx·负载均衡
tjsoft2 天前
设置 windows nginx.exe 每天 重启
运维·windows·nginx
舰长1152 天前
nginx 负载均衡配置
运维·nginx·负载均衡
foundbug9992 天前
查看nginx日志文件
linux·nginx·github
一只程序烽.3 天前
java项目使用宝塔面板部署服务器nginx不能反向代理找到图片资源
java·服务器·nginx
福大大架构师每日一题3 天前
nginx 1.29.2 发布:AWS-LC 支持、QUIC及SSL优化等重要更新
nginx·ssl·aws