nginx。如何在不破坏服务器日志的情况下记录 ssl 错误

gel*_*ida 5 ssl nginx debugging logging

我有一个网站,它被许多不同的移动设备和嵌入式设备访问。

我经常遇到一些设备无法连接的问题。

原因可能是:

  • 设备无法识别某个 CA
  • 设备太旧,需要旧协议 TLS1.1
  • 该设备需要过时的加密算法或只是加密算法,我没有在服务器 conf 中提供。

由于设备位于远程位置,没有易于访问的日志,我希望能够使用 nginx 日志分析此类问题。

我可以通过增加错误日志日志级别来调试来做到这一点。

error_log  /var/log/nginx/errors_with_debug.log debug;
Run Code Online (Sandbox Code Playgroud)

然而,这个日志包含了很多我不感兴趣的东西。

只有在 ssl 连接被拒绝但所有其他情况下都有正常的错误日志级别时,有没有办法记录详细信息?

到目前为止,我启用了debug日志记录,让设备有问题的远程用户连接并记录跟踪,禁用调试级别,重新加载 nginx 并分析获得的跟踪。

事实上,如果我可以记录由于 SSL 问题而无法连接的任何客户端的日期和 IP 地址,我已经得到了帮助。

理想情况下,我也想记录原因,但知道,尝试连接但由于 SSL 失败将非常有帮助。

Pio*_*asz 3

您提到的所有 SSL 握手错误均由 nginx 在某个级别记录info,因此您无需启用调试。

您没有提及您正在使用哪个发行版,但现在大多数系统都带有SystemD,因此将您的日志重定向到标准错误:

error_log stderr info;
Run Code Online (Sandbox Code Playgroud)

或系统日志:

error_log syslog:server=/dev/log info;
Run Code Online (Sandbox Code Playgroud)

将允许systemd-journald捕获所有 Nginx 日志并管理其大小。一个简单的:

journalctl -u nginx.service -a -p info
Run Code Online (Sandbox Code Playgroud)

将允许您列出以上info级别的所有调试消息(假设您使用系统日志)。

如果某些客户端需要更多数据,可以使用Nginxdebug_connection

events {
    debug_connection 192.0.50.1;
    ...
}
Run Code Online (Sandbox Code Playgroud)

正如您在问题中提到的,为所有客户端设置日志级别debug肯定会产生大量输出。如果您需要启用调试,您可以在每个子系统级别上进行。尽管error_log的文档中没有记录该指令,但该指令还接受更精细的级别细分debug(参见源代码):debug_core, debug_alloc, debug_mutex, debug_event, debug_http, debug_mail, debug_stream。您对级别感兴趣debug_event,但您可以在error_log指令中添加几个级别,例如:

error_log syslog:server=/dev/log debug_http debug_event;
Run Code Online (Sandbox Code Playgroud)