Nginx高并发,Nginx怎么设置才支持百万并发?

只知道 Nginx 牛逼,却不知道它怎么支持百万并发?

本文将深入探讨Nginx的关键技术和配置优化,帮助您更好地了解如何利用Nginx实现高性能的Web服务器。

近年来,Nginx作为一款备受推崇的开源、高性能、高可靠的Web和反向代理服务器,备受业界关注。其强大的性能和高并发能力使其成为许多互联网公司和知名网站的首选。但是,许多人对于Nginx如何支持百万级并发连接的内部工作原理却知之甚少。本文将深入探讨Nginx的关键技术,揭秘其支持百万级并发连接的秘密。

无论是运维、开发、测试,Nginx 技术栈的学习总是必不可少的,只是不同的岗位掌握的深度与广度不同而已。

什么是 Nginx?

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,支持热部署,几乎可以做到 7 * 24 小时不间断运行,还可在不间断服务的情况下对软件版本进行热更新。Nginx 性能非常牛逼,占用内存少、并发能力强、能支持高并发,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。最重要的是, Nginx 是免费开源的且可以商业化,配置使用也比较简单。

在中国有众多互联网大厂,如百度、京东、新浪、网易、腾讯等都在使用 Nginx,也有很多高知名度的国外网站也在使用 Nginx,比如:Netflix、GitHub、SoundCloud、MaxCDN等。

官方网站:http://www.nginx.org

Nginx 架构

Nginx的架构设计是支持高并发的基石。在启动时,Nginx会生成主进程(master)和工作进程(worker)。主进程负责调度工作进程,而工作进程则独立处理网络请求,每个工作进程都可以同时处理数以千计的网络请求。请查看以下示意图:

Nginx 架构示意图

Nginx 是如何支持百万并发?

Nginx 能够支持百万并发连接,主要通过以下几个方面来实现:

主进程与工作进程

Nginx 主进程与工作进程

当 Nginx 启动时,会生成主进程(master)和工作进程(worker)

root@nginx ~]# ps -ef|grep nginx
root       6324      1  0 09:06 ?        00:00:00 nginx: master process /usr/local/nginx-1.12.2/sbin/nginx
nobody     6325   6324  0 09:06 ?        00:00:00 nginx: worker process
root       6327   1244  0 09:06 pts/0    00:00:00 grep --color=auto ngin
  • 主进程主要负责调度工作进程(管理 Worker 进程),并不直接处理网络请求。

  • 工作进程(所有 Worker 进程都对等的)是实际处理网络请求及响应的进程,每个工作进程都是独立的,可同时处理数以千计的网络请求。

Master 工作过程细节

1. Master 建立 listen 的 socket (listenfd)

2. Master,fork 出 Worker 进程(fork:进程镜像)

3. 新请求到来时,所有 Worker 进程的 listenfd 都变为可读;

4. Worker 进程,竞争 accept_mutex,获胜的注册 listenfd 的读事件

5. Worker 进程,在读事件中,accept 当前连接,并处理请求

疑问:

1. listenfd, Master 和 Worker 共享一个?

2.accept mutex 在哪里?

Worker 工作过程细节:

1. 新请求到来时,所有 Worker 进程的 listenfd 都变为可读;

2. Worker 进程,竞争 accept_mutex,获胜的注册 llistenfd 的读事件

3. Worker 进程,在读事件中,accept 当前连接;

4. Worker 进程,读取请求、解析请求、处理请求、进行响应。

事件驱动模型

Nginx 的事件驱动模型由事件收集器、发送器和处理器三部分基本单元组成。

  • 事件收集器:收集 worker 进程的各种 IO 请求

  • 事件发送器:将 IO 事件发送到事件处理器

  • 事件处理器:处理各种事件的响应工作

Nginx 事件驱动架构是基于异步及非阻塞的方式,这种设计允许 Nginx 同时处理多个网络请求。

Ngxin 事件驱动模型

当一个客户端发起请求时,Nginx 会将该请求交给一个工作进程,由工作进程负责处理请求。工作进程采用异步方式处理请求,每个请求在一个单独的工作进程中处理,这样就不会因为一个请求的阻塞而影响其他请求的处理。因些,它可以同时处理多个客户端请求,从而提高了并发处理能力。

非阻塞IO

Nginx 在处理请求时采用了非阻塞 I/O 操作,这意味着它不会在等待 I/O 操作完成时阻塞进程。通过使用非阻塞 I/O,Nginx 可以同时处理多个 I/O 操作,从而提高了整体的处理能力。

如前面的图,事件发送器会将事件放入一个类似待处理的列表中,然后采用非非阻塞 I/O 方式来调用事件处理器来处理这个请求。

这种处理模式我们又将其称为“多路复用 I/O”,最常见的有括这三种:select 模型、poll模型、epoll 模型。

内存管理

Nginx 使用了强大内存池技术来管理内存,内存池中的内存块是预先分配的,避免了频繁的内存分配和释放操作,从而减少了内存分配和释放的开销,这样可以使 Nginx 在处理大量并发连接时更加高效。

负载均衡Nginx 可以作为反向代理服务器使用,将客户端请求转发给后端服务器处理。通过配置负载均衡策略,Nginx 可以将请求分发到多个后端服务器,进一步提高整体的处理能力,这也是它给支持百万并发的一大关键技术。
upstream server_pools { 
  server 192.168.1.100:8888   weight=5;
  server 192.168.1.101:9999   weight=5;
  server 192.168.1.102:6666   weight=5;
  #weigth参数表示权值,权值越高被分配到的几率越大
}
server {  
  listen 80; 
  server_name toymoban.com;
  location / {    
  proxy_pass http://server_pools; 
   }
}

Nginx 实现负载均衡的策略

  • 轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。
  • 最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。
  • 最快响应时间策略:优先分配给响应时间最短的服务器。
  • 客户端 ip 绑定策略:来自同一个 ip 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。

缓存

Nginx 支持缓存功能,Nginx 缓存作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。

我们可以通过 Nginx 配置将静态文件存储在本地磁盘上,直接提供给客户端,减少了请求后端服务器的次数,提高了性能和并发处理能力。
proxy_cache_path  #代理缓存的路径
#语法格式
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

proxy_cache #开启或关闭代理缓存
#语法格式
proxy_cache zone | off;  #zone为内存区域的名称,即上面中keys_zone设置的名称。

proxy_cache_key #定义如何生成缓存的键
#语法格式
proxy_cache_key string;  #string为生成Key的规则,如proxy_host$request_uri。

proxy_cache_valid  #缓存生效的状态码与过期时间。
#语法格式
proxy_cache_valid [code ...] time;  #code为状态码,time为有效时间,可以根据状态码设置不同的缓存时间。如:proxy_cache_valid 200 302 30m;

proxy_cache_min_uses #设置资源被请求多少次后被缓存。
#语法格式
proxy_cache_min_uses number;  #number为次数,默认为1。

proxy_cache_use_stale #当后端出现异常时,是否允许Nginx返回缓存作为响应。
#语法格式
proxy_cache_use_stale error;  #error为错误类型

proxy_cache_lock  #是否开启锁机制
#语法格式
proxy_cache_lock on | off;

proxy_cache_lock_timeout #配置锁超时机制,超出规定时间后会释放请求。
#语法格式
proxy_cache_lock_timeout time;

proxy_cache_methods #设置对于那些HTTP方法开启缓存。
#语法格式
proxy_cache_methods method;  #method为请求方法类型,如GET、HEAD等。

proxy_no_cache #设置不存储缓存的条件,符合时不会保存。
#语法格式
proxy_no_cache string...;  #string为条件,如arg_nocache $arg_comment;

proxy_cache_bypass  #设置不读取缓存的条件,符合时不会从缓存中读取。
#语法格式
proxy_cache_bypass string...;  #与上面proxy_no_cache的配置方法类似。

add_header  #配置往响应头中添加字段信息。
#语法格式
add_header fieldName fieldValue;

$upstream_cache_status #记录了缓存是否命中的信息,存在以下多种情况:

MISS:请求未命中缓存。
HIT:请求命中缓存。
EXPIRED:请求命中缓存但缓存已过期。
STALE:请求命中了陈旧缓存。
REVALIDDATED:Nginx验证陈旧缓存依然有效。
UPDATING:命中的缓存内容陈旧,但正在更新缓存。
BYPASS:响应结果是从原始服务器获取的。

#注:这是一个Nginx内置变量,与上面的参数不同。
下面是一个配置实例
server{  
        location / {  
            # 使用名为nginx_cache的缓存空间  
            proxy_cache hot_cache;  
            # 对于200、206、304、301、302状态码的数据缓存1天  
            proxy_cache_valid 200 206 304 301 302 1d;  
            # 对于其他状态的数据缓存30分钟  
            proxy_cache_valid any 30m;  
            # 定义生成缓存键的规则(请求的url+参数作为key)  
            proxy_cache_key $host$uri$is_args$args;  
            # 资源至少被重复访问三次后再加入缓存  
            proxy_cache_min_uses 3;  
            # 出现重复请求时,只让一个去后端读数据,其他的从缓存中读取  
            proxy_cache_lock on;  
            # 上面的锁超时时间为3s,超过3s未获取数据,其他请求直接去后端  
            proxy_cache_lock_timeout 3s;  
            # 对于请求参数或cookie中声明了不缓存的数据,不再加入缓存  
            proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;  
            # 在响应头中添加一个缓存是否命中的状态(便于调试)  
            add_header Cache-status $upstream_cache_status;  
        }

模块化设计

Nginx 的模块化设计使得它能够根据需求选择和加载不同的模块,以支持各种功能,如日志记录、身份验证等。这种设计灵活性高,便于扩展和维护。

Nginx 的模块主要包括核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块和第三方模块等。这些模块通过事件驱动模型和非阻塞I/O等技术手段,实现了高效地处理大量的并发连接,支持百万级别的并发访问。

Nginx 这种模块化设计使得它可以根据不同的需求去加载不同的模块,从而去支持各种不同的功能,这个设计非常灵活,且便于扩展与维护。

核心模块是Nginx的基础部分,主要实现了底层的自身的一部分通讯协议,也为其他的一些模块和Nginx的进程等内容提供了一个运行时的环境。标准HTTP模块是核心中的一部分,负责定义除配置模块之外的其他模块。可选HTTP模块则提供了更多高级功能,如负载均衡、SSL加密等。邮件服务模块则与邮件相关。第三方模块则是一些由第三方提供的模块,可以扩展Nginx的功能。

总的来说,Nginx 的模块化设计是其高性能、高并发能力的关键因素之一。

代理机制

Nginx 作为反向代理服务器能够实现请求转发、负载均衡、缓存等功能,提高处理性能和并发能力。

Nginx 作为反向代理服务器使用时,会接收客户端的请求并转发给后端服务器处理。通过代理机制,Nginx能够实现请求的转发、负载均衡、缓存等功能,提高了处理性能和并发能力。

相关的介绍文章可以参考:  以下是一个基本的配置示例:
http {
.............
    upstream product_server{
        127.0.0.1:8081;
    }

    upstream admin_server{
        127.0.0.1:8082;
    }

    upstream test_server{
        127.0.0.1:8083;
    }

server {
      
  #默认指向product的server
  location / {
      proxy_pass http://product_server;
      }

  location /product/{
      proxy_pass http://product_server;
     }

  location /admin/ {
      proxy_pass http://admin_server;
     }

  location /test/ {
      proxy_pass http://test_server;
      }
    }
}

Nginx通过这些优秀的技术设计,然后将这些技术手段在 Nginx 中广泛应用,使得 Nginx 能够高效地处理大量的并发连接,我们在实际应用中,可以通过合理的配置 Nginx,来提高与优化其性能,进一步提高并发处理能力,从而去支持百万级别的并发访问。

Nginx 能够高效地处理大量的并发连接,我们在实际应用中,可以通过合理的配置 Nginx,来提高与优化其性能,进一步提高并发处理能力,从而去支持百万级别的并发访问。

示例

以下是一个示例,展示如何使用Nginx配置支持百万级并发连接的简单示例:文章来源地址https://www.toymoban.com/article/743.html

worker_processes auto;  # 自动设置工作进程数量

events {
    worker_connections 1024;  # 每个工作进程允许的最大连接数
    use epoll;  # 使用epoll事件驱动模型
}

http {
    include mime.types;
    default_type application/octet-stream;
    
    sendfile on;  # 开启sendfile功能
    tcp_nopush on;  # 开启tcp_nopush功能
    tcp_nodelay on;  # 开启tcp_nodelay功能
    
    keepalive_timeout 65;  # 客户端保持连接的超时时间
    
    gzip on;  # 开启gzip压缩
    
    server {
        listen 80;
        
        location / {
            root /path/to/your/website;
            index index.html;
        }
    }
}

到此这篇关于Nginx高并发,Nginx怎么设置才支持百万并发?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/article/743.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Boot接口实现百万并发

    随着互联网的发展,越来越多的应用需要支持高并发。在这种情况下,如何实现高并发成为了一个重要的问题。Spring Boot是一个非常流行的Java框架,它提供了很多方便的功能来支持高并发。本文将介绍如何使用Spring Boot来实现百万并发。 Spring Boot是一个基于Spring框架的快速开

    2024年02月13日
    浏览(10)
  • 2.2.1服务器百万并发实现

    2.2.1服务器百万并发实现

    Reactor模型的几个重要组件:Event事件、Reactor反应堆、Demultiplex事件分发器、Evanthandler事件处理器 接上节课,上节课中,我们使用了epoll实现了同时监听多个文件描述符,是对IO的管理,也提到了reactor是对事件的管理,那具体来说是怎样的呢?reactor是事件驱动模型,也就是EP

    2023年04月23日
    浏览(8)
  • C++从0实现百万并发Reactor服务器

    C++从0实现百万并发Reactor服务器

    C++从0实现百万并发Reactor服务器 // \\\"xia讠果URI\\\"》uкооu·ㄷㅁΜ C++从0实现百万并发Reactor服务器 - 网络编程基础 网络编程中有许多基础概念必须了解,比如 OSI,TCP/IP,字节序列等,这些都是开发网络应用的基础,可以帮助我们更好的理解网络程序的工作原理,来一起学习下一些

    2024年03月17日
    浏览(10)
  • 用反应器模式和epoll构建百万并发服务器

    用反应器模式和epoll构建百万并发服务器

    此处的百万并发指的是可以建立至少100w个客户端连接,不考虑业务处理。 反应器模式下的epoll相比起普通的epoll不同在于:普通的epoll在获取到就绪状态的event结构体之后,先判断是什么类型的fd,再进行操作。而reactor先判断是什么类型的事件,再进行操作。本文从头用react

    2024年02月02日
    浏览(6)
  • Python潮流周刊#5:并发一百万个任务要用多少内存?

    你好,我是猫哥。这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。) 博客原文:https://pythoncat.top/posts/2023-06-03-weekly5 1、并发一百万个任务要用多少内存?(英文) 文中测试了

    2024年02月07日
    浏览(11)
  • TCP服务器的演变过程:使用epoll构建reactor网络模型实现百万级并发(详细代码)

    TCP服务器的演变过程:使用epoll构建reactor网络模型实现百万级并发(详细代码)

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。 本节,在上一章节介绍了如何使用epoll开发高效的服务器,本节将介绍使用epoll构建reactor网络模型,实

    2024年02月01日
    浏览(7)
  • 五、Linux C/C++ 对epoll-reactor服务器的百万级高并发实现

    五、Linux C/C++ 对epoll-reactor服务器的百万级高并发实现

    前言:基于epoll的反应堆模式(reactor)的服务器程序,进行百万并发量的连接测试。通过代码优化,以及服务器与客户端的硬件配置优化,达到百万并发。 代码实现 代码实现: 1台服务器:8G运行内存 8核CPU 3台客户端:4G运行内存 4核CPU 这些硬件配置可以通过虚拟机配置。 按照

    2024年02月20日
    浏览(9)
  • 使用EasyExcel实现excel导出,支持百万大数据量导出-----超简单

    通过设置sheet数量,完成分批导出,每个sheet存100万数据,每次查询插入20万数据,避免超时,内存溢出等问题,可以根据服务器配置调整参数设置。 1.引入依赖 2.创建对应的实体类 @ExcelProperty设置的就是导出的列名,还可以设置排序等等 3.核心导出代码 4.配置类 至此就完成导

    2024年02月11日
    浏览(8)
  • 98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

    98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

    在上章我们只是简单实现了曲线图和折线图的显示: 79.qt qml-如何在QML中使用QCustomPlot之曲线/折线示例(已适配黑白风格)_qml 折线图_诺谦的博客-CSDN博客 所以本章实现综合示例、并添加多种功能如下所示: 详细显示:鼠标任意移动显示具体值内容 鼠标右击: 弹出菜单栏,支持

    2024年02月05日
    浏览(6)
  • IT架构师怎么可以年薪百万

    YY一下 IT架构师是软件企业的高级技术职位,要达到年薪百万,需要以下几个条件: 1. 精通主流技术栈,如云计算、大数据、区块链等。这类热门技术不仅需理解原理,还要有成功案例。因为薪资高的公司通常都在技术前沿,需要架构师掌握最新技术来引导企业变革。 深入理解新技术

    2024年02月06日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包