有关 nginx 日志权限的问题请教各位大佬

250 天前
 GoodRui

Ubuntu Server 22.04 系统

使用 nginx 官方 apt 源安装

  1. 默认配置文件中的用户是 user nginx;
  2. systemd 服务的配置文件中未指定服务的运行用户及组。
  3. nginx 服务启动后,master 进程用户是 rootworker 进程用户是 nginx
  4. 生成的日志文件在 /var/log/nginx/ 路径下,目录的属主和属组是 root root, 自动生成的 access.log等日志文件的属主和属组是 nginx adm

使用源码包编译安装

  1. nginx 配置文件和 systemd 配置文件中用户的部分和使用 apt 源安装的情况是一样的。
  2. nginx 服务启动后,进程的用户和 apt 源安装后的情况是一样的。
  3. 生成的logs日志目录在 nginx 程序目录,权限是 root root,里面自动生成的 access.log等日志文件的属主和属组是 root root,但是权限是 644,nginx 可以正常写入日志。

想知道为什么编译安装的 nginx 生成的日志,属主和属组为什么会是 root? 如何才能让其生成的 log 文件是 nginx 用户?

因为涉及到日志的处理等问题,如果日志文件的属主是 root,处理起来会很麻烦。

2533 次点击
所在节点    NGINX
32 条回复
retanoj
250 天前
@GoodRui #20
em... 你再看下 #16 或者 #17
GoodRui
250 天前
@retanoj 哦哦谢谢老哥,刚没看到你#16 的回复。如果你这楼说的是对的,那就明白了。我删了 apt 源安装的 nginx 的 log 文件,重启 nginx ,重新生成的 log 文件 owner 确实成了 root root 。那貌似是个无解的问题...
adoal
250 天前
@GoodRui 人肉测试了一下,删掉日志后 systemd 重新启动 nginx.service 新的日志文件是 root 的了……
不过 logrotate -f 手工强制卷了一下日志,归档完了后,新的日志文件就又是 www-data:adm 了。

`
root@asusz97a:/var/log/nginx# ls -al
总计 12
drwxr-xr-x 2 root adm 4096 4 月 29 日 20:23 .
drwxr-xr-x 25 root root 4096 4 月 28 日 00:00 ..
-rw-r--r-- 1 root root 162 4 月 29 日 20:26 access.log
-rw-r--r-- 1 root root 0 4 月 29 日 20:23 error.log
root@asusz97a:/var/log/nginx# cat access.log
::1 - - [29/Apr/2024:20:26:35 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/8.7.1"
::1 - - [29/Apr/2024:20:26:38 +0800] "GET /1434 HTTP/1.1" 404 153 "-" "curl/8.7.1"
root@asusz97a:/var/log/nginx# logrotate -f /etc/logrotate.d/nginx
root@asusz97a:/var/log/nginx# ls -al
总计 12
drwxr-xr-x 2 root adm 4096 4 月 29 日 20:26 .
drwxr-xr-x 25 root root 4096 4 月 28 日 00:00 ..
-rw-r----- 1 www-data adm 0 4 月 29 日 20:26 access.log
-rw-r--r-- 1 root root 162 4 月 29 日 20:26 access.log.1
-rw-r--r-- 1 www-data root 0 4 月 29 日 20:23 error.log
`
adoal
250 天前
如果系统负载不是很高的话,还有一个办法,让 nginx 把日志写进 syslog ,在 rsyslog 的配置里去指定落盘位置和文件权限,甚至可以转发到中央日志服务器,本机就不管这些糟心事了。
ShuWei
250 天前
master 进程在创建 worker 进程的时候,如果需要,会同步创建日志文件并调整日志文件的权限配置,在这些操作之后,才将 worker 进程降权,所以这个时候创建的日志文件的所有者会是高权限的帐户,大部份时候就是 root
GoodRui
249 天前
@adoal 因为开发把一些业务信息写入 error.log ,看用户的数据量,量大的用户一天一个 error.log 就几个 G 了...
GoodRui
249 天前
@adoal 感谢~
貌似虽然权限有 bug ,但是用 logrotate 分割日志貌似也没什么影响...所以也不用纠结了...需要注意的好像就是 logrotate 的执行权限需要使用 root.
adoal
249 天前
@GoodRui logrotate 可以设置切分的周期,最小单位是每小时切一次。如果日志增长不均匀,怕每小时切一次在低增长时段切得太碎,还可以设置仅超过指定的大小才切分。
GoodRui
249 天前
@adoal 因为业务基本是按天强相关的,不管每天日志割出来是多少 G ,还是按天比较方便,如果按大小或者是每天分割多次,日志用起来会很麻烦。
adoal
249 天前
@GoodRui 哦,我误解你的意思了,以为“量大的用户一天一个 error.log 就几个 G 了...”这句话是嫌按天切分单个文件太大,主贴和后面说“用第三方程序分割、归档、检索 nginx 日志”是想找更细粒度的切法
adoal
249 天前
另外 logrotate 基本上不用自己考虑用什么用户身份手工调用的问题,因为它是放在/etc/cron.xxxxly/ 下面的配置里自动定时调用的
GoodRui
249 天前
@adoal 首先,如果只是配置 logrotate 分割配置文件让它自动分割的话,所有的分割任务会被打散在凌晨 3:15~3:45 之间的随机时间点执行。我上面有提到这个对于我们的业务来说是不适用的。我们要求必须 0:00~23:59 为一个天日志。所以我们现在目前都是使用定时任务调用 logrotate 执行,精确控制日志的起始时间节点。
其次,logrotate 的分割任务配置文件中可以指定该任务运的运行用户,会影响分割出的日志文件 owner 和权限。如果这里指定的用户有问题,会导致分割失败,分割后应用程序无权限写入日志文件等问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1036744

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX