作为Web服务器而言,日志是必不可少的也是需要经常查看的。此篇就来介绍下如何自定义Nginx中的日志格式以及使用crontab计划任务来做到每天切割一次日志文件从而做到方便管理。
在Nginx中日志文件是由log_format这个指令来定义的,它的语法如下:
log_format name format ## name:指的是日志格式的名称(后面调用) ## format:设置日志具体格式的
在Nginx中有自己默认的日志格式,如下内容:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';
默认给注释掉了,看一下解释吧。
$remote_addr
客户端的ip地址(如果中间有代理服务器那么这里显示的ip就为代理服务器的ip地址)
$remote_user 用于记录远程客户端的用户名称(一般为“-”) $time_local
用于记录访问时间和时区
$request 用于记录请求的url以及请求方法 $status 响应状态码 $body_bytes_sent 给客户端发送的文件主体内容大小 $http_user_agent 用户所使用的代理(一般为浏览器) $http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 $http_referer 可以记录用户是从哪个链接访问过来的
有时候可能就算启用了$http_x_forwarded_for也无法获取客户端的ip地址详情请参考此篇博文:Nginx 日志获取不到远程访问ip问题解决
http://www.linuxidc.com/Linux/2014-12/110990.htm
通过参考上述内容可以快速的定制出来一个日志格式了,就在上一次做的虚拟主机里增加吧。
Nginx日志文件格式及切割日志文件
上次并没有自定义日志格式并且在限制访问的状态页面也没有启用访问日志,那就写一个吧。
log_format access '$remote_addr $remote_user "$time_local" $request' '$status $http_referer' '"$http_user_agent" $http_x_forwarded_for';
添加的名称为access 日志记录了ip、用户、时间、相应方法及页面、状态码、从哪个链接过来的、用户代理、如果中间有代理也从代理获取用户ip,然后将状态页面的访问日志打开并且给一个文件路径(此文件可以不存在,目录必须存在)然后在路径后面指定好我们刚才设置的名称,也将正常页面的访问日志引用自定义的日志格式。(原来是没有设置名称的,那么就为默认格式)
Nginx日志文件格式及切割日志文件
定义完成后看下是否配置正确
nginx -t
Nginx日志文件格式及切割日志文件
nginx给了一个警告信息,警告我们log_format可能使用在/usr/local/nginx/nginx.conf中的http等级下,如果要修复这个警告按照以下方法即可解决。
将我们的自定义信息放入到nginx.conf配置文件中的http里面(一定要在虚拟主机的配置文件中删除自定义的log_format):
Nginx日志文件格式及切割日志文件
再次检查即可正常使用
Nginx日志文件格式及切割日志文件
将原来的access.log文件删除或者重命名,然后重读配置文件
cd /web/vhost/test1/logs/ mv test1.access.log access.log.bak nginx -s reload #重读配置文件
然后访问下看看日志文件是否和我们自定义的内容一样:
状态页面的访问日志里记录了ip、用户名、时间、请求方法、、访问的页面、页面状态码(由于定义的时候没有加“-”导致了效果不太好)、客户端使用的浏览器、以及代理服务器(本机访问的没有代理服务器所以就为-)
自定义日志就结束了,接下来就是切割日志文件并且每天保存一份当天的日志文件方法如下:
首先将原来的日志文件重命名
mv test1.access.log test1.2014-12-29.log nginx -s reload
这样就可以做到日志文件的切割。如果要每天自动保存的话就要基于crontab来管理了。写个脚本吧
#!/bin/bash # # vhost=test1 ##定义虚拟主机的目录名 log_path=/web/vhost/logs #指定日志文件要保存位置 access_log_path=/web/vhost/${vhost}/logs #指定access日志所在路径 mkdir -p ${log_path}/$(date -d "yesterday" +"%y")/$(date -d "yesterday" +%m)/ ## 创建日期目录,date -d "yesterday" +"%y"获取年份后面那个是获取月份 mv ${access_log_path}/${vhost}.access.log ${log_path}/$(date -d "yesterday" +"%y")/$(date -d "yesterday" +%m)/$(date -d "yesterday" +%d).${vhost}.access.log ## 这里将访问日志文件移动到备份的目录中如:/web/vhost/logs/14/12/28.test1.access.log nginx -s reload ##这里我的nginx在编译的时候使用--sbin-path=/usr/sbin/nginx这个参数了所以我可以直接使用nginx如果没有使用此参数请一定要将你的nginx安装目录下的sbin目录添加至系统环境变量中。
然后将这个脚本文件放到nginx的配置目录下添加定时计划
mkdir /usr/local/nginx/bin && mv logs.sh /usr/local/nginx/bin/logs.sh crontab -e 00 00 * * * /bin/bash /usr/local/nginx/bin/logs.sh
这样在每天的夜晚12点就会自动创建备份文件了,如果要对错误日志也每天备份的话按照上面的内容修改即可。
配置
关于这个的问题
upstream, client: xxxx server: s5.weicot.com, request: "GET /post1721.html HTTP/1.1", upstream: "fastcgi://127.0.0.1:933", host: "www.weicot.com", referrer: "http://www.weicot.com/" 2015/12/14 03:47:51 [error] 25515#0: *1359562 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 00.63.87.21, server: s5.weicot.com, request: "POST /downloader/ HTTP/1.0", upstream: "fastcgi://127.0.0.1:933", host: "www.weicot.com" 2015/12/14 03:50:48 [error] 25515#0: *1360069 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 00.125.71.58, server: s5.weicot.com, request: "GET /robots.txt HTTP/1.1", upstream: "fastcgi://127.0.0.1:933", host: "s5.weicot.com" 2015/12/14 03:51:14 [error] 25513#0: *1360097 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 00.181.108.142, server: s5.weicot.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:933", host: "weicot.com"
As Martin said, this error belong to your backends, although you can make sure that you don’t queue too much requests on a failed backend and get a good overview of backend status with haproxy and its queueing and healthchecking capabilities. Logging of upstream response time in nginx ($upstream_response_time) can be helpful too.
——————————————————-more——————————————————–
location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://ss_api; # match the name of upstream directive # time out settings proxy_connect_timeout 159s; proxy_send_timeout 600; proxy_read_timeout 600; proxy_buffer_size 64k; proxy_buffers 16 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_pass_header Set-Cookie; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_ignore_headers Cache-Control Expires; proxy_set_header Referer $http_referer; proxy_set_header Host $host; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
—————————-more————————————————————-
解决方法:
原因在于nginx proxy的超时时间太短
proxy_connect_timeout 60; proxy_read_timeout 60; proxy_send_timeout 60;
更改为
proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600;
然后重启nginx即可
————————————————–more—————————————————————-
1. nginx proxy
需要适当的调整proxy_read_timeout值。
location / { ... proxy_read_timeout 150; ... }
2. Nginx作为php-fpm等等其他的有上游服务
在这种情况下,适当的调整fastcgi_read_timeout选项值
location ~* .php$ { include fastcgi_params; fastcgi_index index.php; fastcgi_read_timeout 150; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
参考以及引用
nginx errors: upstream timed out (110: Connection timed out)
NGINX: upstream timed out (110: Connection timed out) while reading response header from upstream