当前位置: 首页 > news >正文

47、【Ubuntu】【Gitlab】拉出内网 Web 服务:Nginx 事件驱动分析(一) - 详解

【声明】本博客所有内容均为个人业余时间创作,所述技巧案例均来自公开开源工程(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(三)
分析了 Python 中 http.server 模块的 cgi 功能,下面继续

Nginx 事件驱动分析

OK,经过之前 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(一)
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(二)
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(三)
的分析,现在知道了 Python 的 http.server 模块主要是用于静态网站展示的,其虽然有 CGI,但其动态功能很简单,无法支撑高效的动态网站,而接下来要分析的 Gitlab 是一个完整的 Web 应用程序,其功能涵盖:用户系统(负责处理注册,登录,权限等),Git 仓库托管(负责处理 git clonegit push 等协议),数据库存储后台任务队列实时通信CI/CD 流水线动态页面渲染静态 HTML)等,就是(不Python 的 http.server 没有这么强的能力,完全带不动

之前最开始的 blog
【Ubuntu】【GitLab】局域网用 Ubuntu 搭建 GitLab
介绍过如何在局域网中用 Ubuntu 搭建 Gitlab 服务,下面将重新审视之前的配置

里面提到,需要修改 /etc/gitlab/gitlab.rb 文件,然后在里面添加一个自定义的 Nginx 配置项,这里面的配置项其实有点冗余(虽然不影响正常使用),后面会详细分析
在这里插入图片描述
在分析之前,先回顾下 Nginx 的相关概念,之前 blog【Ubuntu】【GitLab】局域网用 Ubuntu 搭建 GitLab 提到 Nginx 被广泛认为是高性能 HTTP 服务器(相对于 Python 的 http.server 而言,http.server 主要用来开发,测试或教学目的,在设计目标上就不一样),下面详细分析下两者在架构,性能和使用场景上的一些本质区别

开始是架构,Nginx 用的是事件驱动,配合异步非阻塞 I/O,基于 epoll (Linux 系统调用)高效的 I/O 多路复用机制,实现一个线程(或进程)能同时监听成千上万个 TCP socket 网络连接,并且只在某个连接有内容可读可写时才去处理它,避免无意义的等待和轮询

这里有很多点,首先说这个事件驱动,指的是 Nginx 使用一种基于事件的编程模型来处理网络请求,而不是传统的一个线程/进程处理一个请求这种方式
在这里插入图片描述
可以看到,传统方式的处理,是一个线程/进程,只能响应处理一个事件

在这里插入图片描述
而在这里,Nginx 只需要开一个线程/进程,就能处理 N 个事件产生上面说的成千上万个 TCP socket 连接,这种模型让它能用就是,也就极少的资源(比如几个 CPU 核心,几十 MB 内存)同时处理成千上万的并发连接,当然,这样依赖 Linux 的 epoll 事件通知机制

从实现上来说,Nginx 在启动时,创建几个 worker 进程(一般为 CPU 核数),每个 worker 是单线程,然后这些 worker 会调用 epoll_create 创建事件池,并用 epoll_ctl 注册监听 socket,然后进行事件循环,其大概逻辑如下

while (1) {
// 阻塞等待,直到有事件发生(如新连接、数据可读)
events = epoll_wait(epoll_fd, ...);
// 遍历所有就绪事件
for (event in events) {
if (event is new connection) {
accept();  // 接受连接
epoll_ctl(ADD, new_socket); // 加入监听
} else if (event is data ready) {
read(socket);    // 读请求
process();       // 处理(如读文件)
write(socket);   // 发响应
}
}
}

这里面有几个关键点:没有线程切换,不轮询所有连接,只处理活跃的连接,所有 I/O 操作都是非阻塞的(recv 立刻返回,没数据就跳过,这个很重要,后面分析)


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:Nginx 事件驱动分析(二)

http://www.gsyq.cn/news/193562.html

相关文章:

  • YOLOFuse GitHub开源地址分享:欢迎Star支持社区发展
  • YOLOFuse未来更新方向:是否会支持更多传感器模态?
  • YOLOFuse个性化推荐系统整合
  • 2025必备!8个一键生成论文工具,专科生轻松搞定毕业论文!
  • YOLOFuse开源协议说明:可商用吗?是否允许二次开发?
  • YOLOFuse专利申请基础:核心技术可作为发明点提炼
  • 2026最新秋叶绘世Stable Diffusion整合包下载 秋叶ComfyUI整合包下载 ai生图必备 绘世启动器.exe 绘世2.8.13下载 绘世启动器2.8.13下载地址
  • 【嵌入式系统可靠性提升】:基于C语言的存算一体错误检测与恢复机制详解
  • 显存占用计算器:输入模型大小预估所需GPU
  • 基于Copula保险费率厘定附Matlab代码
  • YOLOFuse日志监控系统搭建:实时查看训练状态
  • 2025广告行业巅峰对决:领军企业全解析,地铁站广告/明星应援广告/候车亭广告/地铁广告/公交车身广告/电梯电子屏广告广告定制有哪些 - 品牌推荐师
  • 【最小均方(LMS)算法的分流有源滤波器】分流有源滤波器采用最小均方(LMS)算法的仿真电路可以减轻谐波和无功功率附Simulink仿真
  • 模型精度下降90%?教你用C语言调试TinyML部署中的隐藏陷阱
  • 详细介绍:Node.js 性能诊断利器 Clinic.js:原理剖析与实战指南
  • YOLOFuse能否检测小目标?在无人机航拍图中的表现测试
  • YOLOFuse配合Typora撰写技术文档:高效记录实验过程
  • 【并行计算高手进阶必备】:深入剖析OpenMP 5.3负载均衡底层原理
  • 昇腾芯片开发避坑指南:3个关键C语言调试技巧你必须掌握
  • YOLOFuse结果可视化:如何查看并导出预测后的检测框图像
  • 代码安全新战场:WASM混淆为何让黑客束手无策?
  • YOLOFuse OEM定制服务开放:品牌贴牌合作
  • YOLOFuse医院病房异常行为识别
  • YOLOFuse农业大棚作物监测方案
  • 从零构建可靠的存算一体程序,C语言开发者必须掌握的3个关键原则
  • C语言WASM代码混淆完全指南(从入门到高级混淆策略)
  • YOLOFuse消防救援现场感知增强
  • YOLOFuse搜索引擎图像索引优化
  • 告别孤独圣诞跨年夜,声网K歌技术打造“云上演唱会”
  • 揭秘OpenMP 5.3任务调度机制:如何实现最优负载均衡?