Nginx — Nginx处理Web请求机制解析
一、Nginx请求默认页面资源
1、配置文件详解


修改端口号为8080并重启服务:

二、Nginx进程模型
1、nginx常用命令解析
master进程:主进程(只有一个)
worker进程:工作进程(可以有多个,默认只有一个进程)
生命周期的原理:
信号: (操作人在执行以下指令操作的时候,master会转递给worker相关的信息让worker去进行相关的操作)
./nginx #开启nginx服务。
./nginx -s stop #暴力的关闭,如果后端有用户在连接如果用此命令会导致连接全部中断,如果发现有恶意攻击和黑客入侵的情况下可以用此命令。
./nginx -s stop #重新加载配置文件信息。
./nginx -s quit #优雅的关闭,如果后端有用户在连接会等待连接完成之后再去关闭,同时不会让新的请求访问进来(只针对http请求如果不是http请求时不行的)。
./nginx -t #检测配置文件的语法是否正确。
./nginx -v #查看当前的配置信息。
./nginx -V #显示详细信息,包括了nginx的版本、gcc版本、configure编译路径等。
./nginx -c #代表手动切换nginx的配置文件。
./nginx -h & ./nginx -h #显示nginx的帮助命令。

每个worker之间相对独立,如果某个worker收到黑客的攻击,那么运维人员只需要关闭相关的worker进程,如果某个worker进程不存在只需要master重新fork以下即可。

2、修改worker的进程数


三、Worker抢占机制
当client发起了请求之后client和worker之间会有一个护事锁(accept_mutex)服务端的众多worker会去抢这个锁,哪个worker抢到就由哪个worker来进行处理。

四、传统服务事件处理
假设一个client在进行请求的时候由worker1来进行处理,在处理的过程中用时比较长而且卡住了,客户端的请求就会被阻塞,假设在阻塞的过程中又有新的请求进来(假设client2、client3也同时连接到worker)要去处理。只有阻塞的请求处理完毕才回去处理client2、client3,所以master会去fork一个新worker进程。(在告并发情况下,这样的消耗会很大而且占用的资源会比较多)。



五、Nginx时间处理
假设一个client在进行请求的时候由worker1来进行处理,在处理的过程中用时比较长而且卡住了。对于Nginx而言是异步非阻塞的,如果发生阻塞同时又有新的请求进来那么worker会去处理下一个请求。用到的模型为epoll,(如果用到epoll那么一个worker进程可以处理6~8w的请求量,并且不会产生很多的开销),那么需要越高的并发量只需要增加服务器的配置就可以了(有钱解决)。
(一)Nginx的events模块支持的多种事件模型支持的模型
Nginx 的
events模块主要用于配置 Nginx 如何处理连接,它提供了多种事件模型,以适应不同的操作系统和应用场景。下面为你详细介绍 Nginx 支持的主要事件模型:1.
select模型
- 原理:
select是一种较为传统的事件驱动模型,它通过对文件描述符集合进行轮询,检查是否有文件描述符处于可读、可写或异常状态。当有事件发生时,select函数会返回发生事件的文件描述符数量,然后程序需要遍历文件描述符集合来确定具体是哪些文件描述符发生了事件。- 适用场景:适用于连接数较少的场景,因为
select模型在处理大量连接时,轮询操作会带来较高的 CPU 开销,性能会显著下降。同时,select模型对文件描述符数量有限制,通常最大为 1024。- 配置示例:
nginx
events {use select;worker_connections 1024; }2.
poll模型
- 原理:
poll是对select模型的改进,它同样采用轮询的方式检查文件描述符的状态,但poll没有文件描述符数量的限制。poll使用一个结构体数组来存储文件描述符和对应的事件,避免了select对文件描述符数量的硬限制。- 适用场景:适用于连接数相对较多,但仍然不是非常大的场景。相比于
select,poll在处理大量连接时性能有所提升,但在处理超大量连接时,轮询操作仍然会带来较高的 CPU 开销。- 配置示例:
nginx
events {use poll;worker_connections 2048; }3.
epoll模型
- 原理:
epoll是 Linux 内核为处理大批量文件描述符而作了改进的poll,是 Linux 下多路复用 IO 接口select/poll的增强版本。它采用事件驱动的方式,只关注那些有事件发生的文件描述符,避免了对所有文件描述符的轮询,从而提高了效率。epoll使用内核和用户空间共享内存的方式,减少了数据的拷贝次数。- 适用场景:适用于 Linux 系统下处理大量并发连接的场景,是 Nginx 在 Linux 系统上的首选事件模型。
- 配置示例:
nginx
events {use epoll;worker_connections 65535; }4.
kqueue模型
- 原理:
kqueue是 FreeBSD 系统上的一种高效事件通知机制,类似于 Linux 下的epoll。它采用事件队列的方式,当有事件发生时,会将事件添加到队列中,程序可以从队列中获取发生事件的文件描述符。- 适用场景:适用于 FreeBSD 系统,在处理大量并发连接时性能较好。
- 配置示例:
nginx
events {use kqueue;worker_connections 65535; }5.
rtsig模型
- 原理:
rtsig是基于实时信号实现的事件模型,它通过发送实时信号来通知程序有事件发生。- 适用场景:该模型在实际应用中使用较少,因为实时信号的处理有一些限制,并且性能不如
epoll和kqueue等模型。- 配置示例:
nginx
events {use rtsig;worker_connections 1024; }6.
/dev/poll模型
- 原理:
/dev/poll是 Solaris 系统上的一种事件通知机制,它通过读取/dev/poll设备文件来获取事件信息。- 适用场景:适用于 Solaris 系统,在该系统上可以提供较好的性能。
- 配置示例:
nginx
events {use /dev/poll;worker_connections 65535; }自动选择模型
如果不指定
use指令,Nginx 会根据操作系统自动选择最合适的事件模型。例如,在 Linux 系统上会优先选择epoll模型,在 FreeBSD 系统上会优先选择kqueue模型。示例如下:nginx
events {worker_connections 65535; }在实际应用中,建议根据服务器的操作系统和具体的业务场景选择合适的事件模型,以提高 Nginx 的性能和稳定性。
(二)nginx默认的模型是
epoll
epoll是 Linux 内核为处理大批量文件描述符而作了改进的poll,是 Linux 下多路复用 IO 接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率。下面从几个方面详细介绍epoll模型:基本概念
在网络编程中,服务器需要处理多个客户端的连接请求,传统的方法(如
select和poll)在处理大量连接时性能会下降。epoll则通过事件驱动的方式,只关注那些有事件发生的文件描述符,避免了对所有文件描述符的轮询,从而提高了效率。工作原理
epoll的工作流程主要分为三个步骤:
- 创建
epoll实例:使用epoll_create或epoll_create1函数创建一个epoll实例,它会返回一个文件描述符,后续的操作都基于这个描述符进行。- 注册事件:使用
epoll_ctl函数向epoll实例中添加、修改或删除需要监控的文件描述符以及对应的事件。例如,可以监控文件描述符的可读、可写等事件。- 等待事件发生:使用
epoll_wait函数等待事件的发生。当有事件发生时,该函数会返回有事件发生的文件描述符列表,程序可以对这些文件描述符进行相应的处理。代码示例
以下是一个简单的使用
epoll实现的 TCP 服务器示例代码:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/epoll.h> #include <unistd.h>#define MAX_EVENTS 10 #define BUF_SIZE 1024int main() {int listen_fd, epoll_fd;struct sockaddr_in server_addr;struct epoll_event ev, events[MAX_EVENTS];// 创建监听套接字listen_fd = socket(AF_INET, SOCK_STREAM, 0);if (listen_fd == -1) {perror("socket");return 1;}// 初始化服务器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8080);// 绑定地址if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind");close(listen_fd);return 1;}// 监听连接if (listen(listen_fd, SOMAXCONN) == -1) {perror("listen");close(listen_fd);return 1;}// 创建 epoll 实例epoll_fd = epoll_create1(0);if (epoll_fd == -1) {perror("epoll_create1");close(listen_fd);return 1;}// 将监听套接字添加到 epoll 实例中ev.events = EPOLLIN;ev.data.fd = listen_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev) == -1) {perror("epoll_ctl: listen_fd");close(listen_fd);close(epoll_fd);return 1;}while (1) {int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);if (nfds == -1) {perror("epoll_wait");continue;}for (int i = 0; i < nfds; i++) {if (events[i].data.fd == listen_fd) {// 处理新的连接struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);int conn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_addr_len);if (conn_fd == -1) {perror("accept");continue;}// 将新的连接添加到 epoll 实例中ev.events = EPOLLIN;ev.data.fd = conn_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &ev) == -1) {perror("epoll_ctl: conn_fd");close(conn_fd);}} else {// 处理客户端数据char buf[BUF_SIZE];ssize_t n = read(events[i].data.fd, buf, BUF_SIZE);if (n <= 0) {// 客户端关闭连接close(events[i].data.fd);epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL);} else {// 回显数据给客户端write(events[i].data.fd, buf, n);}}}}// 关闭监听套接字和 epoll 实例close(listen_fd);close(epoll_fd);return 0; }优点
- 高效处理大量连接:
epoll使用事件驱动机制,只关注有事件发生的文件描述符,避免了select和poll对所有文件描述符的轮询,因此在处理大量并发连接时性能更优。- 内存拷贝优化:
epoll使用内核和用户空间共享内存的方式,减少了数据的拷贝次数,提高了效率。- 水平触发和边缘触发模式:
epoll支持水平触发(LT)和边缘触发(ET)两种模式,开发者可以根据具体需求选择合适的模式。缺点
- 平台依赖性:
epoll是 Linux 特有的,在其他操作系统(如 Windows、macOS)上无法使用。- 实现复杂度较高:相比于
select和poll,epoll的使用和实现相对复杂,需要开发者对其原理有深入的理解。

注:worker的进程要根据CPU实际情况来定不是越高越高,如果太高会造成请求访问卡顿。影响业务的正常运行。
epoll的配置
events {#默认使用epolluse epoll;#每个worker允许的客端最大连接数worker_connections 1024;
}

相关文章:
Nginx — Nginx处理Web请求机制解析
一、Nginx请求默认页面资源 1、配置文件详解 修改端口号为8080并重启服务: 二、Nginx进程模型 1、nginx常用命令解析 master进程:主进程(只有一个) worker进程:工作进程(可以有多个,默认只有一…...
GPT Workspace体验
GPT Workspace是一款将强大的自然语言处理模型(如 ChatGPT 和 Gemini)集成到 Google Workspace 应用(如 Google Docs, Sheets, Slides, Gmail 和 Drive)中的工具或插件。它的目标是提升用户在日常办公中的效率和创造力。 以下是对…...
1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯
动态规划解最小花费爬楼梯问题:LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求:给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...
5.0 WPF的基础介绍1-Grid,Stack,button
WPF: Window Presentation Foundation. WPF与WinForms的对比如下: 特性WinFormsWPF技术基础基于传统的GDI(图形设备接口)基于DirectX,支持硬件加速的矢量渲染UI设计方式拖拽控件事件驱动代码(简单但局限)…...
Docker 端口映射原理
在 Docker 中,默认情况下容器无法直接与外部网络通信。 为了使外部网络能够访问容器内的服务,Docker 提供了端口映射功能,通过将宿主机的端口映射到容器内的端口,外部可以通过宿主机的IP和端口访问容器内的服务 以下通过动手演示…...
SDL —— 将sdl渲染画面嵌入Qt窗口显示(附:源码)
🔔 SDL/SDL2 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 使用QWidget加载了SDL的窗口,渲染器使用硬件加速跑GPU的。支持Qt窗口缩放或显示隐藏均不影响SDL的图像刷新。 操作步骤 1、在创建C++空工程时加入SDL,引入头文件时需…...
算法每日一练 (23)
💢欢迎来到张翊尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 算法每日一练 (23)最大正方形题目描述解题思路解题代码…...
UE5学习笔记 FPS游戏制作28 显式玩家子弹数
文章目录 添加变量修改ShootOnce方法,设计时减少子弹,没有子弹不能开枪在UI上显示 添加变量 在Gun类中添加BulletNum和ClipSize两个参数 BulletNum是当前还有多少子弹,ClipSize是一个弹匣多少子弹 Rifle的ClipSzie设置为30,Laun…...
2025前端八股文终极指南:从高频考点到降维打击的面试突围战
2025前端八股文终极指南:从高频考点到降维打击的面试突围战 一、2025前端八股文核心考点重构 1.1 新型响应式系统三连问 Vue3信号式响应性: // 信号式响应性底层实现 const [count, setCount] createSignal(0) effect(() > {console.log("当…...
《深入探索 Python 数据分析:用 Pandas 高效处理与可视化大型数据集》
《深入探索 Python 数据分析:用 Pandas 高效处理与可视化大型数据集》 引言:从零到分析高手 数据是当代社会最宝贵的资源,而数据分析技能是现代职业人不可或缺的一部分。在数据科学的领域中,Python 已成为当之无愧的“首选语言”,其强大的生态系统和简洁的语法让人如虎添…...
【实战】渗透测试下的文件操作
目录 Linux查找文件 Windows查找文件 查找可写目录 windows Linux 创建 Windows Linux 压缩 解压 远程解压文件 Linux查找文件 >find / -name index.php 查找木马文件 >find . -name *.php | xargs grep -n eval( >find . -name *.php | xargs grep -n ass…...
基于深度神经网络的图像防篡改检测方法研究
标题:基于深度神经网络的图像防篡改检测方法研究 内容:1.摘要 随着数字化时代的发展,图像篡改现象日益普遍,严重影响了图像信息的真实性和可靠性。本文旨在研究基于深度神经网络的图像防篡改检测方法,以有效识别被篡改的图像。通过收集大量真…...
vue如何实现前端控制动态路由
在 Vue.js 中,动态路由是一种根据不同用户权限或其他因素动态改变路由列表的功能。这种机制允许开发者根据后端提供的权限数据动态渲染前端路由,实现多用户权限系统,不同用户展示不同的导航菜单。 动态路由的配置 动态路由的配置涉及到前端…...
学成在线--day02
复习知识点 classPath: 类加载路径,也就是jvm找字节码文件的路径,我们自己写的类,以及依赖的包,都会放到这个路径下面用于加载。 跨域问题: 是由于浏览器的同源策略(协议,端口,ip…...
《构建有效的AI代理》学习笔记
原文链接:https://www.anthropic.com/engineering/building-effective-agents 《构建有效的AI代理》学习笔记 一、概述 核心结论 • 成功的AI代理系统往往基于简单、可组合的模式,而非复杂框架。 • 需在性能、成本与延迟之间权衡,仅在必要时增加复杂度…...
Go语言基础:数据类型
一、基础数据类型:Go语言的积木块 1.1 数字类型全家福 package mainimport ("fmt" )func main() {// 有符号整数类型var a int 42 // int 类型,自动选择32或64位var b int8 127 // int…...
数据处理专题(四)
目标 使用 Matplotlib 进行基本的数据可视化。 学习内容 绘制折线图 绘制散点图 绘制柱状图 代码示例 1. 导入必要的库 import matplotlib.pyplot as pltimport numpy as npimport pandas as pd 2. 创建示例数据集 # 创建示例数据集data { 月份: [1月, 2月, 3…...
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...
云钥科技多通道工业相机解决方案设计
项目应用场景分析与需求挑战 1. 应用场景 目标领域:工业自动化检测(如精密零件尺寸测量、表面缺陷检测)、3D立体视觉(如物体建模、位姿识别)、动态运动追踪(如高速生产线监控)等。 核心…...
从零到一:ESP32与豆包大模型的RTC连续对话实现指南
一、对话效果演示 ESP32与豆包大模型的RTC连续对话 二、ESP-ADF 介绍 乐鑫 ESP-ADF(Espressif Audio Development Framework)是乐鑫科技(Espressif Systems)专为 ESP32 系列芯片开发的一款音频开发框架。它旨在简化基于 ESP32 芯…...
【深度学习与实战】2.3、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)
为了求解损失函数 对 的导数,并利用最小二乘法向量形式求解 的值 这是线性回归的平方误差损失函数,目标是最小化预测值 与真实值 之间的差距。 损失函数: 考虑多个样本的情况,损失函数为所有样本的平方误差之和&a…...
【Django】教程-2-前端-目录结构介绍
【Django】教程-1-安装创建项目目录结构介绍 3. 前端文件配置 3.1 目录介绍 在app下创建static文件夹, 是根据setting中的配置来的 STATIC_URL ‘static/’ templates目录,编写HTML模板(含有模板语法,继承,{% static ‘xx’ …...
JS判断对象是否为空的方法
在 JavaScript 中,判断一个对象是否为空对象(即没有自身可枚举属性),可以通过以下方法实现: 方法 1:使用 Object.keys() javascript function isEmptyObject(obj) {// 确保是普通对象(排除 n…...
详解list容器
1.list的介绍 list的底层结构是双向带头循环链表,允许随机的插入和删除,但其内存空间不是连续的。随机访问空间能力差,需要从头到尾遍历节点,不像vector一样高效支持 2.list的使用 构造函数 1.默认构造函数:创建一个…...
leetcode_977. 有序数组的平方_java
977. 有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/ 1.题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1…...
Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理
在现代企业级应用开发中,前后端分离已成为主流模式,前端负责界面呈现,后端专注提供 RESTful API 接口。然而,接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3,为开发者…...
前端面经分享(25/03/26)
北京一家做AI解决方案的公司,技术一面,15k-20k,要求3-5年 你们React项目里路由模式用的什么React里class组件和function组件都用过吗常用Hook,解释一下他们的作用useEffect第二个参数填空数组和不填有什么区别React组件通信的常用…...
Matlab基础知识与常见操作【无痛入门】
【1】Matlab基本概念 【2】Matlab程序设计 【3】Matlab图形绘制 以上三篇文章为Matlab主要的应用场景,我在学习的过程中做一下记录,方便以后回顾。 接下来介绍下Matlab的工作界面,以及如何高效率的应用Matlab的帮助手册。在我看来&#x…...
HTTP协议手写服务器
目录 一、请求的是Web根目录 二、GET方法通过URL传参 三、根据资源类型对应出Content-Type值 四、Http代码 项目完整源代码:Http 周不才/cpp_linux study - 码云 - 开源中国 一、请求的是Web根目录 如果URL中请求的资源是Web根目录,则自动跳转到主…...
网络探索之旅:网络原理(第二弹)
上篇文章,小编分享了应用层和传输层深入的一点的知识,那么接下来,这篇文章,继续分享网络层和数据链路层。 网络层 了解这个网络层,那么其实就是重点来了解下IP这个协议 对于这个协议呢,其实也是和前面的…...
