20 | 超越 Web 服务器:特权进程和定时任务
20 | 超越 Web 服务器:特权进程和定时任务
讲述:温铭
时长09:14大小8.45M
定时任务
特权进程
非阻塞的 ngx.pipe
写在最后
赞 3
提建议
精选留言(15)
- wusiration2019-07-13通过shared dict判断互斥,存在正在执行中的timer还没更新执行状态,另一个worker继续去执行; 通过判断worker的id指定某个worker执行的方式应该可以实现这一需求4
- Seven2019-07-14我想在init_worker_by_lua阶段通过timer启动一个websocket客户端一直循环收发数据会不会有问题呢?
作者回复: while True 的循环吗?我的建议是跑一段时间,比如 5 分钟,就退掉,然后启动一个新的客户端。
2 - manatee2019-07-10想请问下特权进程是怎么回事,启动or本身就是普通用户。如何获取root权限呢,另外特权进程的使用场景有哪些可以介绍下吗
作者回复: 特权进程和master 进程的权限一样,如果 master 是普通用户,那特权进程也不可能拿到 root 权限。 一般用特权进程来清理日志、重启 OpenResty 自身等需要高权限的任务。
2 - manatee2019-07-10可以通过查看worker id,在指定worker下执行
作者回复: 是的,没错
共 2 条评论2 - 过千帆2020-07-30timer,运行环境,怎么启动的,为什么会每个worker中运行?
- 旺旺2019-09-23老师,在init_worker_by_lua_block里 local ok, err = ngx.timer.every(30, reset_server_list) ok, err = ngx.timer.at(0, reget_ssl_certificate) ok, err = ngx.timer.every(3600, reget_ssl_certificate) 写了三个定时器,怎么执行的效果不是想象中那样呢? 本来是想着一开始的时候就执行一次reget_ssl_certificate,然后每隔1个小时再执行一次reget_ssl_certificate的。 现在就算过了30秒reset_server_list也不执行。 如果只写一个“local ok, err = ngx.timer.every(30, reset_server_list)”是可以的。 意思是ngx.timer.every和ngx.timer.at不能同时混用吗?展开
作者回复: 是可以混用的,它们之间不会互相影响的。如果你确定这里有bug,可以整理一个最小的复现代码,给 OpenResty 提交 issue
共 2 条评论 - 旺旺2019-09-18发现在init_by_lua_block里面开了特权进程后,如果init_worker_by_lua_block又有io.open创建文件操作,那么后面在worker进程里面第一次创建文件时的用户也是root了,然后后面worker里面写文件的时候,会报: failed to open file in append mode. error message: /tmp/wscmd_response.log: Permission denied, 因为/tmp/wscmd_response.log一开始是用root身份创建的,后面再用nobody去写的时候,就会报错。展开
- 搞怪者😘 😒 �...2019-09-17这个定时器跟用curl是一样的嘛,怎么实现毫秒级定时,如果在压力很大的环境下,这样的定时器不就会消耗端口资源吗共 1 条评论
- 旺旺2019-08-29local f, err = io.open(ngx.config.prefix() .. "/logs/nginx.pid", "r") 老师,这个代码也是Lua 的标准库,是不是也是阻塞的,又改采用什么方式优化呢?
作者回复: 磁盘 IO 没有什么优化的方法,这里有一个使用 nginx threads pool 来模拟实现 "非阻塞"的方案:https://github.com/tokers/lua-io-nginx-module,你可以参考下。
共 2 条评论 - 英雄2019-07-23如果不能while true ,那websocket如何等待请求呢?
作者回复: 可以 while true,但是有一个阈值,比如循环 1000 次之后退出循环,重新来一次。
- HelloBug2019-07-14老师好,在讲ngx.timer的时候,说如果在回调函数里使用while true+sleep的方式循环执行任务,因为timer本质是一个请求,上面所说的实现会导致这个请求常驻,这些都是可以理解的,后面说会导致资源的泄露,这个怎么理解呢?
作者回复: 泄漏这个词可能不太恰当,就是会导致很多 Lua 或者 C 对象无法得到释放,长期运行会有很多碎片。
- helloworld2019-07-14local function reload(premature),老师,这个函数的参数premature是什么意思,在这段代码中有什么用呢
作者回复: ngx.timer 的文档是有提到它的作用的: the premature argument takes a boolean value indicating whether it is a premature timer expiration or not. Premature timer expiration happens when the Nginx worker process is trying to shut down, as in an Nginx configuration reload triggered by the HUP signal or in an Nginx server shutdown. When the Nginx worker is trying to shut down, one can no longer call ngx.timer.at to create new timers with nonzero delays and in that case ngx.timer.at will return a "conditional false" value and a string describing the error, that is, "process exiting". 简单的说,就是在 Nginx 重启后者关闭的时候,就不要再去创建 timer 了。
- Rye2019-07-11ngx.worker.id() == 0 应该是第一个worker
作者回复: 是的,没错
- chundonglinlin2019-07-10worker slot
- 星亦辰2019-07-10share dict存取执行状态,就可以完成互斥了