Назад | Перейти на главную страницу

Журналы GELF json перестают поступать в Graylog через некоторое время из прокси-сервера nginx в докере

Хм .. с чего начать ... у меня есть стек приложений (работает в docker swarm) с nginx в качестве прокси впереди. У меня есть журналы в формате json, которые отправляются в Graylog через gelf.

Система контейнеров - alpine 3.11.5, а версия nginx - 1.17.10.

шаблон nginx.conf (мы используем 1024 рабочих соединения и размер тела 10M):

user nginx;
worker_processes auto;

error_log   /var/log/nginx/error.log warn;
pid         /var/run/nginx.pid;

events {
    worker_connections ${MAX_CONNECTIONS};
}

http {
        log_format json escape=json 
            '{'
            '"remoteAddress": "$remote_addr", '
            '"remoteUser": "$remote_user", '
            '"localTime": "$time_iso8601", '
            '"request":"$request", '
            '"requestLength": $request_length, '
            '"requestProcessTime": $request_time, '
            '"responseStatus": $status, '
            '"bodyBytesSent": $body_bytes_sent, '
            '"httpReferer":"$http_referer",'
            '"httpUserAgent": "$http_user_agent",'
            '"http_x_forwarded_for":"$http_x_forwarded_for"'
        '}';

        include /etc/nginx/mime.types;
        default_type    application/octet-stream;

        access_log /var/log/nginx/access.log json;

        sendfile    on;
        #tcp_nopush on;
        server_tokens   off;

        keepalive_timeout   65;

        #gzip   on;

        client_max_body_size ${MAX_BODY_SIZE};

        include /etc/nginx/conf.d/*.conf;
}

conf.d / proxy.conf шаблон

server {
    listen ${Port} default_server;
    listen [::]:${Port} default_server;

    server_name proxy;
    resolver 127.0.0.11 ipv6=off;

    location ~^/help(.*)$ {
        proxy_pass http://help$1$is_args$args;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        proxy_pass http://webapp/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
    }

    location ~ ^/api/(.*?)/(.*)$ {
        proxy_pass http://$1:8080/$1/$2$is_args$args;
        proxy_http_version 1.1;
    }
}

Конфигурация составления логов Docker:

logging:
        driver: gelf
        options:
          gelf-address: "udp://ip-in-here:12201"
          tag: "dev-proxy"

И это работает. Журналы доступа в красивом формате json попадают в Graylog. Какое-то время.

По прошествии произвольного количества времени журналы доступа больше не существуют, и все, что попадает в серый журнал, - это «ответ восходящего потока буферизуется во временный файл при чтении восходящего потока». Я провел несколько часов в гугле, возился с буферами (отключение proxy_cache, отключение proxy_buffers, увеличение proxy_buffers, proxy_buffer_size и proxy_busy_buffers_size), но безрезультатно. Когда я отключаю буферизацию прокси, журнала вообще нет. Конечно, стек работает правильно, и все запросы передаются через прокси - просто больше нет журнала доступа от прокси.

Однако, когда я изменяю access_log для сохранения в файл (вместо перенаправления его на стандартный вывод), все журналы доступа сохраняются в файл, правильно отформатированный.

Обновление контейнера службы / закрытие прокси-сервера не помогает. Помогает полное удаление стека и его повторное развертывание. Пока не повторится.

Есть идеи, в чем может быть проблема и где мне искать?

Скриншот