我想在我的访问日志中有一个显示客户端下载速度的条目。我知道limit_rate,但显然这不是我想要的。我也在 lua_module 中搜索过,但我找不到这个变量。
2 回答
http://wiki.nginx.org/HttpLogModule
- $request_time,nginx 处理请求所花费的时间,以秒为单位,精度为毫秒(对于早于 0.5.19 的版本仅为秒)
Maxim Dounin(nginx 核心开发):
$request_time 始终是从请求开始(从客户端读取第一个字节时)到请求结束(当最后一个字节发送到客户端并发生日志记录时)的时间。
- $bytes_sent,发送给客户端的字节数
- $body_bytes_sent,传输到客户端的字节数减去响应头。
使用这些变量,您可以获得所需的数量
$request_time
仅表示读取客户端请求的时间,与服务器的处理时间或响应无关。所以$request_length
除以$request_time
表示客户端的上传速度。
但是OP询问了客户端的下载速度,这意味着我们需要两条信息:
服务器发送的字节数(例如
$bytes_sent
或$bytes_body
/Content-length
假设标头相对较小);服务器发送的第一个字节和客户端接收的最后一个字节之间经过的时间 - 我们没有立即从 NGINX 服务器变量中获得,因为它由 TCP 子系统完成传递,并且这是异步完成的。
所以我们需要客户端的一些逻辑来计算后一个值并将其报告回应用程序服务器:一个自己动手的“速度测试”。
NGINX $msec
(以毫秒为单位的当前时间,以毫秒为单位)可用于以毫秒精度为响应的开始添加时间戳,可能通过使用自定义 HTTP 标头字段(例如 X-My-Timestamp)。
X-My-Timestamp 值大致映射到 HTTP 响应标头Date:
字段。
此外,客户端可以在完全接收到响应后读取其系统时钟。后者和 X-My-Timestamp 之间的增量(假设 UTC 和 NTP 同步时钟)将产生计算下载速度所需的经过时间。
最后一步是让客户端将值报告回服务器,以便采取适当的措施。