Nginx:'upstream disconnected' 日志是什么意思?

Nginx: What does 'upstream disconnected' log means?

我尝试通过 nginx 通过反向代理从 <10.220.17.192> 到外部服务器 (10.220.224.126) 的 TLS 连接,但是在外部服务器上,连接将 TIME_WAIT 而不是 ESTABLISHED .

从 nginx 调试日志中,我可以看到“上游已断开连接”。这是否意味着外部服务器关闭了连接?

2020/12/10 15:09:51 [debug] 10166#0: *11 event timer del: 4: 82382883
2020/12/10 15:09:51 [info] 10166#0: *11 proxy 10.220.17.192:50125 connected to 10.220.224.126:6515
2020/12/10 15:09:51 [debug] 10166#0: *11 malloc: 08DA8A10:16384
2020/12/10 15:09:51 [debug] 10166#0: *11 post event 08D8EFD0
2020/12/10 15:09:51 [debug] 10166#0: *11 epoll add event: fd:3 op:1 ev:80002001
2020/12/10 15:09:51 [debug] 10166#0: *11 event timer add: 3: 14400000:96778145
2020/12/10 15:09:51 [debug] 10166#0: *11 event timer: 3, old: 96778145, new: 96778145
2020/12/10 15:09:51 [debug] 10166#0: *11 delete posted event 08D8EFD0
2020/12/10 15:09:51 [debug] 10166#0: *11 SSL_read: 0
2020/12/10 15:09:51 [debug] 10166#0: *11 SSL_get_error: 5
2020/12/10 15:09:51 [debug] 10166#0: *11 peer shutdown SSL cleanly
2020/12/10 15:09:51 [debug] 10166#0: *11 posix_memalign: 08E22BE0:256 @16
2020/12/10 15:09:51 [debug] 10166#0: *11 write new buf t:0 f:0 00000000, pos 08DA8A10, size: 0 file: 0, size: 0
2020/12/10 15:09:51 [debug] 10166#0: *11 stream write filter: l:1 f:1 s:0
2020/12/10 15:09:51 [info] 10166#0: *11 upstream disconnected, bytes from/to client:0/0, bytes from/to upstream:0/0


通过分析nginx源码的日志得到了问题的答案

如果 nginx 从外部服务器接收到连接关闭,它会发送一个 post 事件。

2020/12/10 15:09:51 [debug] 10166#0: *11 post event 08D8EFD0

SSL_read 的手册页说,if SSL_read: 0

读取操作不成功。原因可能是由于对等方发送的“关闭通知”警报导致的干净关闭(在这种情况下,设置了 ssl 关闭状态中的 SSL_RECEIVED_SHUTDOWN 标志(参见 SSL_shutdown(3) 和 SSL_set_shutdown(3)).也有可能是对端简单的关闭了底层传输,关闭不完整。调用SSL_get_error()带return值来判断是否报错发生或连接完全关闭 (SSL_ERROR_ZERO_RETURN)

2020/12/10 15:09:51 [debug] 10166#0: *11 SSL_read: 0
2020/12/10 15:09:51 [debug] 10166#0: *11 SSL_get_error: 5
2020/12/10 15:09:51 [debug] 10166#0: *11 peer shutdown SSL cleanly

对于下面的nginx日志,手册是这么说的,

2020/12/11 09:13:06 [debug] 11489#0: *1 SSL_shutdown: 1

如果对等方已经发送了“关闭通知”警报并且它已经在另一个函数中隐式处理 (SSL_read(3)),则设置 SSL_RECEIVED_SHUTDOWN 标志. SSL_shutdown() 将发送“关闭通知”警报,设置 SSL_SENT_SHUTDOWN 标志并立即将 return 设为 1。可以使用 SSL_RECEIVED_SHUTDOWN 是否已设置来检查=41=]()(另请参阅 SSL_set_shutdown(3) 调用)。