Nginx是如何处理一个请求

首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen),然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子进程出来,然后子进程会竞争accept新的连接。

此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建nginx对连接的封装,即ngx_connection_t结构体。接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了。

当然,nginx也是可以作为客户端来请求其它server的数据的(如upstream模块),此时,与其它server创建的连接,也封装在ngx_connection_t中。作为客户端,nginx先获取一个ngx_connection_t结构体,然后创建socket,并设置socket的属性( 比如非阻塞)。然后再通过添加读写事件,调用connect/read/write来调用连接,最后关掉连接,并释放ngx_connection_t。

原文地址:https://www.cnblogs.com/pangdajin/p/9534706.html

时间: 2024-10-02 19:38:04

Nginx是如何处理一个请求的相关文章

nginx理解--如何处理一个请求

最好的方法是看官方文档,以下内容都是来自官方文档 如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配 1.基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始:server { listen 80; server_name example.org www.example.org; ...} server { listen 80; server_name example.net www

Nginx如何处理一个请求

看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: 1 server { 2 listen 80; 3 server_name example.org www.example.org; 4 ... 5 } 6 7 server { 8 listen 80; 9 server_name example.net www.example.net;

Djangon如何处理一个请求(How Django processes a request)

当用户从Django服务器站点请求页面时,系统遵循以下算法来确定要执行的Python代码: 1.  首先Django确定要使用的根URLconf模块.通过 ROOT_URLCONF 来设置,具体在 settings.py 配置文件中. 但是如果传入HttpRequest对象具有urlconf属性(由中间件设置),则其值将替换ROOT_URLCONF设置. 2. Django加载该Python模块并查找该变量urlpatterns.这应该是一个Python的django.conf.urls.url

Nginx如何处理一个连接

Nginx如何处理一个连接 Nginx作为服务器 1 启动 首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址 然后,nginx的master进程里面,先初始化好这个监控的socket(创建socket--设置addrreuse等选项--绑定到指定的ip地址端口--在listen),然后再fork出多个子进程出来,然后子进程会竞争accept新的连接. 此时,客户端就可以向nginx发起连接了. 2 客户端向Nginx发起连接 首先:当客户端与nginx进行三次握手,与ngi

nginx js、css多个请求合并为一个请求(concat模块)

模块介绍 mod_concat模块由淘宝开发,目前已经包含在tengine中,并且淘宝已经在使用这个nginx模块.不过塔暂时没有包含在nginx中.这个模块类似于apache中的modconcat.如果需要使用它,需要使用两个”?”问号. 来个范例: http://example.com/??style1.css,style2.css,foo/style3.css 以上将原先3个请求合并为1个请求 如果你担心文件被用户的浏览器缓存而没有及时更新,你依旧可以带上一个版本号的参数,如下: http

【Nginx】如何处理HTTP配置

同一个配置项可以同时出现多个块内,例如HTTP块.server块.location块.一个配置项到底是取哪个块中的值完全有我们定义的模块决定. 处理HTTP配置项分以下4个步骤: 创建数据结构用于存储配置项对应的参数 设定配置项在配置文件中出现时的限制条件与回调方法 实现上述回调方法,或使用Nginx预设的14个回调方法 合并不同级别的同名配置项 1.分配用于保存配置参数的数据结构 创建一个结构体,用来保存感兴趣的参数.例如定义一个下面的结构体: typedef struct { ngx_str

Nginx 中处理 HTTP 请求

概述 在 Nginx 的初始化启动过程中,worker 工作进程会调用事件模块的ngx_event_process_init 方法为每个监听套接字ngx_listening_t 分配一个 ngx_connection_t 连接,并设置该连接上读事件的回调方法 handler 为 ngx_event_accept,同时将读事件挂载到epoll 事件机制中等待监听套接字连接上的可读事件发生,到此,Nginx 就可以接收并处理来自客户端的请求.当监听套接字连接上的可读事件发生时,即该连接上有来自客户端

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者朋友们能够更加容易地理解管道处理HTTP请求的总体流程,我们根据真实管道的实现原理再造了一个“模拟管道”并在此管道上开发了一个发布图片的应用,这篇文章旨在为你讲述管道是如何处理HTTP请求的 目录一.HttpApplication    FeatureCollection    HostingApp

nginx源码分析--请求体的读取(1)

首先请求体的读取已经进入了HTTP请求的11个阶段,针对有些模块需要对请求体做一些处理,那么这个模块就需要在这个阶段注册函数,其中读取请求体的函数ngx_http_read_client_request_body()是存在的,只不过不同的模块可能对请求体做不同的处理,读取请全体的函数是在某个模块的conent_handler函数中包含的,比如比如proxy模块,fastcgi模块,uwsgi模块等这些模块对请求体感兴趣,那么读取请求体的函数在这些模块的content_handler中注册. 上节