nginx重载流程
首先nginx会向master进程发送HUP信号[reload命令] master进程校验配置语法是否正确 master进程打开新的监听端口 master进程用心配置启动新的worker子进程 master进程向老的worker子进程发送QUIT信号 老worker进程关闭监听,处理完当前连接后结束进程 ------------------------------------------------ 从上方的流程可以看出,我们配置了nginx之后 不一定非要进行nginx -t 检查语法的操作 因为nginx每次重载之前是一定要做语法检查的
nginx请求处理流程
为什么worker进程的数量要与cpu的核数相匹配,为什么nginx会采用work master这样的架构模型
在异步处理流程中,需要使用不同的状态机来处理事件.
重点:在内存不足以缓存所有的请求文件和信息的时候,nginx的AIO sendfile 调用会退化为阻塞的磁盘调用
Nginx 单进程和多进程
在生产环境中一般都会使用多进程模式,单进程不足以在生产中使用. nginx采用的是多进程结构,而不是多线程结构.原因就是nginx需要保证它的高可用性与高可靠性 work进程和cache进程: 当nginx使用的多线程的时候,因为线程之间共享的同一个地址空间的. 当某一个第三方模块引发的一个地址空间的错误时,在地址越界时会导致整个nginx进程全部挂掉. 而当采用多进程的时候往往就不会出现这些问题.
cache manager是用于给后端做缓存使用的.
cacheloader做缓存管理的
进程之间的通讯都是通过共享内存来进行的
为什么work进程要有很多呢?nginx希望一个nginx进程从头到尾占用一颗CPU所以在我们配置nginx时应当将CPU与核数进行绑定,以便于更好的使用每颗cpu核上的cpu缓存来减少缓存失效的命中率
nginx热升级流程:
优雅的关闭work进程流程:
epoll模型
内存池分配
request_pool_size size; 默认配置: request_pool_size 4k; #注意 如果URL很长的时候可以考虑将这里改大一些,如果url很短,那么这里可以改的更小.这样能够优化内存使用率.
共享内存
在nginx中有一些官方模块使用了共享内存:这些模块有跨worker进程通讯,且使用了共享内存
Ngx_http_lua_api Ngx_stream_limit_conn_mudule Ngx_http_limit_conn_module Ngx_stream_limit_req_module http cache 模块: Ngx_http_file_cache Ngx_http_proxy_module Ngx_http_scgi_module Ngx_http_uwcgi_module Ngx_http_fastcgi_module ssl 模块: Ngx_http_ssl_module Ngx_mail_ssl_module Ngx_stream_ssl_module 单链表: Ngx_http_upstream_zone_module Ngx_stream_upstream_zone_module