nginx. 如何记录 SSL 错误而不破坏服务器日志

nginx. 如何记录 SSL 错误而不破坏服务器日志

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

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

原因可能包括:

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

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

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

error_log  /var/log/nginx/errors_with_debug.log debug;

然而,这些日志包含大量我不感兴趣的内容。

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

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

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

理想情况下,我还想记录原因,但是如果已经知道尝试连接但由于 SSL 而失败,这将非常有帮助。

答案1

你提到的所有 SSL 握手错误都由 nginx 记录在info级别,因此您不需要启用调试。

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

error_log stderr info;

或系统日志:

error_log syslog:server=/dev/log info;

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

journalctl -u nginx.service -a -p info

将允许您列出上面的所有调试消息info级别(假设您使用 syslog)。

如果您需要特定客户的更多数据,您可以使用Nginx调试连接

events {
    debug_connection 192.0.50.1;
    ...
}

正如您在问题中提到的那样,设置日志级别debug对所有客户端进行调试肯定会产生大量输出。如果您需要启用调试,您可以在每个子系统级别进行调试。虽然它没有记录在错误日志,该指令还接受了更精细的级别细分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;

答案2

A:

  1. 启用“调试”
  2. 创建管道而不是日志文件(确保它不会受到日志轮换的损害)
  3. 在后台创建监听器(cat awk、grep、sed 等等)
  4. 重启 nginx

乙:

error_log syslog:服务器=unix:/var/log/nginx.sock 调试;

相关内容