location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.html; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
� 首先,Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在
Nginx 的 Master 进程里面先初始化好这个监控的 Socket(创建 S ocket,设置 addr、
reuse 等选项,绑定到指定的 ip 地址端口,再 listen 监听)。
� 然后,再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新
进程被称为子进程) 出多个子进程出来。
� 之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。
当客户端与 nginx 进行三次握手,与 nginx 建立好一个连接后。此时,某一个子进
程会 accept 成功,得到这个建立好的连接的 Socket ,然后创建 nginx 对连接的封装
,即 ngx_connection_t 结构体。
� 接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。
� 最后,Nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
Nginx 是如何实现高并发的?
如果一个 server 采用一个进程 (或者线程) 负责一个 request 的方式,那么进程
数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多
的应该是等待网络传输。
而 Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时
候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并
发问题。
Nginx 是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责
一个 request 的方式,那么,同时进来 4 个 request 之后,每个进程就负责其中
一个,直至会话关闭。期间,如果有第 5 个 request 进来了。就无法及时反应
了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一
个 request ,就新开个进程来处理。
回想下,BIO 是不是存在酱紫的问题?
“
Nginx 不这样,每进来一个 request ,会有一个 worker 进程去处理。但不是全
程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后
端)服务器转发 request ,并等待请求返回。那么,这个处理的 worker 不会这