专栏首页程序员升级之路接口403问题没这么容易解决

接口403问题没这么容易解决

最近一同事反馈在后台保存某业务数据时一直报403,该数据由运营人员在后台录入,然后向后端发送POST请求保存数据;现象是如果内容过长如几十K则报403,如果只输入几个字符则没问题,多方排查无解。

这是一个典型的LNMP应用架构,WEB是Nginx,后端应用是PHP,数据库是Mysql。

出现问题第一反应是查日志,按这些链路查:

1、Nginx错误日志

一般403、502之类的Nginx错误日志中中相应记录;

每个server有error_log的配置,查找日志中是否有无线索;

2、PhpFpm日志

Php用的是PhpFpm作为容器,其也有error_log指令,可以查看这个日志有无响应线索;

3、应用日志

这个根据应用自己的情况搜索。

通过上述排查,都无线索。

日志不行再查配置,Nginx对body有些限制参数:

client_max_body_size           8M;

但上述场景才几十K,所以这个可能性排除。

再看Php的配置,Php也有相关Post参数,如

post_max_size = 25M
max_input_var=5000

post_max_size是限制请求体大小,而max_input_var是限制post中有多少个key的,案例也没有超过这些限制。

这些都不行,只能抓包了,nginx和php-fpm之间是通过fastcgi协议传输的,因为配置的upstream是127.0.0.1,因此要抓下本地回环的包:

tcpdump -i lo port 9000 -w /tmp/php.pcap

先看下正常的包,即只输入几个字符的情况:

上述场景我们输入的是123456789,抓包发现nginx是有将相应内容传递给PHP的,这里涉及到fastcgi协议的格式,因重点不是这个,有兴趣的同学可以自行百度下。

然后抓下输入为几十k的请求:

发现内容根本就没传递过去,因为我们的Nginx上有很多配置,为了调试方便先把一些不用的配置去掉,再删掉2处Lua的配置后重新启动Nginx,接口提交成功了。

再仔细分析一下其中一行Lua配置,原来是Lua防火墙,对一些敏感关键字做了处理,如果发现在相应内容会将内容清空,并返回错误,奇怪的是这些异常情况竟然没有错误日志。

短期解决办法是将防火墙相关配置关闭,长期还是需要对防火墙结合业务场景进行梳理,提高拦截的准确率,并且在拦截时提供相应日志便于快速定位问题。

最后总结下,主要问题是Lua防火墙对输入内容进行了拦截,但是拦截后没有明显的日志,导致排查问题比较麻烦。

本次排查问题的思路:

1、查日志

先中间件,如Nginx、PhpFpm,然后是应用日志

2、分析中间件配置

3、抓包分析

主要是验证传输链路有没问题,快速定位出问题的环节

如果上述还是无法解决问题,只有Debug源代码了。

本文分享自微信公众号 - 程序员升级之路(gh_1fab42db66cb),作者:刘江华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Raft算法之集群成员变化篇

    集群成员变化是一个常见操作,主要是增加、删除节点,主要的场景有升级、服务器老化等,当然如果我们对服务的SLA没太大要求,直接关闭集群是最简单的办法。但如果要保证...

    心平气和
  • OAuth2.0及Spring实现

    一般来说需要开放能力给第三方的时候需要用到认证,注意是第三方,内部系统一般来说不用,因为内部我们一般有自己的用户中心或者登录中心,这些系统可以用来做认证,而为什...

    心平气和
  • Raft算法之选举篇

    Follower(跟随者):系统启动时默认的角色,一般来说不参与客户端读、写请求,接受Leader发送过来的心跳追加日志,在Leader挂了之后转变为Candi...

    心平气和
  • 黑科技抗疫,Python开发者大集结!

    北京时间 2月15日,由 CSDN 主办,PyCon中国社区、wuhan2020开源项目、DCloud协办,北大前沿计算研究中心、电子工业出版社支持的2020 ...

    AI科技大本营
  • 阿斯汤加瑜伽学习笔记-唱诵经文

    祈祷式: for the beginning of Ashtanga Yoga practice

    Spaceck
  • Package Stopped State Since Android 3.1

    Since Android 3.1, Android has introduced a LaunchControl mechanism. It’s call S...

    技术小黑屋
  • 写给前端程序员的英文学习指南

    达达前端技术社群:囊括前端Vue、JavaScript、数据结构与算法、实战演练、Node全栈一线技术,紧跟业界发展步伐,一个热爱前端的达达程序员。以下写给程序...

    达达前端
  • 谈判策略的自动配置(CS.MA)

    在具有线性加性和非线性效用函数的情况下,投标和接受策略对谈判的结果有重大影响。多年来,很明显,没有一种适用于所有谈判环境的最佳策略,但是仍在开发许多固定策略。我...

    蔡小雪7100294
  • Spark开发指南

    总的来说,每一个Spark的应用,都是由一个驱动程序(driver program)构成,它运行用户的main函数,在一个集群上执行各种各样的并行操作。Spar...

    幽鸿
  • springboot整合jdbcTemplate

    贪挽懒月

扫码关注云+社区

领取腾讯云代金券