一、目的
將nginx 日志通過普通用戶利用rsync公鑰認證的方式實時同步到本地服務器上,之后使用elk程序進行處理。
二、遇到問題及解決方法思路
問題1.文件權限:nginx 的日志默認權限如下:
[root@elk ~]# ll /var/log/nginx/access.log -rw-r----- 1 nginx adm 36330 Sep 11 10:26 /var/log/nginx/access.log
我新建的是普通用戶,標准的用戶組,用rsync同步時,報個錯誤,說是沒有該文件的權限
receiving file list ... 1 file to consider rsync: send_files failed to open "/var/log/nginx/access.log": Permission denied (13)
問題1解決方法:於是我直接修改了該文件的權限為其它用戶也可讀。修改后的權限如下:
[root@elk ~]# ll /var/log/nginx/access.log -rw-r--r-- 1 nginx adm 36330 Sep 11 10:26 /var/log/nginx/access.log
上述方法修改后,普通帳號是可以讀取該日志的。rsync同步到本地也沒有問題
問題2.第二天查看,發現rsync 同步計划有失敗錯誤的信息。檢查后發現文件權限竟然又變成之前的640了。
查了nginx相關的資料:關於日志切割的任務計划、日志默認權限、以及linux 用戶組的權限,在下一節將主要說明。
問題2解決方法:將之前用於同步的普通用戶加入一個附屬組,即adm 組中。或者重新建立一個權限合適(對系統日志只讀、並附加的adm組)的用戶,如下:
[root@elk ~]# useradd -m -g systemd-journal -G adm logersync
三、涉及知識點
1.nginx日志logrotate 程序自動切割:
nginx 的日志文件,每天都會自動分割,/var/log/nginx/*.log,並自動gzip打包存放在和日志同級目錄下。
先看下logrotate程序中nginx 分割的配置文件
[root@elk ~]# cat /etc/logrotate.d/nginx /var/log/nginx/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }
默認參數解釋:
- daily:按照每日進行日志切割(weekly、monthly)
- missingok:日志不存在時忽略錯誤
- rotate:切割52次后,然后會刪除最早的
- compress:使用gzip壓縮切割后的日志
- delaycompress:如果一個日志還正在寫入或被程序使用,分割后將會稍后壓縮。
- notifempty:不切割空的文件
- create 640 nginx adm:設置切割后新的日志文件權限是640,屬主是nginx,屬組是adm(這里就是我第的二個問題原因所在)
- sharedscripts:所有的log文件執行切割完成后,在執行下面的腳本
- postrotate:下面[]號中的內容,是向nginx主進程發送一個USR1的信號,告訴nginx,日志已經切割,你應該使用新的文件。
- endsrciprs:腳本結束
nginx
參考資料:
https://zh.wikipedia.org/wiki/SIGUSR1%E5%92%8CSIGUSR2
http://drumcoder.co.uk/blog/2012/feb/03/nginx-and-logrotate/
2.用戶所在組權限問題
添加用戶時可以指定組,如下:
[root@elk ~]# useradd -g adm testuser1 [root@elk ~]# id testuser1 uid=1002(testuser1) gid=4(adm) groups=4(adm)
上面加了一個testuser1用戶並指定組為adm組。創建用戶時如果不指定組,將會自動創建一個與用戶名同名的組名及gid號
還可以給用戶添加多個組。這樣就擁有其它組下的權限了,如:
[root@elk ~]# gpasswd -a testuser1 users Adding user testuser1 to group users [root@elk ~]# id testuser1 uid=1002(testuser1) gid=4(adm) groups=4(adm),100(users)
上面是將testuser1 也附加到users組中。
四、總結
主要涉及到了nginx服務的日志切割的默認。
參考文章:
https://wiki.archlinux.org/index.php/Users_and_groups_(簡體中文)