一、背景
某天生产上突然有大量交易报错,一步一步查询下来,最终发现nginx的缓存temp目录的属主被篡改成了nobody,应用用户没有权限读取导致nginx的交易报错。
二、原因
某一个巡检程序脚本是用root权限执行的,脚本中含有nginx -t 命令,当使用root权限执行nginx -t 命令的时候会导致temp目录权限被修改。
why??? 为什么会这样
三、场景复现
我之前在做nginx镜像的时候,发现如果编译的时候不指定用户和属组,在启动镜像的时候会无法启动,因为有些目录没有读取权限,导致启动报错,就想到会不会是因为编译的时候没有指定用户和属组,我就在测试环境重新编译复现了一下,果然是这个原因。具体如何编译安装请看我的另一篇blog nginx编译安装
四、如何避免
1、当编译的时候需要指定 --user --group 为安装的用户目录,否则就会使用默认用户nobody,当使用root权限执行nginx -t 的时候,相关模块temp目录的属主会更改为nobody;
2、nginx.conf 文件中的user指令只有使用root权限运行的时候才会生效 ,即nginx -s reload 命令必须root权限执行这样user指令才会生效,否则会有警告;
3、当nginx.conf文件中的user指令制定之后,且需要指定为应用用户,这样即使使用root权限执行nginx -t 相关模块temp目录的属主也不会更改为noboay;如果指定的用户是非应用用户,即随意指定,当使用root权限执行nginx -t 后,相关模块temp目录的属组会更改为nobody;
4、其他用户,即使有对应的 执行nginx -t命令的权限,相关模块temp目录的属组也不会更改为nobody;