Nginx以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文了解一下 Nginx为什么这么快!

❝为了防止不提供原网址的转载,特加原文链接:ningg.top/nginx-series-principle/

Nginx 的进程模型

Nginx 服务器,正常运行过程中:

  • 多进程:一个 Master 进程、多个 Worker 进程。

  • Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。

  • Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。

HTTP 连接建立和请求处理过程

HTTP 连接建立和请求处理过程如下:

  • Nginx 启动时,Master 进程,加载配置文件。

  • Master 进程,初始化监听的 Socket。

  • Master 进程,Fork 出多个 Worker 进程。

  • Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求。

Nginx 高性能、高并发

Nginx 为什么拥有高性能并且能够支撑高并发?

  • Nginx 采用多进程+异步非阻塞方式(IO 多路复用 Epoll)。

  • 请求的完整过程:建立连接→读取请求→解析请求→处理请求→响应请求。

  • 请求的完整过程对应到底层就是:读写 Socket 事件。

Nginx 的事件处理模型

Request:Nginx 中 HTTP 请求。基本的 HTTP Web Server 工作模式:

  • 接收请求:逐行读取请求行和请求头,判断段有请求体后,读取请求体。

  • 处理请求。

  • 返回响应:根据处理结果,生成相应的 HTTP 请求(响应行、响应头、响应体)。

Nginx 也是这个套路,整体流程一致:

模块化体系结构

Nginx 的模块根据其功能基本上可以分为以下几种类型:

① event module:搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括 ngx_events_module,ngx_event_core_module 和 ngx_epoll_module 等。

Nginx 具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。

② phase handler:此类型的模块也被直接称为 handler 模块。主要负责处理客户端请求并产生待响应内容,比如 ngx_http_static_module 模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。

③ output filter:也称为 filter 模块,主要是负责对输出的内容进行处理,可以对输出进行修改。

例如,可以实现对输出的所有 html 页面增加预定义的 footbar 一类的工作,或者对输出的图片的 URL 进行替换之类的工作。

④ upstream:upstream 模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。

upstream 模块是一种特殊的 handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。

⑤load-balancer:负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

常见问题剖析

Nginx vs Apache

Nginx:

  • IO 多路复用,Epoll(freebsd 上是 kqueue)

  • 高性能

  • 高并发

  • 占用系统资源少

Apache:

  • 阻塞+多进程/多线程

  • 更稳定,Bug 少

  • 模块更丰富

场 景:

处理多个请求时,可以采用:IO 多路复用 或者 阻塞 IO +多线程

1、IO 多路复用一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;

2、阻塞 IO + 多线程:每一个请求,新建一个服务线程

思考IO 多路复用 和 多线程 的适用场景?

IO 多路复用:单个连接的请求处理速度没有优势,适合 IO 密集型 场景,事件驱动

  • 大并发量:只使用一个线程,处理大量的并发请求,降低上下文环境切换损耗,也不需要考虑并发问题,相对可以处理更多的请求;
  • 消耗更少的系统资源(不需要线程调度开销)

  • 适用于长连接的情况(多线程模式长连接容易造成线程过多,造成频繁调度)

阻塞IO + 多线程:实现简单,可以不依赖系统调用,适合 CPU 密集型场景

  • 每个线程,都需要时间和空间;
  • 线程数量增长时,线程调度开销指数增长

参考:

http://www.oschina.net/translate/nginx-vs-apache
https://www.zhihu.com/question/19571087

 

Nginx 最大连接数

基础背景:

  • Nginx 是多进程模型,Worker 进程用于处理请求。

  • 单个进程的连接数(文件描述符 fd),有上限(nofile):ulimit -n。

  • Nginx 上配置单个 Worker 进程的最大连接数:worker_connections 上限为 nofile。

  • Nginx 上配置 Worker 进程的数量:worker_processes。

因此,Nginx 的最大连接数:

  • Nginx 的最大连接数:Worker 进程数量 x 单个 Worker 进程的最大连接数。

  • 上面是 Nginx 作为通用服务器时,最大的连接数。

  • Nginx 作为反向代理服务器时,能够服务的最大连接数:(Worker 进程数量 x 单个 Worker 进程的最大连接数)/ 2。

  • Nginx 反向代理时,会建立 Client 的连接和后端 Web Server 的连接,占用 2 个连接。

Nginx 的并发处理能力

关于 Nginx 的并发处理能力:并发连接数,一般优化后,峰值能保持在 1~3w 左右。(内存和 CPU 核心数不同,会有进一步优化空间)。

- end -

每天进步一点点

慢一点才能更快

nginx 转发慢_为啥 Nginx 能轻松淦到几万并发?相关推荐

  1. nginx 转发慢_学习Nginx的正确姿势,多图详解助你更上一层楼!(干货收藏篇)...

    本文主要帮助大家熟悉 Nginx 有哪些应用场景.Nginx 特点和架构模型以及相关流程.Nginx 定制化开发的几种模块分类. 本文将围绕如下几个部分进行讲解: Nginx 简介及特点 Nginx ...

  2. nginx 代理 内存_科普Nginx和apache的区别及优缺点比较

    最近很多小伙伴来问我Nginx和apache的区别,这个问题用三言两语也很难解释,于是整理出了这一篇文章与大家共享.除了Nginx和apache的区别,还比较了各自的优缺点.这是我自学Nginx和工作 ...

  3. nginx rtmp 编码_基于Nginx的媒体服务器技术

    国内应用比较多的开源流媒体服务器nginx-rtmp-module一直存在功能少.集群化难度大等问题.在LiveVideoStack线上分享中,PingOS 开源项目组开发工程师.UCloud RTC ...

  4. windows 修改nginx端口号_分享Nginx搭建图片服务器简单实现

    第一步:安装vsftpd提供ftp服务 https://www.cnblogs.com/lyq159/p/12070791.html 第二步:安装Nginx提供http服务 1.安装准备:安装Ngin ...

  5. ajax nginx 转发 sessionid_Nginx:初识Nginx(概念、在Docker中安装Nginx、常用命令、配置文件) - 怀梦想,致远方...

    1.Nginx初识 (1)概念 Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好 Nginx可以作为静态页面 ...

  6. 修改nginx端口号_分享Nginx搭建图片服务器简单实现

    第一步:安装vsftpd提供ftp服务 https://www.cnblogs.com/lyq159/p/12070791.html 第二步:安装Nginx提供http服务 1.安装准备:安装Ngin ...

  7. nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群

    在互联网项目中,往往面临着高用户量.高并发的问题,造成服务器的压力非常大,特别是电商项目,以淘宝天猫为例,近年双十一的成交量屡创新高,可想而知淘宝天猫的服务器面临的并发量有多大,单一服务器肯定承受不住 ...

  8. nginx安装包_安装nginx与fastdfs-nginx-module

    首先确保电脑上有相关的安装包, 照我们手上已有的内容来操作 , 现在对这个文件进行解压说 [root@ecs-python01 fastdfs安装]# tar xvfz nginx-1.8.1.tar ...

  9. nginx转发websocket

    nginx转发websocket 1.Nginx 支持websocket的配置 server {listen 80;server_name 域名;location / {proxy_pass http ...

最新文章

  1. 研究javascript中的this
  2. c语言吗 程序语言,编程语言为什么从c语言开始,那有没有a语言b语言呢?
  3. vue.js 组件之间传递数据 1
  4. w3ctech 2011 北京站(组图)
  5. Codeforces Round #277(Div 2) A、B、C、D、E题解
  6. 1 操作系统第一章 操作系统概念、功能、四大特征、操作系统发展与分类
  7. Netstars CTO陈斌:架构师的成长之路
  8. java data 图像 显示_Java(JMF)获取本地摄像头,实时显示图像
  9. axis2生成客户端代码_利用ApiPost一键、快速生成接口文档!女猿也过38节!
  10. el-table固定列之后没有出现滚动条_一道经典的MySQL面试题,答案出现三次反转...
  11. Can't locate ExtUtils/MakeMaker.pm
  12. 【codevs1026】逃跑的拉尔夫
  13. 拓端tecdat|R语言广义相加(加性)模型(GAMs)与光滑函数可视化
  14. getTickCount()函数 区别GetTickCount()函数
  15. Diablo3英雄榜-API分析
  16. HDU1922 POJ3004 Subway planning “神题”留名
  17. html制作钟表盘,CSS3简易表盘时钟
  18. UVM学习整理——UVM整体介绍
  19. Echarts地图使用扩展(1)
  20. gunicorn、uwsgi、uvicorn认识

热门文章

  1. TFRecord tf.train.Feature
  2. LARS 算法简介-机器学习
  3. TensorFlow基础笔记(11) max_pool2D函数 深度学习
  4. 详解 Tomcat 的连接数与线程池
  5. LeetCode简单题之检查两个字符串数组是否相等
  6. GPU编程和流式多处理器
  7. Python 爬虫框架Scrapy安装汇总
  8. Python bytes 的使用
  9. android EditText 修改光标的颜色值
  10. Java 静态变量,静态方法,静态常量(java static 关键字)