如何衡量nginx客户端的下载速度

时间:2013-09-19 15:55:51

标签: nginx

我希望在访问日志中有一个条目,显示客户端的下载速度。 我知道limit_rate,但显然这不是我想要的。 我也在lua_module中搜索过,但我找不到这个变量。

2 个答案:

答案 0 :(得分:1)

http://wiki.nginx.org/HttpLogModule

  • $ request_time,nginx处理请求的时间,以秒为单位,精确到毫秒级(对于早于0.5.19的版本,只需几秒)

Maxim Dounin(nginx核心开发):

  

$ request_time始终是自请求开始以来的时间(首先是   从客户端读取字节)直到请求结束(最后一个字节   发送到客户端并进行日志记录)。

  • $ bytes_sent,传输到客户端的字节数
  • $ body_bytes_sent,发送到客户端的字节数减去响应头。

通过这些变化,您可以获得所需的金额

答案 1 :(得分:0)

$request_time仅指示读取客户端请求的时间,并且独立于服务器的处理时间或响应。因此,$request_length除以$request_time表示客户端的上传速度。

但是OP询问了客户端的下载速度,这意味着我们需要两条信息:

  1. 服务器发送的字节数(例如$bytes_sent$bytes_body / Content-length,假设标头相对较小);

  2. 服务器发送的第一个字节与客户端收到的最后一个字节之间经过的时间 - 我们不会立即从NGINX服务器变量中获取,因为它直到TCP子系统完成交付,这是异步完成的。

  3. 因此,我们需要客户端的一些逻辑来计算并将后一个值报告给应用服务器:自己动手"速度测试"。

    NGINX $msec(当前时间以秒为单位,分辨率为毫秒)可用于以毫秒精度为响应的开始加时间戳,可能是通过使用自定义HTTP头字段(例如X-My-Timestamp)

    X-My-Timestamp值大致映射到HTTP响应头Date:字段。

    此外,客户端可以在完全接收响应后读取其系统时钟。后者与X-My-Timestamp之间的差值(假设UTC和NTP同步时钟)将产生计算下载速度所需的经过时间。

    最后一步是让客户端将值报告回服务器,以便采取适当的措施。