nginx日志采集系列(三)-nginx运行进程数

其他文章

nginx日志采集系列(一)-实时日常采集的几种方式 - 掘金 (juejin.cn) nginx日志采集系列(二)-记录遇到的问题 - 掘金 (juejin.cn)

正文

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

lua 复制代码
# 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:

打印了两遍并且完全相同内容?

cmd: tasklist | findstr "nginx"查看nginx进程,有三个

当work_processor设置为1时,为两个:

当work_processor设置为auto时,为17个:

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进程后,又新起了一个进程,但是而且次数的进程内存数据跟已被杀死的一样;

再通过taskkill杀掉主进程:

发现master进程终止后,并没有新起一个master进程,而且再杀死一个worker进程:

这时候是不会再起一个worker进程,而且通过nginx -s stop也停止不了,但是nginx还是在正常工作,这时候想要停止nginx,就只能通过杀掉所有的worker进程了

可以猜想到,master进程是负责创建worker进程的,负责一些管理工作

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

lua 复制代码
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,查看日志:

先记录下日志,注释掉读日志内容,然后查看日志:

可以看到取的是同一个共享缓存的内容,但是由于我的日志是存储到list中,所以可以看成是被这些worker进程分别处理的,没有做重复性工作

参考

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

相关推荐
库库林_沙琪马几秒前
REST接口幂等设计深度解析
spring boot·后端
IT_陈寒3 分钟前
Redis性能提升50%的7个关键优化策略,90%开发者都不知道第5点!
前端·人工智能·后端
智商偏低8 分钟前
ASP.NET Core 身份验证概述
后端·asp.net
冷冷的菜哥9 分钟前
ASP.NET Core使用MailKit发送邮件
后端·c#·asp.net·发送邮件·mailkit
qq_3129201112 分钟前
Nginx限流与防爬虫与安全配置方案
运维·爬虫·nginx·安全
xhbh66627 分钟前
不止是DELETE:MySQL多表关联删除的JOIN语法实战详解
数据库·mysql·程序员·mysql删除语句
canonical_entropy27 分钟前
XDef:一种面向演化的元模型及其构造哲学
后端
小林coding40 分钟前
再也不怕面试了!程序员 AI 面试练习神器终于上线了
前端·后端·面试
lypzcgf44 分钟前
Coze源码分析-资源库-删除插件-后端源码-错误处理与总结
人工智能·后端·go·coze·coze源码分析·ai应用平台·agent平台
文心快码BaiduComate1 小时前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员