我有一个网站,许多不同的移动设备和嵌入式设备都会访问该网站。
我经常遇到某些设备无法连接的问题。
原因可能包括:
- 设备无法识别某个 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:
- 启用“调试”
- 创建管道而不是日志文件(确保它不会受到日志轮换的损害)
- 在后台创建监听器(cat awk、grep、sed 等等)
- 重启 nginx
乙:
error_log syslog:服务器=unix:/var/log/nginx.sock 调试;