一次Nginx 502问题解决

这篇具有很好参考价值的文章主要介绍了一次Nginx 502问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

线上某个web应用页面,偶发性的报502 Bad Gateway异常。线上环境是Nginx反向代理和SpringBoot的后端服务组合。针对这个问题,记录一下解决过程。

环境准备

如果环境是Mac并且已经安装了Homebrew的话,安装Nginx还是非常方便的。

brew install nginx

Mac Homebrew安装指导https://www.jianshu.com/p/ebd854196c4c

如果已经安装过了Docker环境,则更为便利,直接运行一个Nginx镜像即可。

Homebrew安装完后,可以通过以下命令操作Nginx。

#启动
brew services start nginx

# 停止
brew services stop nginx

# 重启
brew services restart nginx

安装后nginx的日志路径为

/usr/local/var/log/nginx

Nginx配置文件路径为

/usr/local/etc/nginx
问题定位和解决

我们到线上捞取了对应异常时间点的Nginx日志,在其中发现了这样的异常信息。

 61112#0: *1 upstream sent too big header while reading response header from upstream

这个异常是由于响应中Header信息过大导致的。为此我们需要写一个简单的服务端代码验证一下。


@RestController
public class HomeController {
  @RequestMapping(value = "/home")
  public String home(HttpServletRequest request, HttpServletResponse response) {
    String headCount = request.getParameter("headCount");
    if (!StringUtils.hasText(headCount)) {
      headCount = "300";
    }
    for (int i = 0; i < Integer.parseInt(headCount); i++) {
      response.setHeader(String.valueOf(i), String.valueOf(i));
    }
    return "success";
  }
}

上述代码比较简单,就是根据入参的一个headCount参数,向响应中增加Header的数量。

我们先让服务不经过Nginx反向代理来验证一下。headCount设置为3000,看是否正常。

nginx502,springboot,java,中间件,linux,java,http😓,怎么服务端自己先报错了呢,还是看看日志吧。

An attempt was made to write more data to the response headers than there was room available in the buffer. Increase maxHttpHeaderSize on the connector or write less data into the response headers.

根据异常信息判断,是SpringBoot自身对Header也有限制大小,异常也给出了解决方案,那就是增加maxHttpHeaderSize的大小。

nginx502,springboot,java,中间件,linux,java,http

通过找寻maxHttpHeaderSize关键词,我们找到了SpringBoot自动加载的ServerProperties中的这个属性,可以看到默认大小是8K。

我们可以通过application.properties将该大小增加到128K后重启服务。

server.maxHttpHeaderSize=128KB

nginx502,springboot,java,中间件,linux,java,http

此时单独访问服务端是正常的了。那再加上Nginx的负载均衡会是什么样子呢?

我们找到Nginx的配置文件,在路径/usr/local/etc/nginx/nginx.conf中,找到http 80端口对应的server配置,配置路由信息到本机的SpringBoot服务。

location / {
  proxy_pass  http://127.0.0.1:8080;
}

修改完后启动Nginx服务,然后通过浏览器请求同样的后端服务。

nginx502,springboot,java,中间件,linux,java,http

哇哦,502 Bad Gateway啦,抓紧时间取看一下Ngxin的日志。

2022/03/05 14:42:35 [error] 63112#0: *14 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /home?headCount=3000 HTTP/1.1", upstream: "http://127.0.0.1:8080/home?headCount=3000", host: "localhost"

可以看到的确是因为响应中Header过大导致的,那么有什么解决办法呢。感谢万能的谷歌-> https://ma.ttias.be/nginx-proxy-upstream-sent-big-header-reading-response-header-upstream/。

从这篇文章中可以看到,Nginx对于响应Header会进行缓存,如果Header超过了缓存的大小就会报这样的错误。所以接下来那就是按照文章中给的设置修改Nginx配置。

location / {
  proxy_pass  http://127.0.0.1:8080;
  proxy_buffer_size     128K;
  proxy_buffers         4 256K;
  proxy_busy_buffers_size  256K;
}

重新启动服务验证,现在可以看到请求已经可以正常返回了。

nginx502,springboot,java,中间件,linux,java,http文章来源地址https://www.toymoban.com/news/detail-517418.html

到了这里,关于一次Nginx 502问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP+Nginx经常出现502、504原因与解决方法

    很多新手刚开始做网站可能感觉不到502,504的问题,当等你网站到达了一定水平的时候,流量起来的时候,你会发现经常会遇到502、504类似的问题。 502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 将请求提交给网关如php-fpm执

    2024年02月15日
    浏览(39)
  • 一次不规范HTTP请求引发的nginx响应400问题分析与解决

    最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400,没有任何200成功记录,由于只占整体请求的不到0.5%,所以之前也一直没有触发监控报警,而且很奇怪的是只对于log上报的POST接口会存在这种特定用户全部400的情况,而对于其他接口无论POST还是

    2024年02月14日
    浏览(53)
  • Nginx 502 Bad Gateway 错误的原因及解决方法

    多数是后端问题也就是PHP的问题, 简单的情况可以刷新(不是一般的刷新哦, Ctrl + F5  强制刷新)解决。在php服务当中,有两个参数非常的重要: max_requestst 和 max_children ,具体的原因必须要查看日志才可以弄明白! 1、检查PHP基础设置 修改 /www/server/php/80/etc/php-fpm.conf requ

    2024年02月03日
    浏览(48)
  • nginx服务器报错502 Bad Gateway的原因以及解决办法

    服务器报错nginx 502 Bad Gateway的原因以及解决办法_502 bad gateway nginx_主题模板站的博客-CSDN博客

    2024年02月13日
    浏览(49)
  • 服务器报错nginx 502 Bad Gateway的原因以及解决办法

    网站页面出现502badgateway怎么办?今天我们来分析一下原因和解决办法。 nginx出现502多数是属于后端的问题,后期就是PHP的问题,在php服务当中,有两个参数非常的重要:max_requestst 和max_children;具体的原因必须要查看日志才可以弄明白! 1:FastCGI进程是否已经启动 ps aux|grep

    2023年04月20日
    浏览(66)
  • 解决nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)以及nginx 502 Bad Gateway解决方法

    今天早晨到公司,打开测试环境的登录网页,如下图所示: 输入用户名和密码,点击 login ,一直无法登录。 于是,打开控制台,却发现报出如下错误: 于是,登录 nginx 所在的服务器,使用如下命令,找到 nginx 的安装目录:

    2024年02月08日
    浏览(56)
  • 解决docker nginx 502错误 connect() failed (111: Connection refused) while connecting to upstream

    docker里启动了nginx容器,然后配置好了前端页面,后端服务在宿主机里启动运行,页面能正常预览,但是反向代理请求后端的时候报502,宿主机的wlan ip是192.168.1.106,宿主机docker网桥ip是172.17.0.1 若服务器是网线连接的则服务器的ip在eth0看,因为我用的是wifi所以在wlan有ip   使用

    2024年02月05日
    浏览(53)
  • 【网络教程】记一次使用Docker手动搭建BT宝塔面板的全过程(包含问题解决如:宝塔面板无法开启防火墙,ssh,nginx等)

    演示的系统环境: Ubuntu 22.04.3 LTS 更新 安装/升级docker到最新版本 升级docker相关命令如下

    2024年02月10日
    浏览(49)
  • Nginx错误502 Bad Gateway

    使用Nginx配置的反向代理,浏览器访问的时候出现 “502 Bad Gateway” 错误,检查了一下后台error文件,发现有类似下面的错误 其中 “upstream sent too big header while reading response header from upstream” 说明可能是nginx代理的缓冲区不够,因此需要调整一下缓冲区的配置,主要包括下面几

    2024年02月19日
    浏览(41)
  • nginx+php 出现502 bad gateway

    nginx+php 出现502 bad gateway,一般这都不是nginx的问题,而是由于 fastcgi或者php的问题导致的,常见的有以下几种。 1.   php.ini 的memory_limit 过小(如果有个别php程序进程需要占用极大内存时这个必须注意) 2.   php-fpm.conf 中max_children或者max_requests  设置不合理(设置过小会因为没

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包