Nginx 日志管理

本文将介绍怎样去配置 nginx 的日志格式以及怎样在 server 中指定特定 server 的日志。

在本文将主要介绍 nginx 配置文件中 log_format 和 access_log 指令。其中,通过 log_format 设置日志输出格式;通过 access_log 设置日志输出位置;

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"';

上面是 nginx 配置文件中官方给出的日志格式实例,默认是被注释的。下面将分别介绍其中每部分的含义:

  • $remote_addr 远程客户端的IP地址

  • $remote_user 远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如:登录百度的用户名 scq2099yt,如果没有登录就是空白

  • $time_local 访问的时间与时区,比如:18/Jul/2012:17:00:01 +0800,时间信息最后的 "+0800" 表示服务器所处时区位于 UTC 之后的 8 小时

  • $request 请求的 URI 和 HTTP 协议,这是整个 PV 日志记录中最有用的信息,记录服务器收到一个什么样的请求

  • $status 记录请求返回的 http 状态码,比如:成功是 200,没有找到是 404

  • $body_bytes_sent 发送给客户端的文件主体内容的大小,比如:899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量

  • $http_referer 记录从哪个页面链接访问过来的

  • $http_user_agent 客户端浏览器信息

  • $http_x_forwarded_for 客户端的真实 ip,通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过 $remote_add 拿到的 IP 地址是反向代理服务器的 iP 地址。反向代理服务器在转发请求的http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址

  • $server_name 虚拟主机名称

  • $uptream_status upstream状态,比如成功是200

  • $upstream_addr 后端服务器的IP地址

  • $upstream_status 后端服务器返回的HTTP状态码

  • $ssl_protocol SSL协议版本,比如TLSv1

  • $ssl_cipher 交换数据中的算法,比如RC4-SHA

  • $upstream_addr upstream的地址,即真正提供服务的主机地址

  • $request_time 整个请求的总时间

  • $upstream_response_time 请求过程中,upstream 的响应时间

nginx 默认日志格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

192.168.238.1 - - [06/Jul/2018:13:58:49 +0800] "GET /images/sli-rit.png HTTP/1.1" 200 730 "https://business.hxstrive.com/css/style.css" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3722.400 QQBrowser/10.5.3751.400"

其中:

  • $remote_addr :远程客户端IP地址为 192.168.238.1

  • $remote_user :为空

  • $time_local : 请求时间为 06/Jul/2018:13:58:49 +0800

  • $request :请求行为 GET /images/sli-rit.png HTTP/1.1,包含了HTTP方法、资源地址和HTTP协议

  • $status :HTTP状态码为 200

  • $body_bytes_sent :HTTP报文主体部分的长度为 730

  • $http_referer :该请求来源于那个页面。这里为 https://business.hxstrive.com/css/style.css

  • $http_user_agent :用户浏览器信息为“Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3722.400 QQBrowser/10.5.3751.400”

  • $http_x_forwarded_for :如果通过代理访问,该字段为真实客户端的IP地址,此处为空

自定义 nginx 日志格式

自定义自己的日志格式。日志只包含“远程地址”和“请求行”信息。

# 自定义日志格式
log_format simple '$remote_addr $request';

输出如下:

192.168.238.1 GET /images/img-sprite.png HTTP/1.1

192.168.238.1 GET /images/content_middle.jpg HTTP/1.1

192.168.238.1 GET /images/header_bg.jpg HTTP/1.1

192.168.238.1 GET /images/2.png HTTP/1.1

192.168.238.1 GET /images/tooltip.png HTTP/1.1

192.168.238.1 GET /favicon.ico HTTP/1.1

其中:

  • $remote_addr 为 192.168.238.1,表示客户的IP地址

  • $request 为 GET /favicon.ico HTTP/1.1 请求行信息

access_log

上面用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径。格式如下:

access_log  path(存放路径)  format_name(自定义日志名称,和 log_format 设置的名称一致)

示例:

access_log /root/nginx/logs/access.log myFormatName;

注意:

access_log 可以在 http 模块中为所有的虚拟机指定统一的日志位置,也可以为某个虚拟机(server)指定独有的日志位置。

实例:为 phone.hxstrive.com 设置特有的日志位置。如下:

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 自定义日志格式
    log_format simple '$remote_addr $request';
    
    server {
        listen  80;
        server_name phone.hxstrive.com;
        # 指定日志格式和日志格式化名称
        access_log /root/log/phone.log simple;
        location / {
            root html;
            index index.html;
            proxy_pass 	https://localhost:8080/phone/;
            proxy_redirect off;
            proxy_connect_timeout 4s;
            proxy_read_timeout 600s;
            proxy_send_timeout 8s;
        }
    }
}

当然也可以为所有server设置统一的日志,如下:

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    log_format simple '$remote_addr $request';

    #access_log  logs/access.log  main;
    access_log /root/log/access.log simple;
}

注意:
在定义日志目录中要注意的是,nginx 进程设置的用户和组必须有对该路径创建文件的权限,假设 nginx 的 usr 指令设置的用户名和用户组都是 www,而 logs 目录的用户名和组是 root,那么日志文件将无法被创建。

 

有勇气承担命运这才是英雄好汉。——黑塞
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号