nginx报400问题排查记录

背景说明

内部使用的一个系统,应用有许多

请求整体流程:

前端-->nginx-->spring cloud gateway-->应用A

前端-->nginx-->spring cloud gateway-->应用B

前端-->nginx-->spring cloud gateway-->应用C

...

前端-->nginx-->spring cloud gateway-->应用N

许多用户访问接口都正常响应,但是有一个用户异常,请求应用A一直不成功,请求其它应用是成功的,异常请求是GET,且有查询中文参数,查看日志 发现,这个异常用户的请求在nginx日志一直报400 435,而且是nginx有日志,spring cloud gateway 也有日志,但是应用无任何日志,看不到异常用户的请求,而对于其他正常用户所有链路都可以看到请求的日志,而且这个用户在别的终端,pc打开应用都是这个400 435报错,另外,这个问题用户请求别的应用都是正常

问题排查

查询了一下nginx400的原因,基本都是说请求头过大,但是前端大佬说肯定不是这个,也没深究

接下来就是用curl 模拟异常用户去请求,无论从链路上哪个节点请求,请求都是成功的,而且都有日志

奇怪

再然后又使用postman模拟用户请求,无论从链路上哪个节点请求,请求都是成功的,而且都有日志

奇怪

本地搭建了环境,和生产完全一致,本地排查

查询了两天,也查询了nginx日志,nginx和网关对header的限制相关信息

查不出来什么问题,也没有复现出用户出现的问题,但是这个问题用户只要访问应用A就会看到报错400 435,一开始不知道435是啥意思?查了一下就是响应长度,400是状态码,刚开始一直以为是用户请求参数问题,但是从网关看,这个异常用户的参数和正常用户没有任何差别,一直也怀疑是请求头过大,但不知道是谁限制了请求头,nginx?网关?还是应用?

问题解决

第三天,搞了两天,头大,没思路,第三天一切推到重来,复盘,从零开始查,我想,那会不会就是请求头过大呢?

因为前两天对nginx网关等对请求头处理也了解一些了,应用的日志也加上了请求头信息输出,那就开始模拟请求头过大吧

一模拟,还真出现了,但是这个是谁限制的,nginx?改了nginx header的配置,增大了一百倍,测试header绝对超不了,还是报错400 435,那就不是nginx的限制

那就可能是网关或者应用的限制,因为网关日志正常,那就不是网关的限制,应该是应用的限制

这里也很奇怪?既然用户请求头超限,网关为啥不报错?这个后面解释

改了应用对header的限制,果然一切正常,有点激动

但是,header过大异常的时候本地应用A是有一个错误日志的,但是查应用A生产日志没有相关报错,而且这个报错,只有请求第一次进来会报错,只要应用不重启,后续header过大导致异常并不会有错误日志

所以,不能百分百确认生产也是这个问题

但是目前也查不到别的解决方案,基本已经快崩溃了,只能先验证一下

验证前想,会不会是ngixn对这个用户的header做了缓存(瞎猜),先重启nginx,问题用户请求应用A还是异常400 435

那就改应用对header限制,重启应用A,让问题用户请求应用A,问题解决

经过仔细对比,是网关给往header添加了用户信息,这个问题用户的信息比别人多,正好header超限了

那就修改header配置(100k)

server:

        max-http-header-size: 102400

至此,问题解决

但是还有一些问题需要排查,为啥别的应用没问题

### Nginx HTTP 403 Forbidden 错误原因及解决方案 当客户端收到HTTP 403错误时,表示服务器理解请求但是拒绝执行该请求。对于Nginx而言,有多种情况可能导致此响应。 #### 文件权限设置不当 如果文件或目录的权限不允许Web服务器访问,则会触发403错误。通常情况下,网站根目录及其子资源应当给予适当读取权限给Nginx进程运行的身份[^1]。 #### 配置中的安全策略限制 配置文件里可能存在特定的安全控制指令影响着某些类型的请求能否被处理成功。例如`reqideny ^Host:\ .*\.local`用于阻止来自`.local`域名下的主机名请求;而`reqiallow ^Host:\ www\.`允许带有`www.`前缀的站点通过验证。 #### 请求路径匹配规则 利用正则表达式的模式来过滤不符合条件的URL地址也是造成此类状况的一个因素之一。“忽略任何与下一条规则中的正则表达式相匹配的HTTP请求行”,这表明如果有不恰当定义的规则存在就可能意外地拦截合法流量并给出禁止提示。 针对上述提到的各种可能性,在排查过程中可以采取如下措施: - **检查日志记录**:查看error_log中是否有更详细的错信息帮助定位具体位置; - **调整文件/目录属性**:确保所有必要的静态资产都可由nginx用户组成员正常读取; - **审查虚拟主机设定**:确认location blocks内没有过度严格的ACL声明妨碍了预期的操作流程; - **测试最小化版本部署环境**:创建简单的HTML页面单独放置于新建立的位置区块之下观察表现差异以便排除其他干扰变量的影响。 ```bash # 修改文件夹权限命令示例 sudo chown -R nginx:nginx /var/www/html/ sudo chmod -R 755 /var/www/html/ # 查看当前用户的ID和所属群组 id $(whoami) # 设置SELinux上下文标签(适用于启用了SELinux系统的场景) chcon -Rv --type=httpd_sys_content_t /var/www/html/ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值