一次Nginx 502问题解决

问题背景

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

环境准备

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

brew install nginx

Mac Homebrew安装指导//www.greatytc.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,看是否正常。

image-20220305143953949

😓,怎么服务端自己先报错了呢,还是看看日志吧。

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的大小。

image-20220305143047461

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

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

server.maxHttpHeaderSize=128KB
image-20220305143911901

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

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

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

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

image-20220305144121467

哇哦,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;
}

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

image-20220305144741205
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容