专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Nginx日志配置记录

Nginx日志配置记录

更新时间:2021-09-22 10:14:15 来源:赢咖4 浏览1447次

在本地或通过 syslog 捕获日志文件中有关错误和请求处理的详细信息。

本文介绍了如何在 NGINX Open Source 和 NGINX Plus 中配置错误和已处理请求的日志记录。

设置错误日志

NGINX 将有关遇到的不同严重性级别的问题的信息写入错误日志。在error_log中 指令集日志记录到一个特定的文件,stderr或syslog与指定消息的最低严重级别登录。默认情况下,错误日志位于logs/error.log(绝对路径取决于操作系统和安装),并且记录来自指定级别以上的所有严重级别的消息。

下面的配置将要记录的错误消息的最低严重性级别从error更改为warn:

error_log logs/error.log warn;

在这种情况下,消息warn,error crit,alert,和emerg水平被记录。

错误日志的默认设置全局有效。要覆盖它,请将error_log 指令放在main(顶级)配置上下文中。main上下文中的设置始终由其他配置级别 ( http、server、location)继承。所述error_log指令可以在被同时指定的HTTP ,流 ,server和位置 的水平,并覆盖从较高级别继承设置。如果出现错误,消息只会写入一个错误日志,该日志最接近发生错误的级别。但是,如果error_log在同一级别指定了多个指令,则消息将写入所有指定的日志。

注意:error_log在 NGINX 开源版本1.5.2 中添加了在同一配置级别指定多个指令的能力 。

设置访问日志

NGINX 在处理请求后立即将有关客户端请求的信息写入访问日志。默认情况下,访问日志位于logs/access.log,信息以预定义的组合格式写入日志。要覆盖默认设置,请使用log_format 指令更改记录消息的格式,以及使用access_log 指令指定日志的位置及其格式。日志格式是使用变量定义的。

以下示例定义了日志格式,该格式使用指示响应的 gzip 压缩比率的值扩展了预定义的组合格式。然后将该格式应用于启用压缩的虚拟服务器。

http {
    log_format compression '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';
    server {
        gzip on;
        access_log /spool/logs/nginx-access.log compression;
        ...
    }
}

日志格式的另一个示例可以跟踪 NGINX 和上游服务器之间的不同时间值,这可能有助于在您的网站速度变慢时诊断问题。您可以使用以下变量来记录指示的时间值:

$upstream_connect_time – 与上游服务器建立连接所花费的时间

$upstream_header_time – 从建立连接到从上游服务器接收响应头的第一个字节之间的时间

$upstream_response_time – 从建立连接到从上游服务器接收响应体的最后一个字节之间的时间

$request_time – 处理请求所花费的总时间

所有时间值都以毫秒为单位测量。

http {
    log_format upstream_time '$remote_addr - $remote_user [$time_local] '
                             '"$request" $status $body_bytes_sent '
                             '"$http_referer" "$http_user_agent"'
                             'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
    server {
        access_log /spool/logs/nginx-access.log upstream_time;
        ...
    }
}

在读取结果时间值时,请记住以下几点:

当一个请求通过多个服务器处理时,该变量包含多个以逗号分隔的值

当存在从一个上游组到另一组的内部重定向时,值用分号分隔

当请求无法到达上游服务器或无法接收完整标头时,该变量包含0(零)

如果在连接到上游时发生内部错误或从缓存中获取回复时,该变量包含-(连字符)

可以通过启用日志消息缓冲区和名称包含变量的常用日志文件的描述符缓存来优化日志记录。要启用缓冲,请使用access_log 指令的buffer参数来指定缓冲区的大小。当下一条日志消息不适合缓冲区时以及在其他一些情况下,缓冲的消息然后被写入日志文件 。

要启用日志文件描述符的缓存,请使用open_log_file_cache 指令。

与该error_log指令类似,在 特定配置级别上定义的access_log指令会覆盖先前级别的设置。当请求处理完成时,消息将写入在当前级别配置的或从先前级别继承的日志中。如果一级定义了多个访问日志,则消息将写入所有这些日志。

启用条件记录

条件记录允许从访问日志中排除琐碎或不重要的日志条目。在 NGINX 中,条件日志由access_log 指令的if参数启用。

此示例排除具有 HTTP 状态代码2xx(成功)和3xx(重定向)的请求:

map $status $loggable {
    ~^[23]  0;
    default 1;
}
access_log /path/to/access.log combined if=$loggable;

用例:采样 TLS 参数

许多客户端使用早于 TLS 1.3 的 TLS 版本。尽管许多密码被声明为不安全,但较旧的实现仍在使用它们;ECC 证书提供比 RSA 更高的性能,但并非所有客户端都可以接受 ECC。许多 TLS 攻击依赖于“中间人”,他拦截密码协商握手并强制客户端和服务器选择安全性较低的密码。因此,重要的是将 NGINX Plus 配置为不支持弱密码或旧密码,但这样做可能会排除旧客户端。

您可以评估从客户端获得的 SSL 数据,并确定在删除对旧 SSL 协议和密码的支持时排除的客户端比例。

以下配置示例记录User-Agent任何连接的 TLS 客户端的 SSL 协议、密码和标头,假设每个客户端选择它支持的最新协议和最安全的密码。

在此示例中,每个客户端都由其唯一的 IP 地址和用户代理组合标识。

1.定义自定义日志格式sslparams,包括 SSL 协议的版本 ( $ssl_protocol )、连接中使用的密码 ( $ssl_cipher )、客户端 IP 地址 ( $remote_addr ) 和标准User AgentHTTP 请求字段的值( $http_user_agent):

log_format sslparams '$ssl_protocol $ssl_cipher '
                  '$remote_addr "$http_user_agent"';

2.定义一个键值存储,用于保存客户端及其用户代理的 IP 地址,例如clients:

keyval_zone zone=clients:80m timeout=3600s;

3.创建的变量,例如,$seen对于的每个唯一组合$remote_addr和User-Agent标头:

keyval $remote_addr:$http_user_agent $seen zone=clients;
server {
    listen 443 ssl;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers   HIGH:!aNULL:!MD5;
    if ($seen = "") {
        set $seen  1;
        set $logme 1;
    }
    access_log  /tmp/sslparams.log sslparams if=$logme;
    # ...
}

4.查看使用此配置生成的日志文件:

TLSv1.2 AES128-SHA 1.1.1.1 "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 2.2.2.2 "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 3.3.3.3 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 4.4.4.4 "Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0"
TLSv1 AES128-SHA 5.5.5.5 "Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0"
TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 6.6.6.6 "Mozilla/5.0 (Linux; U; Android 5.0.2; en-US; XT1068 Build/LXB22.46-28) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.10.2.1164 Mobile Safari/537.36"

5.处理日志文件以确定数据的传播:

cat /tmp/sslparams.log | cut -d ' ' -f 2,2 | sort | uniq -c | sort -rn | perl -ane 'printf "%30s %s\n", $F[1], "="x$F[0];'

在此输出中,识别出低容量、安全性较低的密码:

ECDHE-RSA-AES128-GCM-SHA256 =========================
ECDHE-RSA-AES256-GCM-SHA384 ========
                 AES128-SHA ====
ECDHE-RSA-CHACHA20-POLY1305 ==
    ECDHE-RSA-AES256-SHA384 ==

然后您可以检查日志以确定哪些客户端正在使用这些密码,然后决定从 NGINX Plus 配置中删除这些密码。

记录到系统日志

该syslog实用程序是计算机消息日志记录的标准,允许从单个系统日志服务器上的不同设备收集日志消息。在 NGINX 中,日志记录到 syslog 是使用error_log 和access_log 指令中的syslog:前缀配置的。

系统日志消息可以发送到一个server=域名、IP 地址或 UNIX 域套接字路径。可以使用端口指定域名或 IP 地址以覆盖默认端口514. 可以在unix:前缀后指定 UNIX 域套接字路径:

error_log  syslog:server=unix:/var/log/nginx.sock debug;
access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;

在示例中,NGINX 错误日志消息在debug日志级别写入 UNIX 域套接字,访问日志写入具有 IPv6 地址和端口的系统日志服务器1234。

该facility=参数指定记录消息的程序类型。默认值为local7。其他可能的值是:auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0 ... local7。

该tag=参数将自定义标记应用于系统日志消息(nginx在我们的示例中)。

该severity=参数设置访问日志的系统日志消息的严重性级别。严重程度的增加顺序可能的值有:debug,info,notice,warn,error(默认), ,crit,alert和emerg。消息记录在指定级别和所有更严重的级别。在我们的例子中,严重程度error也使crit,alert和emerg被记录的水平。

实时活动监控NGINX Plus 提供实时活动监控界面,显示HTTP 和TCP 上游服务器的关键负载和性能指标。

如果对Nginx感兴趣,不妨来关注一下赢咖4Nginx视频教程,课程内容详细,通俗易懂,适合初学者学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>