共计 4961 个字符,预计需要花费 13 分钟才能阅读完成。
nginx 的 log 日志分为 access.log 和 error.log;其中 access.log 记录了哪些用户、哪些页面以及用户浏览器、ip 和其他的访问信息;error.log 则是记录服务器错误日志.
error.log 日志 的形式如下:
201.158.69.116 – – [03/Jan/2013:21:17:20 -0600] fwf[-] tip[-] 127.0.0.1:9000 0.007 0.007 MX Pythontab.com GET /html/test.html HTTP/1.1 “200” 2426 “http://a.com” “es-ES,es;q=0.8” “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11”
187.171.69.177 – – [03/Jan/2013:21:17:20 -0600] fwf[-] tip[-] 127.0.0.1:9000 0.006 0.006 MX pythontab.com GET /html/test2.html HTTP/1.1 “200” 2426 “http://a.com” “es-ES,es;q=0.8” “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11”
从上面我们可以看出几部分信息:
1. 客户端(用户)IP 地址。如:上例中的 201.158.69.116
2. 访问时间。如:上例中的 [03/Jan/2013:21:17:20 -0600]
3. 访问端口。如:上例中的 127.0.0.1:9000
4. 响应时间。如:上例中的 0.007
5. 请求时间。如:上例中的 0.007
6. 用户地理位置代码(国家代码)。如:上例中的 MX(墨西哥)
7. 请求的 url 地址(目标 url 地址)的 host。如:上例中的 pythontab.com
8. 请求方式(GET 或者 POST 等)。如:上例中的 GET
9. 请求 url 地址(去除 host 部分)。如:上例中的 /html/test.html
10. 请求状态(状态码,200 表示成功,404 表示页面不存在,301 表示永久重定向等,具体状态码可以在网上找相关文章,不再赘述)。如:上例中的 “200”
11. 请求页面大小,默认为 B(byte)。如:上例中的 2426
12. 来源页面,即从哪个页面转到本页,专业名称叫做“referer”。如:上例中的 “http://a.com”
13. 用户浏览器语言。如:上例中的 “es-ES,es;q=0.8”
14. 用户浏览器其他信息,浏览器版本、浏览器类型等。如:上例中的 “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/53 7.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11”
access.log 日志 的格式不是一成不变的,是可以自定义的。在 nginx 的 nginx.conf 配置文件找到:log_format 这里就是日志的格式
#log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
# ‘$status $body_bytes_sent “$http_referer” ‘
# ‘”$http_user_agent” “$http_x_forwarded_for”‘;
#access_log logs/access.log main;
log_format 是 Nginx 的 HttpLog 模块指令,用于指定 Nginx 日志的输出格式。main 为此日志输出格式的名称,可以在下面的 access_log 指令中引用。
eg:
192.168.21.1 – – [27/Jan/2014:11:28:53 +0800] “GET /2.php HTTP/1.1” 200 133 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1707.0 Safari/537.36” “-“192.168.21.128 200 127.0.0.1:9000 0.119 0.119
$remote_addr:客户端地址 192.168.21.1
$remote_user:客户端用户 –
$time_local:时间和时区 27/Jan/2014:11:28:53 +0800
$request:请求的 URL 路径和 HTTP 协议 GET /2.php HTTP/1.1
$status:HTTP 状态 200
$body_bytes_sent:发送给客户端页面大小 133
$http_referer:页面 跳转来源 –
$http_user_agent:用户访问终端 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1707.0 Safari/537.36
$http_x_forwarded_for:HTTP 代理中,请求端真实 IP –
$http_host:用户在浏览器中输入的 URL(IP 或着域名)地址 192.168.21.128
$upstream_status:upstream 状态 200
$upstream_addr:后端 upstream 地址及端口 127.0.0.1:9000
$request_time:页面访问总时间 0.119
$upstream_response_time:页面访问中 upstream 响应时间 0.119
如果在客户端和 Web 服务器之间增加了中间层(比如反向代理服务器),此时 Web 服务器无法直接拿到客户端的 lP,通过 $remote_addr 变量拿到的将是反向代理服务器的 IP 地址。但是,反向代理服务器在转发请求的 HTTP 头信息中,可以增加 X -Forwarded-For 信息,用以记录原有的客户端 lP 地址和原来客户端请求的服务器地址。
这时候,就要用 log_format 指令来设置日志格式,让日志记录 X -Forwarded-For 信息中的 lP 地址,即客户的真实 IP。例如,创建一个名为 mylogformat 的日志格式,再用 $http_x_forwarded_for 变量记录用户的 X -Forwarded-For lP 地址:
log_format mylogformat ‘$http_x_forwarded_for – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
如果不想记录日志,可以使用以下指令关闭日志记录:
access_log off
nginx 日志文件的切割
生产环境中的服务器,由于访问日志文件增长速度非常快,日志太大会严重影响服务器效率。同时,为了方便对日志进行分析计算,须要对日志文件进行定时切割。定时切割的方式有按月切割、按天切割、按小时切割等。最常用的是按天切割。
Nginx 不支持像 Apache 一样使用 cronolog 来轮转日志,但是可以采用以下方式来实现日志文件的切割:
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_20150519084513.log
kill -USR1 Nginx 主进程号
通过 mv 命令将日志文件重命名为 /usr/local/nginx/logs/access_20150519084513.log,然后发送 kill -USR1 信号给 Nginx 的主进程号,让 Nginx 重新生成一个新的日志文件 /usr/local/nginx/logs/access.log。
如果想每天定时切割日志,还须要借助 crontab。我们可以写一个按天切割的日志,按年、月份目录存放日志的 shell 脚本:
[root@localhost logs]# vim /usr/local/nginx/sbin/cut_nginx_log.sh
#!/bin/bash
logs_path=”/usr/local/nginx/logs/”
DAYS=30
mv ${logs_path}access.log ${logs_path}access_$(date -d “yesterday” +”%Y%m%d%H%M%S”).log
#mv ${logs_path}access.log ${logs_path}access_$(date +”%Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒星期 %w”).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
find ${logs_path} -name “access_*.log” -type f -mtime +$DAYS -exec rm {} \;
[root@localhost logs]# chmod +x /usr/local/nginx/sbin/cut_nginx_log.sh
[root@localhost logs]# crontab -e
0 0 * * * /usr/local/nginx/sbin/cut_nginx_log.sh
[root@localhost logs]# service crond restart
Stopping crond: [OK]
Starting crond: [OK]
[root@localhost logs]# chkconfig crond on
[root@localhost logs]#
如果脚本在执行过程中出现下面错误
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed
解决办法:
[root@localhost logs]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
更多 Nginx 相关教程见以下内容:
CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm
使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-11/125067.htm