1.如何进行热部署
- 先将现有的nginx二进制文件备份一下
cp nginx nginx.old
- 再将编译好的nginx二进制文件复制进来
- 执行
kill -USR2 112233
这个112233是现在的nginx的master进程pid号 , 这是告诉nginx的master要优雅退出 - 执行
kill -WINCH 112233
这个告诉老的nginx的worker进程要优雅退出
2.如何进行日志切割
- 先将老的access.log备份
执行
nginx -s reopen
, 这个时候就会再重新生成一份access.log , 当然也可以执行kill -USR1 112233
3.nginx的进程结构
它的进程结构是: 一个master进程 + 多个worker进程 + 一个Cache Manger进程 + 一个Cache Loader进程 , 其中 一个worker进程占一个cpu, 大部分情况是有几个cpu就搞几个worker进程
4.如何用信号管理nginx进程
nginx进程之间会通过信号来管理, 其中:
master进程会接受如下信号:
- TERM , INT (相当于-s stop 会立刻停止)
- QUIT 优雅停止
- HUB 重载配置文件
- USER1 切割日志
- USER2 ,WINCH 热部署的时候使用
worker进程会接受这样的信号: TERM , QUIT , USER1 , WINCH , 也可以使用nginx命令行:
reload(相当于HUB信号) , quit(QUIT) , reopen(USER1) , stop(TERM)
5.nginx热升级流程
- 将nginx文件换成新nginx文件
- 向老master进程发送
USER2
信号 - master进程修改pid文件名 , 加后缀.oldbin
- nginx用新nginx文件启动新nginx进程
- 向老master进程发送
WINCH
, 关闭老worker进程 - 回滚: 向老master进程发送
HUB
, 向新master进程发送QUIT
6.worker进程如何优雅关闭
- 设置定时器
worker_shutdown_timeout
- 关闭监听句柄
- 关闭空闲连接
- 在循环中等待关闭全部连接
- 退出进程
7.nginx的模块分类
每个模块的源代码中, 都会有个ngx_module_t
的结构体 , 这个结构体下面的type
就标识了它属于哪个模块分类
一般来说分为4类 :
- events模块 , 这个就是
NGX_EVENT_MODULE
- http类模块:
NGX_HTTP_MODULE
其中有ngx_http_core_module , 处理请求模块 , 响应过滤模块 , upsteam模块 - mail模块:
NGX_MAIL_MODULE
ngx_mail_core_module - stream模块: NGX_STREAM_MODULE
- 还有一个特殊的conf模块: NGX_CONF_MODULE
在下载好nginx的源代码并解压以后, 会看到src
目录 , 下面会有许多子目录 这些目录大部分就是模块的分类了 , 比如解压到了/usr/local/
下 那这个目录下的src/http
就是属于http模块的 , 进入到这个目录下 , 发现还有一个modules
的子目录 , 这个是用来放可有可无的模块
8.worker协同工作的关键: 共享内存
有哪些模块使用了共享内存:
Ngx_http_lua_api
使用rbtree(红黑树)容器的模块:
Ngx_stream_limit_conn_module
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_uwsgi_module
- Ngx_http_fastcgi_module
ssl:
- Ngx_http_ssl_modul
- Ngx_mail_ssl_module
- Ngx_stream_ssl_module
单链表:
Ngx_http_upstream_zone_module
Ngx_stream_upstream_zone_module
9. nginx有哪些容器
有 数组 , 链表, 队列, 红黑树 , 哈希表, 基数树