转载请注明文章出处:https://tlanyan.me/upstream_r...

前几日为了查看FPM的性能,在Nginx的配置里增加FPM响应时间的header:

http {...server {...location ~ \.php$ {...add_header X-Upstream-Time $upstream_response_time;}}
}

今天闲来查看网页的响应头,发现值与预期的不一致:

要说153毫秒我是相信的,那么数值的单位是纳秒。但这不符合常理:1. 印象中upstream_response_time的单位是毫秒;2. 如果单位是纳秒,就不应该有小数点,精度没这么高(从L1缓存取个值就要0.5~1纳秒,从寄存器取值差不多也要个0.2纳秒)。

难道是我对upstream_response_time理解错了?翻看Nginx官方文档,对该变量的解释是:

$upstream_response_timekeeps time spent on receiving the response from the upstream server; the time is kept in seconds with millisecond resolution. Times of several responses are separated by commas and colons like addresses in the $upstream_addr variable.

翻译过来:upstream_response_time是与上游(FPM)建立连接开始到接收完内容花费的时间,单位为毫秒。所以理解没有错,那么错在什么地方呢?

所以Nginx版本的bug?试了另外几个版本,情况一致。

搜索"nginx upstream_response_time",出现的内容基本上是request_timeupstream_response_time的区别。这些博文中提到的定义,与上面理解的也是一样的。<https://www.nginx.com>是官方提供付费商业支持的站点,根据其站点上"Using NGINX Logging for Application Performance Monitoring"这篇博文,这个值是靠谱的(坑社区也就算了,不能坑给钱的上帝吧)。

再仔细琢磨这个值,发现怎么有点像时间戳啊?!马上用PHP验证一下:

php -a
echo date('Y-m-d H:i:s', 1535347303.280);

PHP shell输出"2018-08-27 13:21:43",证明其就是时间戳。

没给预期的上游处理时间,给一个时间戳算什么事?接续Google "nginx upstream_response_time timestamp",结果列表第一个标题似乎就是我的疑问:"Re: nginx report a timestamp on upstream_response_time"。点进去一看,是官方邮件组中某个讨论的回复自动贴在了官方论坛上。除了知道upstream_response_time初始化为当前值(ngx_timeofday()),暂无对问题解惑的有用信息。

继续往下翻,马上就看到了有人在OpenResty提出的issue:[bug] the upstream-response-time value is wrong #206。根据Nginx与OpenResty的关系,这个issue肯定值得看看。章亦春大佬对该issue的回复(也是对upstream_response_time是时间戳的解答)是:

所以upstream_response_time在header中不准确的原因是:其值在log阶段(NGX_HTTP_LOG_PHASE)才会正确生成,发送响应头处于内容生产阶段(NGX_HTTP_CONTENT_PHASE),期间获取到的值是初始化的时间戳,符合预期。

要正确打印其值,可在日志格式中声明:

http {...log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_response_time"';
}

重新加载Nginx配置,刷新网页然后查看日志,每一行最后一列就是我们想要的upstream_response_time

xxxx - - [27/Aug/2018:14:20:13 +0800] "GET xxx HTTP/1.1" 200 7659 "xxx" "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 MicroMessenger/6.5.5 NetType/WIFI Language/zh_CN" "-" "0.000" "-"
xxx - - [27/Aug/2018:14:20:16 +0800] "GET xxx HTTP/1.1" 200 423 "xxx" "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 MicroMessenger/6.5.5 NetType/WIFI Language/zh_CN" "-" "0.000" "-"
xxx - - [27/Aug/2018:14:20:29 +0800] "GET / HTTP/1.0" 200 6775 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36" "-" "0.185" "0.010"

参考

  1. http://nginx.org/en/docs/http...
  2. https://www.nginx.com/blog/us...
  3. https://forum.nginx.org/read....
  4. https://github.com/openresty/...
  5. https://blog.csdn.net/qinyush...

Nginx的upstream_response_time相关推荐

  1. 通过Nginx,Tomcat访问日志(access log)记录请求耗时

    一.Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 nginx.conf使用配置方式: log_format main '$remo ...

  2. 监控SRE的黄金信号

    \ 关键要点 \\ 金牌信号对于运营团队监控其系统和发现问题至关重要.\\t 随着我们转向微服务和容器,这些信号变得尤为重要,其中包括第三方在内的更多功能更加分散.\\t 需要监测的指标有许多,但行业 ...

  3. Nginx - request_time和upstream_response_time的区别

    request_time 官网描述:request processing time in seconds with a milliseconds resolution; time elapsed be ...

  4. nginx源码层面探究request_time、upstream_response_time、upstream_connect_time与upstream_header_time指标具体含义

  5. Linux Centos 7 安装配置nginx

    参考:https://www.cnblogs.com/boonya/p/7907999.html 环境准备: 1.安装gcc编译器 # yum install -y gcc 2.安装 pcre pcr ...

  6. Nginx + Spring Boot 实现负载均衡

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文来源:http://8rr.co/LSUH 前言 本篇文章主要 ...

  7. Nginx日志格式设置

    2019独角兽企业重金招聘Python工程师标准>>> nginx 服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指 ...

  8. Nginx HTTP 负载均衡和反向代理

    1.负载均衡和反向代理介绍 负载均衡是多台服务器对称方式组成一个服务器的集合,每个服务器都能单独对外提供服务,通过负载均衡技术,将客户端请求均匀的分配到服务器集合中的某个服务器上,然后服务器独立响应客 ...

  9. 【临实战】使用 Python 处理 Nginx 日志

    有什么 有 14 台机器(意味着我们有 14 份日志) 一台可以连到这 14 太机器的机器(有Python 2.6) 要做什么 获取 14 台机器上某时间段内的包含某特征的日志,再取出其中的特定内容 ...

最新文章

  1. 恢复exchange2003的公共文件夹
  2. 日常生活小技巧 -- 玩转 PDF
  3. android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...
  4. 南京晓庄学院大一第二学期计算机数据结构期末考试试卷及答案,南京晓庄学院数据结构题库参考答案...
  5. codeforces 796A Buying A House
  6. 数据库读写锁的C++实现
  7. 一文看尽 TensorFlow“奋斗史”!| CSDN 博文精选
  8. for循环中++i 和 i++ 的区别
  9. python 平方根_数的Python平方根
  10. 深度学习从入门到实战——卷积神经网络原理解析及其应用
  11. 如何进入大华智能分析服务器,如何配置大华录像机区域入侵功能,看完就明白...
  12. ETERM航班销售控制指令
  13. c语言平方根求和用sqrt函数,sqrt函数 Excel怎么使用平方根函数SQRT
  14. STM32单片机介绍2
  15. android 上拉抽屉,Flutter上拉抽屉实现
  16. 如何像Uber一样给工程师派单 解放外包落后的生产力
  17. Vue ui/vue create创建项目报错:Failed to get response from https://registry.npmjs.org/vue-cli-version-ma
  18. 【内网穿透服务器】利用云服务器+FRP实现内网穿透并远程连接服务器
  19. 什么是nuget?nuget包是如何管理
  20. 逍遥情缘服务器维护没通告,《逍遥情缘》铁匠惨遭失业 玩家居然打造合成修理样样精通...

热门文章

  1. Java 多线程:synchronized 关键字用法(修饰类,方法,静态方法,代码块)
  2. Java IO最详解
  3. Python OpenCV中色彩空间的转换类型
  4. 卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
  5. Stanford UFLDL教程 微调多层自编码算法
  6. Stanford UFLDL教程 自编码算法与稀疏性
  7. java.lang包中的常用类
  8. Spring Boot 参考指南(运行你的应用程序)
  9. 2017校赛 问题 D: 我知道了,你知道了吗?【递归】
  10. 畅想来自未来的便携扫描仪