AWS: 502 ошибка на Application Load balancer

Автор: | 10/08/2018

Имеется 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. Таки да – ошибка пропала.