走进nginx事件驱动模型
最近在看阿里陶辉前辈写的”深入理解nginx”中的nginx的事件模块。之所以想看这块内容,是因为nginx可以处理庞大的并发连接,想看看支持其背后的事件驱动是如何构建的
这篇博文我也不想贴代码什么的整一堆东西来讲述nginx事件驱动,一来我未必理解的那么透彻,而来这样反而更不易阅读者快速的掌握知识,所以我会简单的将几个我认为可能会对我之后的服务器程序开发中有所帮助的几个知识点
简单论述nginx的epoll模型
本文只以epoll为例
nginx以epoll为事件驱动的基础,epoll共检测4类事件,分别如下
<code>.处理新连接事件 .处理定时事件 .处理普通读写事件 .处理从磁盘读事件 </code>
(1)首先来谈第一个处理新连接事件,我们在平时的服务器设计时,由于连接事件比较敏感(对快速响应要求比较高),所以我会单开一个线程(进程)来专门处理连接,获取连接后然后在分发给各个I/O复用线程,然而nginx的处理连接事件和处理其他事件都是在同一个I/O复用下,那么它是如何保证连接事件对响应的要求的呢?niginx是通过将获取的事件先不调用其回调,而是把他们先放入俩个post队列,这俩个队列分别为
<code>.ngx_posted_accept_events .ngx_posted_events </code>
第一个队列用来保存连接事件,而第二个队列用来保存普通读写事件,之后在执行时我们可以先保证ngx_posted_accept_events中的事件先处理,就可以保证连接对响应速度的敏感性
(2)如何防止串话
串话问题可以说是服务器程序中都需要处理的一个问题。串话问题是指刚刚关闭了一个套接字,又来了一个新连接,而新连接刚好系统给分配的就是刚关闭的那个套接字,那么如果方才哪个套接字还有事件未处理完成,接下来它给对应的套接字发送数据很有可能就会发到新建立的用户那。那么nginx如何来解决这个问题呢?很简单,nginx在每次获得新连接后都会将连接中的一个标志为置反,这样本个连接和上个连接的instance就会不同,而每个事件都包含了连接,所以每次处理事件时只需要比较事件中的instance是否相同就OK了
(3)如何处理”惊群问题”
所谓惊群问题就是说多个进程在同时监听同一个端口,当有连接到来时,系统会把多个进程都唤醒,但是当然任然只有一个进程能处理到新连接,所以本来其他进程是不需要被唤醒的,但是被唤醒了,这就是注明的惊群问题。nginx解决它的方法也很简单,只需要保证同一时间点只有一个进程在监听端口就可避免惊群问题了。但是问题的关键是如何能保证同一时间点只有一个进程来监听端口。nginx采用了尝试加锁,根据加锁的返回值确定本进程是否要接下来处理新连接事件,从而解决了”惊群问题”
(4)如何解决负载均衡
在我之前写的一个小网络库中,我所采用的负载均衡很简单,就是主线程用来接受新连接,然后轮流把新连接分发给各个子线程,而nginx解决个进程间的负载均衡问题并没有均衡分配,而是当每个进程处理的额连接数超过了规定其处理的最大连接数的7/8时,就会本次不处理连接,而是将其处理的连接数-1,这样相当于就把机会让给了其他线程,从而实现了负载均衡了
总结
关于nginx驱动模块就先写这么点吧,随后在看的时候在不上,写本片博客只是用来督促自己学习的
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了走进nginx事件驱动模型,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

如何在 Windows 中配置 Nginx?安装 Nginx 并创建虚拟主机配置。修改主配置文件并包含虚拟主机配置。启动或重新加载 Nginx。测试配置并查看网站。选择性启用 SSL 并配置 SSL 证书。选择性设置防火墙允许 80 和 443 端口流量。

Docker 容器启动步骤:拉取容器镜像:运行 "docker pull [镜像名称]"。创建容器:使用 "docker create [选项] [镜像名称] [命令和参数]"。启动容器:执行 "docker start [容器名称或 ID]"。检查容器状态:通过 "docker ps" 验证容器是否正在运行。

可以通过以下步骤查询 Docker 容器名称:列出所有容器(docker ps)。筛选容器列表(使用 grep 命令)。获取容器名称(位于 "NAMES" 列中)。

确认 Nginx 是否启动的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 检查端口 80 是否开放;3. 查看系统日志中 Nginx 启动消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

在 Docker 中创建容器: 1. 拉取镜像: docker pull [镜像名] 2. 创建容器: docker run [选项] [镜像名] [命令] 3. 启动容器: docker start [容器名]

可以查询 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打开 Nginx 错误页,查看页面的标题。

在云服务器上配置 Nginx 域名的方法:创建 A 记录,指向云服务器的公共 IP 地址。在 Nginx 配置文件中添加虚拟主机块,指定侦听端口、域名和网站根目录。重启 Nginx 以应用更改。访问域名测试配置。其他注意事项:安装 SSL 证书启用 HTTPS、确保防火墙允许 80 端口流量、等待 DNS 解析生效。

当 Nginx 服务器宕机时,可执行以下故障排除步骤:检查 nginx 进程是否正在运行。查看错误日志以获取错误消息。检查 nginx 配置语法正确性。确保 nginx 具有访问文件所需的权限。检查文件描述符打开限制。确认 nginx 正在侦听正确的端口。添加防火墙规则以允许nginx流量。检查反向代理设置,包括后端服务器可用性。如需进一步帮助,请联系技术支持。
