nginx实战六
Nginx错误日志
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/error.md
Nginx错误日志平时不用太关注,但是一旦出了问题,就需要借助错误日志来判断问题所在。 配置参数格式:error_log /path/to/log level;
常见的错误日志级别有debug | info | notice | warn | error | crit | alert | emerg 级别越高记录的信息越少,如果不定义,默认级别为error. 它可以配置在main、http、server、location段里。 如果在配置文件中定义了两个error_log,在同一个配置段里的话会产生冲突,所以同一个段里只允许配置一个error_log。 但是,在不同的配置段中出现是没问题的。
error_log /var/log/nginx/error.log crit; 如果要想彻底关闭error_log,需要这样配置 error_log /dev/null;
1.实验:编辑nginx主配置文件将error级别配置为crit
[root@centos-03 conf]# vim nginx.conf
#error_log logs/error.log;
error_log logs/error.log crit;
#error_log logs/error.log info;
[root@centos-03 conf]# vim vhost/1.conf
server { listen 80; server_name www.123.com; index index.html; root /data/wwwroot/www.1.com; rewrite_log on; location / { rewrite /123.html /1.html redirect; error_log /tmp/nginx.err debug; } }
[root@centos-03 conf]# /usr/local/nginx/sbin/nginx -s reload [root@centos-03 conf]#
2.清空日志内容
[root@centos-03 conf]# > /tmp/nginx.err [root@centos-03 conf]# > /usr/local/nginx/logs/error.log [root@centos-03 conf]#
3.我们访问一个不存在的文件,错误日志没有记录,虚拟主机定义的有记录
[root@centos-03 conf]# curl www.123.com/123 <html> <head><title>404 Not Found</title></head> <body bgcolor="white"> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.14.0</center> </body> </html> [root@centos-03 conf]# cat /usr/local/nginx/logs/error.log [root@centos-03 conf]# cat /tmp/nginx.err 2018/07/28 16:07:53 [notice] 29883#0: *71 "/123.html" does not match "/123", client: 127.0.0.1, server: www.123.com, request: "GET /123 HTTP/1.1", host: "www.123.com" 2018/07/28 16:07:53 [error] 29883#0: *71 open() "/data/wwwroot/www.1.com/123" failed (2: No such file or directory), client: 127.0.0.1, server: www.123.com, request: "GET /123 HTTP/1.1", host:
"www.123.com" 2018/07/28 16:07:53 [info] 29883#0: *71 client 127.0.0.1 closed keepalive connection [root@centos-03 conf]#
[root@centos-03 conf]# curl www.123.com/123.html <html> <head><title>302 Found</title></head> <body bgcolor="white"> <center><h1>302 Found</h1></center> <hr><center>nginx/1.14.0</center> </body> </html> [root@centos-03 conf]# cat /tmp/nginx.err 2018/07/28 16:07:53 [notice] 29883#0: *71 "/123.html" does not match "/123", client: 127.0.0.1, server: www.123.com, request: "GET /123 HTTP/1.1", host: "www.123.com" 2018/07/28 16:07:53 [error] 29883#0: *71 open() "/data/wwwroot/www.1.com/123" failed (2: No such file or directory), client: 127.0.0.1, server: www.123.com, request: "GET /123 HTTP/1.1", host:
"www.123.com" 2018/07/28 16:07:53 [info] 29883#0: *71 client 127.0.0.1 closed keepalive connection 2018/07/28 16:10:30 [notice] 29883#0: *72 "/123.html" matches "/123.html", client: 127.0.0.1, server: www.123.com, request: "GET /123.html HTTP/1.1", host: "www.123.com" 2018/07/28 16:10:30 [notice] 29883#0: *72 rewritten redirect: "/1.html", client: 127.0.0.1, server: www.123.com, request: "GET /123.html HTTP/1.1", host: "www.123.com" 2018/07/28 16:10:30 [info] 29883#0: *72 client 127.0.0.1 closed keepalive connection [root@centos-03 conf]#
Nginx访问日志-日志格式
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/format.md
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/acclog.md
Nginx访问日志格式
Nginx访问日志可以设置自定义的格式,来满足特定的需求。
访问日志格式示例
示例1 log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' '$host "$request_uri" $status' '"$http_referer" "$http_user_agent"'; 示例2 log_format main '$remote_addr [$time_local] ' '$host "$request_uri" $status "$request"' '"$http_referer" "$http_user_agent" "$request_time"'; 若不配置log_format或者不在access_log配置中指定log_format,则默认格式为: '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent";
常见变量
变量 说明 $time_local 通用日志格式下的本地时间;(服务器时间) $remote_addr 客户端(用户)IP地址 $status 请求状态码,如200,404,301,302等 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小 $bytes_sent 发送给客户端的总字节数 $request_length 请求的长度(包括请求行,请求头和请求正文) $request_time 请求处理时间,单位为秒,小数的形式 $upstream_addr 集群轮询地址 $upstream_response_time 指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间 $remote_user 用来记录客户端用户名称 $request 请求方式(GET或者POST等)+URL(包含$request_method,$host,$request_uri) $http_user_agent 用户浏览器标识 $http_host 请求的url地址(目标url地址)的host $host 等同于$http_host $http_referer 来源页面,即从哪个页面转到本页,如果直接在浏览器输入网址来访问,则referer为空 $uri 请求中的当前URI(不带请求参数,参数位于$args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。 $document_uri 等同于$uri $request_uri 比$uri多了参数,即$uri+$args $http_x_forwarded_for 如果使用了代理,这个参数会记录代理服务器的ip和客户端的ip
实验:
1.查看或编辑nginx主配置文件
[root@centos-03 conf]# vim nginx.conf
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $host $server_
port';
2.配置虚拟主机的访问日志文件
[root@centos-03 conf]# vim vhost/1.conf
server {
listen 80;
server_name www.123.com;
index index.html;
root /data/wwwroot/www.1.com;
rewrite_log on;
location /
{
rewrite /123.html /1.html redirect;
error_log /tmp/nginx.err debug;
access_log /tmp/123.com.log main;
}
}
3.测试
[root@centos-03 conf]# /usr/local/nginx/sbin/nginx -s reload [root@centos-03 conf]# curl www.123.com/123.html <html> <head><title>302 Found</title></head> <body bgcolor="white"> <center><h1>302 Found</h1></center> <hr><center>nginx/1.14.0</center> </body> </html> [root@centos-03 conf]# cat /tmp/123.com.log 127.0.0.1 - - [28/Jul/2018:17:09:52 +0800] "GET /123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 80 [root@centos-03 conf]#
配置Nginx访问日志
1.生产机上访问日记格式加上$http_x_forwarded_for这样就可以接收到代理ip了
实验:编辑配置文件为8080端口
root@centos-03 vhost]# vim 1.conf
server {
listen 8080;
server_name www.123.com;
index index.html;
root /data/wwwroot/www.1.com;
rewrite_log on;
location /
{
rewrite /123.html /1.html redirect;
error_log /tmp/nginx.err debug;
access_log /tmp/123.com.log main;
}
}
2.新建代理虚拟主机
[root@centos-03 vhost]# vim proxy.conf
server
{
listen 80;
server_name www.123.com;
location /
{
proxy_pass http://192.168.242.133:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[root@centos-03 vhost]# /usr/local/nginx/sbin/nginx -s reload [root@centos-03 vhost]# curl -x127.0.0.1:8080 www.123.com/123.html (不用代理访问) <html> <head><title>302 Found</title></head> <body bgcolor="white"> <center><h1>302 Found</h1></center> <hr><center>nginx/1.14.0</center> </body> </html> [root@centos-03 vhost]# cat /tmp/123.com.log 127.0.0.1 - - [28/Jul/2018:17:09:52 +0800] "GET /123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 80 127.0.0.1 - - [28/Jul/2018:17:50:37 +0800] "GET HTTP://www.123.com/123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 8080 [root@centos-03 vhost]#
[root@centos-03 vhost]# curl -x127.0.0.1:80 www.123.com/123.html (代理访问)
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.14.0</center>
</body>
</html>
[root@centos-03 vhost]# cat /tmp/123.com.log
127.0.0.1 - - [28/Jul/2018:17:09:52 +0800] "GET /123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 80
127.0.0.1 - - [28/Jul/2018:17:50:37 +0800] "GET HTTP://www.123.com/123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 8080
192.168.242.133 - - [28/Jul/2018:17:52:23 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1" www.123.com 8080
[root@centos-03 vhost]#
3.再加一层代理试试能获取到ip吗
[root@centos-03 vhost]# vim proxy2.conf server { listen 8000; server_name www.123.com; location / { proxy_pass http://192.168.242.133/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
4.用8000端口访问
[root@centos-03 vhost]# /usr/local/nginx/sbin/nginx -s reload [root@centos-03 vhost]# curl -x127.0.0.1:8000 www.123.com/123.html <html> <head><title>302 Found</title></head> <body bgcolor="white"> <center><h1>302 Found</h1></center> <hr><center>nginx/1.14.0</center> </body> </html> [root@centos-03 vhost]# !cat cat /tmp/123.com.log 127.0.0.1 - - [28/Jul/2018:17:09:52 +0800] "GET /123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 80 127.0.0.1 - - [28/Jul/2018:17:50:37 +0800] "GET HTTP://www.123.com/123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 8080 192.168.242.133 - - [28/Jul/2018:17:52:23 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1" www.123.com 8080 192.168.242.133 - - [28/Jul/2018:18:06:21 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1, 192.168.242.133" www.123.com 8080 [root@centos-03 vhost]#
Nginx日志过滤指定文件
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/filter.md
一个网站,会包含很多元素,尤其是有大量的图片、js、css等静态元素。 这样的请求其实可以不用记录日志。
location ~* ^.+\.(gif|jpg|png|css|js)$ { access_log off; } 或 location ~* ^.+\.(gif|jpg|png|css|js)$ { access_log /dev/null; }
实验:
[root@centos-03 vhost]# vim 1.conf server { listen 8080; server_name www.123.com; index index.html; root /data/wwwroot/www.1.com; rewrite_log on; location / { rewrite /123.html /1.html redirect; error_log /tmp/nginx.err debug; } location ~* '(css|js|png|jpg|gif|rar|mp4)$' { access_log off; #access_log /dev/null; } access_log /tmp/123.com.log main; }
访问测试,我们访问css的文件时没有记录日志,访问css1记录了日志
[root@centos-03 vhost]# curl -x127.0.0.1:8000 www.123.com/123.css <html> <head><title>404 Not Found</title></head> <body bgcolor="white"> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.14.0</center> </body> </html> [root@centos-03 vhost]# !cat cat /tmp/123.com.log 127.0.0.1 - - [28/Jul/2018:17:09:52 +0800] "GET /123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 80 127.0.0.1 - - [28/Jul/2018:17:50:37 +0800] "GET HTTP://www.123.com/123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 8080 192.168.242.133 - - [28/Jul/2018:17:52:23 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1" www.123.com 8080 192.168.242.133 - - [28/Jul/2018:18:06:21 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1, 192.168.242.133" www.123.com 8080 [root@centos-03 vhost]#
[root@centos-03 vhost]# curl -x127.0.0.1:8000 www.123.com/123.css1
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.0</center>
</body>
</html>
[root@centos-03 vhost]# cat /tmp/123.com.log
127.0.0.1 - - [28/Jul/2018:17:09:52 +0800] "GET /123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 80
127.0.0.1 - - [28/Jul/2018:17:50:37 +0800] "GET HTTP://www.123.com/123.html HTTP/1.1" 302 161 "-" "curl/7.29.0" "-" www.123.com 8080
192.168.242.133 - - [28/Jul/2018:17:52:23 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1" www.123.com 8080
192.168.242.133 - - [28/Jul/2018:18:06:21 +0800] "GET /123.html HTTP/1.0" 302 161 "-" "curl/7.29.0" "127.0.0.1, 192.168.242.133" www.123.com 8080
192.168.242.133 - - [28/Jul/2018:18:31:14 +0800] "GET /123.css1 HTTP/1.0" 404 169 "-" "curl/7.29.0" "127.0.0.1, 192.168.242.133" www.123.com 8080
[root@centos-03 vhost]#
Nginx日志切割
https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/rotate.md
如果任由访问日志写下去,日志文件会变得越来越大,甚至是写满磁盘。 所以,我们需要想办法把日志做切割,比如每天生成一个新的日志,旧的日志按规定时间删除即可。 实现日志切割可以通过写shell脚本或者系统的日志切割机制实现。
shell脚本切割Nginx日志
切割脚本内容: #!/bin/bash logdir=/var/log/nginx //定义日志路径 prefix=`date -d "-1 day" +%y%m%d` //定义切割后的日志前缀 cd $logdir for f in `ls *.log` do mv $f $f-$prefix //把日志改名 done /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null //生成新的日志 bzip2 *$prefix //压缩日志 find . -type f -mtime +180 |xargs /bin/rm -f //删除超过180天的老日志
系统日志切割机制
在/etc/logrotate.d/下创建nginx文件,内容为: /data/logs/*log { daily rotate 30 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || : endscript } 说明: 1 nginx日志在/data/logs/目录下面,日志名字以log结尾 2 daily表示每天切割 3 rotate 30表示日志保留30天 4 missingok表示忽略错误 5 notifempty表示如果日志为空,不切割 6 compress表示压缩 7 sharedscripts和endscript中间可以引用系统的命令 8 postrotate表示当切割之后要执行的命令
实验:
1.日志切割不仅仅是访问日志、错误日志也应该切割,日志切割最好是把所有的日志集中在一个目录下,我们这里把所有的日志放到data/logs下
[root@centos-03 ~]# cd /usr/local/nginx/conf/vhost/ [root@centos-03 vhost]# mkdir /data/logs/ [root@centos-03 vhost]#
2.给每个虚拟主机配置日志文件
[root@centos-03 vhost]# vim 1.conf server { listen 8080; server_name www.123.com; index index.html; root /data/wwwroot/www.1.com; rewrite_log on; location / { rewrite /123.html /1.html redirect; error_log /data/logs/123.com.err.log debug; } location ~* '(css|js|png|jpg|gif|rar|mp4)$' { access_log off; #access_log /dev/null; } access_log /data/logs/123.com.acc.log main; }
3.测试是否生成新的日志文件
[root@centos-03 vhost]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@centos-03 vhost]# /usr/local/nginx/sbin/nginx -s reload [root@centos-03 vhost]# ls /data/logs/ 123.com.acc.log 123.com.err.log [root@centos-03 vhost]# curl -x127.0.0.1:8000 www.123.com/123 -I HTTP/1.1 404 Not Found Server: nginx/1.14.0 Date: Sat, 28 Jul 2018 13:03:47 GMT Content-Type: text/html Content-Length: 169 Connection: keep-alive [root@centos-03 vhost]#
[root@centos-03 vhost]# cd /data/logs/ [root@centos-03 logs]# ls 123.com.acc.log 123.com.err.log [root@centos-03 logs]# cat * 192.168.242.133 - - [28/Jul/2018:21:03:47 +0800] "HEAD /123 HTTP/1.0" 404 0 "-" "curl/7.29.0" "127.0.0.1, 192.168.242.133" www.123.com 8080 2018/07/28 21:03:47 [notice] 30143#0: *99 "/123.html" does not match "/123", client: 192.168.242.133, server: www.123.com, request: "HEAD /123 HTTP/1.0", host: "www.123.com" 2018/07/28 21:03:47 [error] 30143#0: *99 open() "/data/wwwroot/www.1.com/123" failed (2: No such file or directory), client: 192.168.242.133, server: www.123.com, request: "HEAD /123 HTTP/1.0"
, host: "www.123.com" [root@centos-03 logs]#
4.做日志切割
方法一:
[root@centos-03 logs]# vim /usr/local/nginx/sbin/log_rotate.sh #!/bin/bash logdir=/data/logs/ prefix=`date -d "-1 day" +%y%m%d` cd $logdir for f in `ls *.log` do mv $f $f-$prefix done /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null (USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,
等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。) bzip2 *$prefix find . -type f -mtime +180 |xargs /bin/rm -f
[root@centos-03 logs]# sh -x /usr/local/nginx/sbin/log_rotate.sh + logdir=/data/logs/ ++ date -d '-1 day' +%y%m%d + prefix=180727 + cd /data/logs/ ++ ls 123.com.acc.log 123.com.err.log + for f in '`ls *.log`' + mv 123.com.acc.log 123.com.acc.log-180727 + for f in '`ls *.log`' + mv 123.com.err.log 123.com.err.log-180727 ++ cat /usr/local/nginx/logs/nginx.pid + /bin/kill -USR1 29709 + bzip2 123.com.acc.log-180727 123.com.err.log-180727 + xargs /bin/rm -f + find . -type f -mtime +180 [root@centos-03 logs]# ls 123.com.acc.log 123.com.err.log 123.com.acc.log-180727.bz2 123.com.err.log-180727.bz2 [root@centos-03 logs]#
[root@centos-03 logrotate.d]# crontab -e 0 0 * * * /bin/bash /usr/local/nginx/sbin/log_rotate.sh
方法二
[root@centos-03 logrotate.d]# cd /etc/logrotate.d/ [root@centos-03 logrotate.d]# vim nginx /data/logs/*log { daily rotate 30 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/de v/null || : endscript }