Имеется ALB, на который постоянно срабатывает Alertmanager с ошибкой 502:
В CloudWatch видно, что ошибка возникает спорадически, и только один раз:
При этом в логах NGINX никаких ошибок нет
Первым делом — включаем логи ALB:
Не то что бы они чем-то реально помогли — но по крайне мере теперь можно увидеть ошибку «вживую» :
52.***.***.142 — — [07/Aug/2018:11:18:21 +0300] «GET /site/login HTTP/1.1» 301 178 «-» «Go-http-client/1.1»
52.***.***.142 — — [07/Aug/2018:11:18:21 +0300] «GET /site/login HTTP/1.1» 200 1120 «http://admin.domain.com/site/login» «Go-http-client/1.1»
52.***.***.142 — — [07/Aug/2018:11:18:36 +0300] «GET / HTTP/1.1» 302 5 «-» «Go-http-client/1.1»
52.***.***.142 — — [07/Aug/2018:11:18:36 +0300] «GET /site/login HTTP/1.1» 301 178 «-» «Go-http-client/1.1»
52.***.***.142 — — [07/Aug/2018:11:18:36 +0300] «GET /site/login HTTP/1.1» 200 1124 «http://admin.domain.com/site/login» «Go-http-client/1.1»
52.***.***.142 — — [07/Aug/2018:11:18:51 +0300] «GET / HTTP/1.1» 302 5 «-» «Go-http-client/1.1»
52.***.***.142 — — [07/Aug/2018:11:18:51 +0300] «GET /site/login HTTP/1.1» 301 178 «-» «Go-http-client/1.1»
Потом нагугливаем документацию по траблшутингу ALB, и там находим упоминание о KeepAlive
:
The target closed the connection with a TCP RST or a TCP FIN while the load balancer had an outstanding request to the target. Check whether the keep-alive duration of the target is shorter than the idle timeout value of the load balancer.
Значение по умолчанию на ALB — 50 секунд, как видно на скрипшоте выше, а у NGINX (см. документацию):
Default: |
keepalive_timeout 75s; |
---|
Добавим keep_alive
в NGINX со значением в 30 секунд — для нашего приложения этого будет достаточно:
server { charset utf-8; listen 80; server_name admin.domain.com; if ($http_x_forwarded_proto = 'http') { return 301 https://admin.domain.com$request_uri; } set $root_path /data/projects/domain/backend/web; root $root_path; index index.php; error_log /var/log/nginx/admin.domain.com-error.log; access_log /var/log/nginx/admin.domain.com-access.log; keepalive_timeout 30; ...
И ждём результата.
P.S. Таки да — ошибка пропала.