Nginx如何处理一个连接

Nginx如何处理一个连接

Nginx作为服务器

1 启动

  • 首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址
  • 然后,nginx的master进程里面,先初始化好这个监控的socket(创建socket--设置addrreuse等选项--绑定到指定的ip地址端口--在listen),然后再fork出多个子进程出来,然后子进程会竞争accept新的连接。
    此时,客户端就可以向nginx发起连接了。

2 客户端向Nginx发起连接

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

Nginx作为客户端

Nginx也可以作为客户端来请求其他server的数据(如upstream模块),此时与其他server创建连接,所创建的连接也封装在ngx_connection_t结构体中。作为客户端:

  • 首先:nginx获取一个ngx_connection_t结构体
  • 然后,创建socket,并设置socket属性(比如非阻塞)
  • 之后,通过添加读写事件,调用connect/read/write来调用连接
  • 最后,关掉连接,释放ngx_connection_t。

参考:详细文章

原文地址:https://www.cnblogs.com/vinsent/p/12259430.html

时间: 2024-11-05 22:53:31

Nginx如何处理一个连接的相关文章

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;

Nginx是如何处理一个请求

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

netty 处理远程主机强制关闭一个连接

netty   处理远程主机强制关闭一个连接,首先看下api解释: /**  * Returns {@code true} if and only if the channel should not close itself when its remote  * peer shuts down output to make the connection half-closed.  If {@code false}, the connection  * is closed automaticall

Linux-rhel6.4 编译安装PHP,Nginx与php连接

确定依赖包安装 gcc gcc-c++ libxml2 libxml2-devel bzip2 bzip2-devel libmcrypt libmcrypt-devel openssl openssl-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel readline readline-devel libxslt-devel perl perl-devel psmisc.x86_64 recode recode-deve

nginx是一个反向代理的软件

nginx只是一个反向代理的软件,和语言无关,理论上支持任何Web平台,当然http://Asp.net也不例外,http://51aspx.com就是http://Asp.net开发的,前端暴漏的是nginx Nginx和后端无关,他是HTTP传输过程中的一个中间层,负责将请求转发到他身后的应用服务器.对于客户端和最终的服务端,都是感知不到Nginx的存在的

ACCESS通过一个连接写入的数据,另一个连接却读取不出来

最近在用c#实现一个数据导入的功能,将一个ACCESS数据库中的数据导入到另一个ACCESS的数据库中,然后显示出来,但是导入成功了,却显示不出来. 经过研究觉得应该是缓存的原因,由于我写入数据和读取数据使用的不是一个OleDbConnection对象,而是分别打开了两个OleDbConnection连接对象:一个连接写入成功了,但保存到磁盘还需要点时间,所以这个连接写入成功,另一个连接立即去取就会有取不到的情况! 改为使用一个连接对象,问题就解决了.

Nginx 72万连接性能测试(一)

转自:http://my.oschina.net/chenzhuo/blog/150200?p=2#comments 根据系统内存64G估算单台tengine做反向代理最高支持72万连接.为了验证达到该连接数时系统稳定运行,进行压测,先验证nginx与client建立72万连接时性能(不转发). 关闭超线程,12核CPU对应12个nginx worker进程,每个进程worker_connections为60000,且关闭accept_mutex.前端LVS做FNAT模式转发,开synproxy

nginx的web连接出现过多的TIME_WAIT

sysctl -a命令可以查看系统中的内核参数 所有的这些参数对应着是/proc/sys/下面的文件 将/proc/sys中的文件转换成sysctl中的变量依据下面两个简单的规则: 1.去掉前面部分/proc/sys 2.将文件名中的斜杠变为点 例如: /proc/sys/net/ipv4/ip_forward => net.ipv4.ip_forward /proc/sys/kernel/hostname => kernel.hostname nginx的web连接中出现过多的TIME_WA

ACCESS通过一个连接写入的数据,还有一个连接却读取不出来

近期在用c#实现一个数据导入的功能,将一个ACCESS数据库中的数据导入到还有一个ACCESS的数据库中,然后显示出来,可是导入成功了.却显示不出来. 经过研究认为应该是缓存的原因,因为我写入数据和读取数据使用的不是一个OleDbConnection对象.而是分别打开了两个OleDbConnection连接对象:一个连接写入成功了,但保存到磁盘还须要点时间.所以这个连接写入成功.还有一个连接马上去取就会有取不到的情况! 改为使用一个连接对象.问题就攻克了.