作为服务器
在默认情况下,Nginx启动后,首先解析配置文件,获得监听端口与地址,初始化socket(创建socket,设置addrreuse等选项,绑定IP,listen),然后fork()出指定数目的子进程(worker进程),master进程关闭用于监听的socket,接由子进程竞争accept新的连接。此时,客户端就可以向Nginx发起连接了。客户端连接Nginx时,会引发惊群效应(可使用accept_mutex让Nginx每次只有一个worker进程进行连接),但是只有一个子进程会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。
网友评论