php 如何多台服务器集中日志
1、一、 集中化日志管理系统的技术原理
集中化日志管理系统中服务器角色分为客户端和服务器端,客户端定期(cron实现)切割系统及应用程序的日志(shell脚本实现),按一定的格式命名,并用TFTP协议将其推送到中心主机。
中心主机运行TFTP服务端程序,接受各个客户端传送而来的日志文件,定期(cron)将日志文件归档,如按客户端IP将日志文件存入不同的目录。 同时为了简化日志的阅读,我们在中心主机上安装nginx (其它http server也可),开启目录浏览功能,这样无论是开发人员,还是运维人员,均可通过web页面检查所有客户端日志,大大提高日志巡查效率。
需要注意的事,在这套系统中我们选择使用了TFTP,而没有使用其它方式(如SSH密钥文件认证、NFS、rsync),是出于安全性的考虑,如果使用ssh密钥认证,如果某个客户端被入侵,那么中心主机也难逃厄运。同时TFTP协议简单,无须验证,也简化了我们部署流程。
2、二、部署流程
中心主机的部署过程:
1. 安装TFTPD(TFTP服务器端,安装光盘中rpm包)和http server(这里使用nginx)。
显然TFTPD的根目录和nginx的日志浏览站点根目录可一样,也可不一样。在本文中,两者的根目录设置成一样。
A. 建立TFTPD根目录,并设置好相应权限(用于保存客户端发送而来的日志文件),假设要将日志保存在/data/logs目录中,则需要在中心主机上运行以下命令
mkdir /data/logs
chown -R nobody:nobody /data/logs
/usr/sbin/in.tftpd -u nobody -s /data/logs --umask=002 -p -c -l
这样,TFTPD就配置完毕了,然后在其它机器(也可以中心主机)上,用tftp客户端命令测试下,看看是否能上传文件(需要在客户端安装tftp客户端)假设中心主机IP是172.169.10.1,使用以下命令测试:
cd /var/log
tftp 172.169.10.1 -c put messages messages.log
以上命令是尝试将当前机器的messages文件发送给TFTPD服务器,并以messages.log保存。
若测试没有问题,则可以进行下一步配置
B. 配置nginx(Apache也可)并开启目录浏览功能
编辑nginx的配置文件(假设日志浏览站点主机名是logs.local),建立以下虚拟主机配置:
server {
listen 80;
server_name logs.local ;
root /data/logs;
autoindex_exact_size off;
autoindex_localtime on;
autoindex on;
}
修改nginx配置目录下的mime.types,加入以下行
text/plain log;
这样,当在浏览器中点击log文件时,将不会下载,而是直接在浏览器中打开。
然后执行nginx -s reload使用配置生效。再使用浏览器访问logs.local,观察是否可浏览目录(本例中需要在本机hosts中绑定172.169.10.1 logs.local)
2. 客户端部署
相关的shell脚本已经由笔者写好,如果你看到的文章中没有附件下载链接(文章被其它站点转载时,附件丢失),请发邮件到笔者信箱zhangxugg@163.com索取。
A. 安装tftp客户端,直接使用Linux光盘中的tftp-0.49-2.x86_64.rpm安装即可
B. 将笔者提供的sync_logs.sh脚本复制到合适的位置(假设复制到/root/tools目录下)
cd /root/tools
#设置运行权限
chmod u+x sync_logs.sh
vi编辑sync_logs.sh的关键配置
f pm_log=/usr/local/php5.3.6/var/log/php-fpm.log
fpm_slowlog=/usr/local/php5.3.6/var/log/php-slow.log
fpm_pid=/usr/local/php5.3.6/var/run/php-fpm.pid
以上分别是php-fpm的错误日志、php慢日志(执行过慢的php脚本日志)、php-fpm的pid文件完整路径,如果此客户端没有安装php-fpm,则在这三行前加#将其注释即可。
mysql_log=/data/front/mysql.log
mysql_slowlog=/data/front/mysqlslow.log
mysql_pid=/data/front/my.pid
以上分别是MySQL的错误日志,慢查询日志,MySQL的pid文件路径,如果此客户端没有运行MySQL, 将其注释即可
nginx_log=/usr/local/nginx/logs/error.log
nginx_pid=/usr/local/nginx/logs/nginx.pid
nginx的错误日志及pid文件路径,如果此客户端没有安装nginx, 则注释之。
server= 172.169.10.1
中心主机的ip或域名
修改完毕后,运行脚本并观察结果
./sync_logs.sh
若没有错误发生,回到中心主机的TFTPD根目录中,观察是否有类似172.169.10.16_messages_2011-05-21.log文件生成(172.169.10.16是客户端IP),如果存在,则证明同步日志功能搭建成功。
C. 建立cron任务,定期推送日志
crontab -e
#输入以下内容,每天早上6点自动向中心主机传送日志
0 8 * * * /root/tools/sync_logs.sh
3. 为中心主机设置日志归档功能
客户端上传的日志以“IP_日志名称_日期.log”格式保存到TFTP服务器根目录下,TFTP服务器需要定期将这些日志按IP归档。将附件的move_logs.sh复制到中心主机合适的位置(这里是/root/tools/move_logs.sh),如果你找不到此脚本的下载链接,请发邮件到zhangxugg@163.com索取。
修改move_logs.sh中的logpath参数,将其指向到真实的日志位置(本例中是/data/logs)
cd /root/tools
chmod u+x move_logs.sh
至此,按第2步给其它主机设置即可。
FAQ:
此脚本在切割日志时(如MySQL php-fpm, nginx),会影响服务吗?
不会,因为脚本使用的是向服务程序(syslog, mysql, nginx)发送信号的方式让其重新生成日志,故不会影响应用服务。
不支持Aapache的错误日志?
是的,我们的环境中已经没有使用Apache了。若你的环境中有Apache, 则修改sync_logs.sh加入Apache日志推送功能即可。
3、三、附录:常见应用程序的日志设置
1. MySQL的错误日志及慢日志设置
修改MySQL的配置文件(一般为/etc/my.cnf),修改以下几项即可:
log-slow-queries="/usr/data/mysql/data/slow.log"
long-query-time=1
log-error="/usr/data/mysql/data/mysql.log"
修改完毕,须重启MySQL方可生效。
2. nginx的日志设置
修改nginx的主配置文件(如/usr/local/nginx/config/nginx.conf)
error_log logs/error.log;
指定日志路径(相对路径及绝对路径均可)
3. php-fpm错误日志及慢日志
php 5.3.0以上版本自带了fpm (fastcgi process manager)模块,可与nginx完美搭配。而新 增的日志功能更为实用,可通过修改php-fpm.conf进行配置(假设php安装在 usr/local/php5.3.6),则编辑 /usr/local/php5.3.6/etc/php-fpm.conf
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
以上定义主要是记录php程序中错误(运行时程序错误,这对php项目维护人员相当有用)
[www]
request_slowlog_timeout = 1s
slowlog = /usr/local/php5.3.6/var/log/php-slow.log
定义php慢日志, 执行时间超过1秒,则认为存在性能问题,这对php项目的维护人员非常有用,通过它,可清楚得知php程序中的性能问题。比较遗憾的是官方php源码只提供到最小秒级的记录。
以上两个特性(特别是php慢日志),是我毫不迟疑选择php-fpm+nginx的理由之一。