其他文章

nginx日志收集系列(一)-实时日常收集的几种方式 – (juejin.cn) nginx日志收集系列(二)-记载遇到的问题 – (juejin.cn)

正文

在nginx.conf文件中,加入下面配置:

# http外
worker_processes 2
# http内,server外
init_worker_by_lua_block {
 ngx.log(ngx.ERR, "upload start")
 local delay = 5;
 local cnt = 0;
 function print()
 ngx.timer.at(delay, print)
 ngx.log(ngx.ERR, "cnt: "..cnt);
 cnt = cnt   1;
 end
 print()
 }
log_by_lua_block {
 ngx.log(ngx.ERR, “---log---“);
}
# server 里边
listen 8881
location / {
}

nginx -s reload 从头加载nginx,查看error.log:

nginx日志收集系列(三)-nginx运转进程数
打印了两遍而且完全相同内容?

nginx日志收集系列(三)-nginx运转进程数
cmd: tasklist | findstr “nginx”查看nginx进程,有三个

nginx日志收集系列(三)-nginx运转进程数
当work_processor设置为1时,为两个:

nginx日志收集系列(三)-nginx运转进程数
当work_processor设置为auto时,为17个:

nginx日志收集系列(三)-nginx运转进程数
nginx有两种进程:master和worker,master有一个,而worker的数量便是咱们配置的work_processor;假如设置为auto,那么便是当时主机的cpu核心数

从咱们上面的现象可知,真正干活的是worker init_worker_by_lua_block中的代码显着每个worker进程都独自运转了一遍,可是读取的内容是一致的,阐明拜访内存是相同的

可是,nginx监听到的每个恳求只是被其间一个worker进程处理了

运用taskkill /f /pid 6544 杀掉一个worker进程,能够看到进程打印的日志并没有消失,可是呈现了滞后,所以能够说每个进程读取init_worker_by_lua_block的初始地址是相同的,然后将数据加载到自己的进程内存;杀死worker进程后,又新起了一个进程,可是而且次数的进程内存数据跟已被杀死的相同;

nginx日志收集系列(三)-nginx运转进程数

nginx日志收集系列(三)-nginx运转进程数
再通过taskkill杀掉主进程:

nginx日志收集系列(三)-nginx运转进程数
发现master进程终止后,并没有新起一个master进程,而且再杀死一个worker进程:

nginx日志收集系列(三)-nginx运转进程数
这时候是不会复兴一个worker进程,而且通过nginx -s stop也中止不了,可是nginx还是在正常工作,这时候想要中止nginx,就只能通过杀掉所有的worker进程了

能够猜想到,master进程是担任创建worker进程的,担任一些管理工作

上面咱们知道,worker进程都会运转init_worker_by_lua_block,假如咱们在其间写了一些也无逻辑,那么这些worker进程假如都运转,不是做了重复性工作吗?

log_by_lua_block {
 -- 需求收集的信息
 require "resty.core.shdict"
 local val = 1;
 local key = "log1";
 local logs = ngx.shared.log1;
 while (1 < 2) do
 local len, err = ngx.shared.log1:rpush(key, val);
 if len ~= nil then
 ngx.log(ngx.ERR, "current len of logs cache: ", len);
 else
 ngx.log(ngx.ERR, "cache is full: ", err);
 break;
 end
 val = 1   val;
 ngx.log(ngx.ERR, "fress_space of cache: ", logs:free_space());
 end
 ngx.log(ngx.ERR, "log.....")
 -- do somthing
 }
 init_worker_by_lua_block {
 local key = "logs"
 local get_log = ngx.shared.logs:lpop(key)
 nginx.log(get_log);
 }

咱们往内存中写入1,2,3,4,5,然后再读取; 从头加载下nginx,查看日志:

nginx日志收集系列(三)-nginx运转进程数
先记载下日志,注释掉读日志内容,然后查看日志:

nginx日志收集系列(三)-nginx运转进程数
能够看到取的是同一个同享缓存的内容,可是由于我的日志是存储到list中,所以能够看成是被这些worker进程分别处理的,没有做重复性工作

参阅

详解nginx的master进程和worker进程 – 建铭博客 – 博客园 (cnblogs.com)