前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >nginx创建和监听套接字分析

nginx创建和监听套接字分析

原创
作者头像
stan1ey
修改于 2021-08-11 06:48:12
修改于 2021-08-11 06:48:12
9520
举报
文章被收录于专栏:安全开发记录安全开发记录

简介

nginx作为一个web服务器,肯定是有listen套接字对外提供服务的,listen套接字是用于接收HTTP请求。

nginx监听套接字的创建是根据配置文件的内容来创建的,在nginx.conf文件中有多少个地址就需要创建多少个监听套接字。

本文不针对源码逐一注解分析,只是说明套接字创建监听流程。

流程

当客户端发来http请求与服务端创建一个连接,过程如下:

1.nginx首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞、接受发送的缓冲区、绑定、监听处理)。

2.nginx创建套接字是在哪里呢?在解析http{}配置的时候,也就是在ngx_http_block()函数内,在这个函数的最后调用ngx_http_optimize_servers()函数。 在这个函数内最后调用了ngx_http_init_listening()函数,这个函数调用了ngx_http_add_listening函数,在这个函数总调用了ngx_create_listening()函数。

这个函数根据每一个IP地址:port这种配置创建一个监听套接字,这个函数还有一个很重要的任务,就是将监听套接字的回调函数设置为ngx_http_init_connection函数,记住这是监听套接字上的回调,而不是监听套接字对应的可读事件的回调函数。

3.nginx什么时候接受客户端http请求建立的连接呢?在ngx_event_process_init()函数内,这个函数是作为ngx_event_core_module模块创建的init_process函数。

这个函数是在worker进程初始化是被被调用的,ngx_event_process_init函数将每个监听套接字和一个连接(ngx_connection_t)相互创建关系。

在cycle内创建一个连接池,创建一个读事件池,创建一个写事件的池,然后创建for循环遍历cycle中的所有ngx_listening_t的结构体,对每一个ngx_listening_t结构体,也就是每一个监听套接字,从连接池中获取一个连接,将这个连接对应这个监听套接字,然后将读事件设置为ngx_event_accept,那么在对应的监听套接字上accept接受新的连接(划重点)!!!

4.连接结束完成后,调用这个监听套接字上的handler,也就是ngx_http_init_connection函数,从这个函数开始了HTTP请求的交互......

总结

总结首先对于一个初始化好的ngx_listening_t时,这里面只有一个套接字,没有可读可写事件,它需要ngx_connection_t托管,在ngx_connection_t中可读可写事件,在ngx_event_t结构中,data对应一个ngx_connection_t结构体。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nginx源码阅读(1)
Nginx框架是围绕着ngx_cycle_t结构体运行的。ngx_cycle_t结构体中包含的信息主要可以分为以下部分:
golangLeetcode
2022/08/02
7480
nginx0.1.0之event模块初始化源码分析(4)
event的配置解析相关的代码已经分析完毕。下面分析一下另一个流程中event模块的实现。即在nginx创建进程,并且开始执行进程里的代码的时候。入口函数是ngx_worker_process_cycle。
theanarkh
2019/03/06
3900
nginx event框架总结
Nginx 的 event(事件)处理机制是nginx的核心功能。nginx抽象了event机制,在多个平台有不同的event调用实现方法。比如说经常用的AIO(异步IO),/dev/poll(Solaris 和 Unix 特有),epoll(Linux 特有),kqueue(BSD 特有),poll,select 等。
mariolu
2019/01/23
3.4K0
如何修改 Nginx 源码实现 worker 进程隔离
最近我们线上网关替换为了 APISIX,也遇到了一些问题,有一个比较难解决的问题是 APISIX 的进程隔离问题。
挖坑的张师傅
2022/12/05
7440
如何修改 Nginx 源码实现 worker 进程隔离
高并发服务器的设计--架构与瓶颈的设计
做架构设计,难免有时候被人问及系统的瓶颈在哪,那首先来了解下什么是瓶颈? 打个形象的比方,人的嘴巴可以吞下一整个面包,但是却咽不下去,因为食管不给力,它比较细,所以嘴巴能吞下的食物大小要受到食管的粗细
李海彬
2018/03/23
2K0
高并发服务器的设计--架构与瓶颈的设计
【Nginx 源码学习】Nginx 架构设计与主流程分析
1、nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。 2、nginx采用了异步非阻塞的方式来处理请求。
看、未来
2022/05/06
1.3K0
【Nginx 源码学习】Nginx 架构设计与主流程分析
Nginx vs Envoy vs Mosn 平滑升级原理解析
本文适合对 Nginx 实现原理比较感兴趣的同学阅读,需要具备一定的网络编程知识。
poslua
2020/01/02
3K1
Nginx vs Envoy vs Mosn 平滑升级原理解析
解读Nginx:深入剖析HTTP启动流程
1、遇到conf文件的http模块。http不是在Nginx的mian函数中启动,而是解析conf文件时遇到http才会去解析并启动。
Lion Long
2025/01/08
1200
解读Nginx:深入剖析HTTP启动流程
Nginx 是如何解决惊群效应的?
第一次听到的这个名词的时候觉得很是有趣,不知道是个什么意思,总觉得又是奇怪的中文翻译导致的。
LinkinStar
2023/10/18
3790
Nginx 是如何解决惊群效应的?
nginx0.1.0之http模块初始化源码分析(4)
我们继续分析ngx_http_block函数剩余的代码,剩下的代码就是处理phases和监听的端口、地址、servername的。
theanarkh
2019/03/06
4240
【Nginx 源码学习】平滑重启,源码追踪
重启意味着新旧接替,在交接任务的过程中势必会存在新旧server并存的情形,因此,最主要的问题在于如何保证新旧server可以并存,如果重启前后的server端口一致,如何保证两者可以监听同一端口。
看、未来
2022/05/06
8190
【Nginx 源码学习】平滑重启,源码追踪
Nginx从入门到学会--5.必会的重要概念
在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件。利用nginx封装的connection,我们可以很方便的使用nginx来处理与连接相关的事情,比如,建立连接,发送与接受数据等。而nginx中的http请求的处理就是建立在connection之上的,所以nginx不仅可以作为一个web服务器,也可以作为邮件服务器。当然,利用nginx提供的connection,我们可以与任何后端服务打交道。
后端技术探索
2018/08/10
4410
nginx0.1.0之event模块初始化源码分析(3)
前面已经分析了event初始化的整体流程和第一步create_conf,接下来看一下第二步ngx_conf_parse。这里不分析该函数的代码,该函数主要是遍历配置文件的内容,然后读取命令和参数。最后匹配nginx所有模块的配置,找到处理该指令的函数。我们首先看一下event模块中ngx_event_core_module模块的指令配置。
theanarkh
2019/03/06
5660
nginx事件模块源码分析
事件处理框架所要解决的问题是如何收集,管理,分发事件。这里所说的事件,主要以网络事件和定时器事件为主,而网络事件中又以TCP网络事件为主。由于网络事件与网卡中断处理程序,内核提供的系统调用密切相关,所以网络事件的驱动取决于不同的操作系统平台,在同一操作系统中也受制于不同的操作系统内核版本。因此不同操作系统有不同的事件驱动机制。
stan1ey
2021/08/11
6880
nginx事件模块源码分析
nginx的timeout(基于nginx1.17.9)
nginx中使用timeout的地方非常多,本文主要分析客户端和nginx通信时涉及到的几个timeout。
theanarkh
2020/06/19
8240
Nginx 的异步非阻塞体现在哪里?从理论分析到源码验证
2、那业务层面的异步是怎么个异步法?同步异步的概念我就不说了,前面文章有。异步最重要的标志就是通知,通知,通知!!!
看、未来
2021/10/13
9270
万字多图,搞懂 Nginx 高性能网络工作原理!
在单进程的网络编程模型中。所有的网络相关的动作都是在一个进程里完成的,如监听 socket 的创建, bind、listen。再比如 epoll 的创建、要监听事件的添加,以及 epoll_wait 等待时间发生。这些统统都是在一个进程里搞定。
开发内功修炼
2022/05/09
5550
万字多图,搞懂 Nginx 高性能网络工作原理!
nginx源码阅读(6)http处理流程
Nginx作为一款开源的、高性能的HTTP服务器和反向代理服务器而闻名,本文基于nginx-1.15.0,将为读者简要介绍其HTTP处理流程。
golangLeetcode
2022/08/02
1.1K0
nginx源码阅读(6)http处理流程
都是事件驱动,为什么Nginx的性能远高于Redis?
谈到Redis缓存,我们描述其性能时会这么说:支持1万并发连接,几万QPS。而我们描述Nginx的高性能时,则会宣示:支持C10M(1千万并发连接),百万级QPS。Nginx用C语言开发,而Redis是用同一家族的C++语言开发的,C与C++在性能上是同一级数的。Redis与Nginx同样使用了事件驱动、异步调用、Epoll这些机制,为什么Nginx的并发连接会高出那么多呢?(本文不讨论Redis分布式集群)
陶辉
2020/12/16
2.5K1
都是事件驱动,为什么Nginx的性能远高于Redis?
五分钟学NGINX-详解Nginx 如何处理 HTTP 头部
Nginx 作为高性能的 HTTP 服务器和反向代理服务器,在处理 HTTP 请求时,对 HTTP 头部的处理是至关重要的一环。
五分钟学SRE
2024/04/16
6430
五分钟学NGINX-详解Nginx 如何处理 HTTP 头部
相关推荐
nginx源码阅读(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文