Nginx架构基础

2023-05-16

1.写在前面

前面的内容我们介绍Nginx的一些的基础内容,今天我们继续深入Nginx的介绍,主要介绍下Nginx的架构的基础。

2.Nginx的请求处理流程

在这里插入图片描述

Web、Email以及TCP流量通过Nginx的传输层状态机,经过HTTP状态机,然后再经过Mail状态机,然后将对应的流量发到对应的代理中,在这个过程中静态资源会缓存到磁盘中去,同时Access访问日志Error错误日志。中间经过的主要是非阻塞的事件驱动处理引擎,同时使用线程池处理磁盘阻塞调用。

3.Nginx进程结构

在这里插入图片描述

主要是通过Master进程管理worker进程,所有的worker进程以及Cache Manager进程,Cache loader进程都是通过master进程创建出来的。

4.Nginx进程管理:信号

在这里插入图片描述

reload流程

  1. 向master进程发送HUP信号(reload命令)

  2. master进程校验配置语法是否正确。

  3. master进程打开新的监听端口。

  4. master进程用新配置启动新的worker子进程。

  5. master进程向老worker子进程发送QUIT信号。

  6. 老worker进程关闭监听句柄,处理完当前连接后结束进程。

    在这里插入图片描述

5.热升级的流程

热升级流程

  1. 将旧Nginx文件换成新的Nginx文件(注意备份)

  2. 向master进程发送USR2信号

  3. master进程修改pid文件名,加后缀.oldbin

  4. master进程用新Nginx文件启动新的master进程

  5. 向老master进程发送QUIT信号,关闭老master

  6. 回滚:向老master发送HUP,向新master发送QUIT

    在这里插入图片描述

6.worker进程:优雅的关闭

优雅的关闭

  1. 设置定时器:worker_shutdown_timeout
  2. 关闭监听句柄
  3. 关闭空闲连接
  4. 在循环中等待全部连接关闭
  5. 退出进程

7.网络收发与Nginx事件间的对应关系

在这里插入图片描述

一个数据报文从主机A经过多个路由器最终到达目的地主机B

数据流经过应用层、传输层、网络层、链路层,包装好的报文,然后经过以太网,广域网,最后到达目标主机,在目标主机中也是先经过链路层、网络层、传输层、应用层,经过层层的解开报文,最后到达对应的应用处理程序。

TCP流与报文

在这里插入图片描述

物理层到数据链路层,包装了一层目的和源的MAC地址

数据链路层到网络层,包装了一层目的和源的IP地址

网络层到传输层,包装了一层目的和源的端口

最后的应用层,就是包含了目的和源的端口,IP地址,还有就是MAC地址。

TCP协议与非阻塞接口

在这里插入图片描述

虽然事件类型很多,但是最终都可以分成两种,一种是读事件,一种是写事件,其中读事件包括Accept建立连接,Read读消息。写事件包括Write写消息。

8.Nginx事件循环

在这里插入图片描述

9.epoll的优劣及原理

在这里插入图片描述

epoll

  • 前提:

    • 高并发连接中,每次处理的活跃连接数量占比很小
  • 实现

    • 红黑树
    • 链表
  • 使用

    • 创建
    • 操作:添加/删除/修改
    • 获取句柄
    • 关闭
  • 在这里插入图片描述

10.Nginx的请求切换

在这里插入图片描述

11.同步&异步、阻塞&非阻塞之间的区别

阻塞调用

以Accept为例

在这里插入图片描述

非阻塞调用

在这里插入图片描述

非阻塞调用下的同步和异步

在这里插入图片描述

12.Nginx模块

特征

  • 内聚
  • 抽象
    • 配置
    • 启停回调方法
    • 子模块抽象
  • 在这里插入图片描述

模块的分类

在这里插入图片描述

13.Nginx如何通过连接池处理网络请求

构成

  • 对下游客户端的连接
  • 对上游服务器的连接

在这里插入图片描述

核心数据结构

在这里插入图片描述

14.内存池对性能的影响

在这里插入图片描述

15.Nginx进程之间的通讯方式

在这里插入图片描述

共享内存:跨worker进程通讯

在这里插入图片描述

16.Slab内存管理

在这里插入图片描述

ngx_slab_stat:统计Slab使用状态

在这里插入图片描述

17.Nginx中最常用的容器

Nginx哈希表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

时间复杂度

在这里插入图片描述

红黑树的使用模块

在这里插入图片描述

18.使用动态模块来提升运维效率

在这里插入图片描述

19.写在最后

本篇博客主要的介绍了下Nginx的架构基础,后面会继续介绍Nginx剩下的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx架构基础 的相关文章

  • 命名 Docker 卷以共享构建而不更新

    我工作的公司的开发人员要求我用 Docker 做一些不同的事情 然后我也被使用了 目标是拥有 2 个具有以下职责的容器 容器A 节点容器将构建前端 React 应用程序并将捆绑包放入名为的目录中app dist 完成后 容器将停止运行 容器
  • 为什么在生产中得到空 CSS 文件?

    我在文件中放入了很多css文件active admin css scss Active Admin s got SASS import active admin mixins import active admin base import
  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • 如何将亚马逊颁发的免费证书配置到nginx.config

    我已经安装了nginx服务器在Amazon Linux 2环境 在创建弹性负载均衡器期间 我创建了 Amazon 的免费证书 现在 我想通过以下方式访问我的服务器https port 443 我该如何配置这个SSL证书在nginx conf
  • nginx 将虚拟目录重写为文件

    这应该很容易做到 但我的头撞在墙上了 如果我收到对 www mysite com mypath 的请求 我想提供 www mysite com myotherpath thisfile html 的内容 我如何使用 nginx 配置来做到这
  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • nginx 和 uwsgi 非常大的文件上传(>3Gb)

    也许有人知道该怎么做 我正在尝试上传大于 3Gb 的文件 没问题 如果我使用以下配置上传高达 2Gb 的文件 Nginx client max body size 5g client body in file only clean clie
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • 连接到上游时 Nginx 错误:(13:权限被拒绝)

    我在我的中收到此错误nginx error log file 2014 02 17 03 42 20 crit 5455 0 1 connect to unix tmp uwsgi sock failed 13 Permission den
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • 如何使用gunicorn和bokeh服务配置Nginx

    我想提供一个 Flask 应用程序 该应用程序使用本地网络服务器上的嵌入式散景服务 为了说明这一点 我使用了一个例子散景服务示例 https github com bokeh bokeh blob 0 12 11 examples howt
  • 错误请求 400:nginx/gunicorn

    我已经遵循了这个教程 http blog wercker com 2013 11 25 django 16 part3 html http blog wercker com 2013 11 25 django 16 part3 html我现
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • Nginx docker容器代理传递到另一个端口

    我想在 docker 容器中运行 Nginx 它监听端口 80 并且当 url 以 word 开头时 我希望它 proxy pass 到端口 8080api 我有一些网络应用程序侦听端口 8080 这在没有 docker 的情况下对我来说一
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 如何避免 nginx“上游发送太大的标头”错误?

    我正在运行 nginx Phusion Passenger 和 Rails 我遇到了以下错误 upstream sent too big header while reading response header from upstream
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入

随机推荐