摘要: 阿里云负载均衡SLB可以对多台云服务器(ECS)进行流量分发,支持TCP的四层负载均衡和基于HTTP/HTTPS的七层负载均衡。使用SLB可以降低单台ECS异常时对业务的冲击,提升系统可用性。同时,结合弹性伸缩服务(ESS)动态扩容、缩容后端服务器可以快速应对业务流量的变化。

阿里云负载均衡SLB可以对多台云服务器(ECS)进行流量分发,支持TCP的四层负载均衡和基于HTTP/HTTPS的七层负载均衡。使用SLB可以降低单台ECS异常时对业务的冲击,提升系统可用性。同时,结合弹性伸缩服务(ESS)动态扩容、缩容后端服务器可以快速应对业务流量的变化。

SLB七层访问日志内容丰富,提供近30个字段,例如:收到请求的时间、客户端的IP地址、处理Latency、请求URI、后端RealServer(阿里云ECS)地址、返回状态码等。在您开启SLB七层访问日志功能后,SLB会记录对应实例上所有访问日志到日志服务。本文以两个主题向大家介绍如何通过日志服务来发掘SLB访问日志背后蕴含的一些价值。

请求从哪里来

这是一个关于client_ip的问题,直接看访问日志的client_ip字段就可以回答。但有时会发现client_ip总是那么几个值,直觉告诉我们不大对劲:

一个客户端的请求从最初的ip到SLB负载均衡,如果不经过代理,那么client_ip记录的就是原始客户端ip。而假如请求经过proxy多次转发,这种情况下访问日志记录的client_ip就不能真实反应请求来源了。

好在SLB访问日志中有另两个字段可以帮助我们解决真实client_ip问题:

  • http_x_forwarded_for,取自HTTP扩展头X-Forwarded-For字段,是RFC7293标准。假设客户端在client_0发出请求,到达服务端之前依次经过了三个代理proxy_1、proxy_2、proxy_3,其中proxy_3直连负载均衡器,那么proxy_3会在X-Forwarded-For上追加proxy_2的ip表示是在替proxy_2转发请求。这样多层级联后形成一个用逗号连接的字符串"client_0_ip,proxy_1_ip,proxy_2_ip",字符串中的第一个即是原客户端ip。
  • http_x_real_ip,取自HTTP自定义头X-Real-IP字段,非正式标准但在业内普遍使用。在各层代理始终坚持记录原始客户端ip的前提下,这是最方便且正确的取值。

值得注意的是,X-Forwarded-For和X-Real-IP字段都有可能出现不准确的情况,感兴趣的同学可以读一下这篇文章:HTTP请求头中的X-Forwarded-For。

本文按照X-Real-IP优先策略计算真实的请求来源ip,算法用如下决策树来表达:

当http_x_forwarded_for、http_x_real_ip字段取值为字符串"-"时,表示该字段值不是有效内容。那么通过SQL的case/when语法把上图的计算方法翻译如下:

select (casewhen http_x_real_ip = '-' then (casewhen http_x_forwarded_for = '-' then client_ipwhen split_part(http_x_forwarded_for, ',', 1)  = '-' then client_ipelse split_part(http_x_forwarded_for, ',', 1) end)else http_x_real_ipend) as real_client_ip

real_client_ip是通过算法得到的优化版真实客户端ip:

在real_client_ip基础上,可以使用日志服务IP地理函数计算访问来源的地理(国家、省市、运营商、经纬度)信息。例如按照省维度统计PV分布:

HTTP状态码说明了什么

408 Request Timeout

现象

客户端请求部署在SLB上的服务,但经常出现网络超时情况。

排查过程

首先用SQL统计是否有异常的状态码:

not (status : 200) | select status, count(*) as pv group by status order by pv desc

分析发现在最近15分钟的访问日志中有些408返回的请求:

关于408状态码,它表示服务端在一定时间内没有收到完整的请求,这个时候服务端决定不再等待,在响应中将Connection首部值设置为close并主动关闭连接。

发生408错误的时候,表现为Request Timeout。最大可能的两个原因有:客户端没有在超时时间内把数据包发到服务端;或者是因为服务端负载很重,没有及时处理请求。如果通过监控可以排除服务端负载原因,那么可以将更多关注点转移到客户端身上。

统计408状态的client_ip来源:

status : 408 | select client_ip, count(*) as pv group by client_ip order by pv desc

如果client_ip集中在几个特定来源上,那么,个别客户端网络流量导致问题的可能性就比较大。

同时,查看408状态码的日志发现,异常请求的upstream_addr、upstream_status都没有记录,这说明请求没有到达后端real server。这个时候可以认为,客户端问题导致网络超时的可能性是很大了。

接下来,就请到客户端上查看网路监控或抓包调查吧。

499 Client Closed Request

现象

SLB负载均衡上的流量出现下跌,同时后端服务器上没有看到5xx错误。

排查过程

经典开局,先看异常状态码分布,但这次我们怀疑是499导致的:

499状态码表示服务端Nginx正在处理请求过程中,客户端主动关闭了连接。

通过异常的访问日志加以印证,upstream_addr记录了请求在real server上进行处理,但是没有记录响应的后端状态码upstream_status,说明后端服务器没有完成请求的处理。并且,整个请求的处理时间request_time用了10秒多,也许正是因为长时间的等待导致用户停止了下载任务。

原文链接

本文为云栖社区原创内容,未经允许不得转载。

SLB访问日志分析:基于客户端来源和HTTP状态码的实践相关推荐

  1. nginx 访问日志分析工具 goacess

    2019独角兽企业重金招聘Python工程师标准>>> 20150702 nginx 访问日志分析 goacess 1.安装GoAccess需要一些系统支持库 yum install ...

  2. 一款非常好用的网站访问日志分析工具,360星图

    原文转载自:豫章小站 » <[分享]360星图,一款非常好用的网站访问日志分析工具> 广大站长有没有这样一个体验,网站流量异常,要通过网站日志来分析的时候非常头疼,日志文件很大,一条一条来 ...

  3. python 输出文件中返回码为200的接口的平均响应时间_python-处理日志文件,找出各个接口状态码为 200时的平均响应时间...

    今天又一面试题目,可惜我依旧新手,不熟练,速度太慢 背景:需要写一个方法,处理一个程序的日志文件. 参数 文件名称 日志文件的特点是: 每一行都是收到的程序请求的记录 每一行的格式是:时间 日志级别 ...

  4. 基于Spark对某移动APP流量访问日志分析(Java版)

    目录 需求分析 数据原型 设计思路 数据模型及演化过程 实施过程 需求分析 我们来根据移动设备唯一标识deviceID来计算来自客户端用户访问日志请求和响应的上行流量.下行流量的记录. 上行流量:指的 ...

  5. linux resin 查看日志命令,【转】linux:访问日志分析

    作为一个程序员或项目负责人,甚至运营人员,很多人都想知道: * 我们的项目访问量怎么样 * 用户访问高峰在什么时候 * 系统变慢的时候用户做了哪些操作 * 用户对哪些功能比较感兴趣 * 真实用户在服务 ...

  6. MOOC网站访问日志分析

    阿里云开放实验室 https://edu.aliyun.com/lab/courses 选择一个日志分析项目为例: 实验详情: 实验概述:网站访问日志是用户在访问网站服务器时产生的日志,它包含了各种原 ...

  7. 服务器网站访问日志分析,服务器日志分析与流量统计_直观快捷分析每个网站的日志...

    本帖最后由 软程科技 于 2019-9-9 19:13 编辑 应用名称:日志分析与流量统计 价格:1元 作者:软程科技 版本: 2.1.9 提示(使用前必读): 1. 此插件未在超大(超过1G)的日志 ...

  8. java tomcat 日志分析工具_设计一个Tomcat访问日志分析工具

    常使用web服务器的朋友大都了解,一般的web server有两部分日志: 一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 二是访问日志信息,它记录的访问的时间,IP,访问的资 ...

  9. Nginx访问日志分析

    1.首先说明Nginx日志存放在系统的哪个位置,可以使用下列命令: 找到*/nginx/logs/access.log这个关键路径,就是Nginx的访问日志的位置.(其中*代表你电脑nginx文件夹前 ...

最新文章

  1. php语句中两个if语句,如何在PHP中组合两个IF语句
  2. Linux Tomcat 安装
  3. 【LeetCode】105#从前序与中序遍历序列构造二叉树
  4. 程序员爱护自己身体的几点建议
  5. 三国杀服务器改名 插图修改,《三国杀》大幅修改的武将——新旧两版,你更喜欢哪一位...
  6. Spring、Spring Boot和TestNG测试指南 - 测试@Configuration
  7. mybatis 报错: Invalid bound statement (not found)
  8. springMVC之mvc:interceptors拦截器的用法
  9. 2018年python工作好找吗-2018年Python发展前景如何?Python就业有哪些方向?
  10. 如何解决注塑成型中的毛边问题?
  11. matlab 取虚数单位,四元数解算姿态Matlab程序代码
  12. Cannot read property ‘numerator‘ of undefined,calc的运算
  13. vue 父组件重新加载子组件
  14. 块元素div转变为行内块元素之后如何消除之间间隙
  15. 修改Mysql密码(简单粗暴)
  16. 26日pr更新 祝愿大家的站点更上一层楼
  17. Radiology:人工智能系统脑MRI鉴别诊断精度接近神经放射科医生水平
  18. java三个技术平台_java三大技术平台是什么
  19. 网站虚拟空间常见参数介绍 如何选好主机空间
  20. 宜人贷PaaS 数据服务平台简介(上篇)

热门文章

  1. css3弧形跑道效果_Css 实现漂亮弧形
  2. currenthashmap如何实现线程安全_什么是多线程?如何实现多线程?
  3. 【学习笔记】 IPv4地址、NAT与子网掩码、子网划分
  4. 四年级计算机课程,信息技术(四年级)全部课程PPT课件.ppt
  5. c语言求a1到an的和,C语言菜鸟基础教程之a++与++a
  6. 计算占比并保证百分比和为1
  7. 检测到python编程环境中存在多个版本_linux下多个python版本怎么管理?
  8. 回味颜宁演讲:“勇敢做独一无二的你”
  9. 《自然》公布2020科学界十大人物,李兰娟、张永振入选
  10. java中如何使用反射调用方法以及获得类中的属性