一段时间后,来自 docker 中 nginx 代理的 GELF json 日志停止到达 graylog

一段时间后,来自 docker 中 nginx 代理的 GELF json 日志停止到达 graylog

嗯...从哪里开始呢...我有一个应用程序堆栈(在 docker swarm 中运行),前面有 nginx 作为代理。我有 json 格式的日志,通过 gelf 发送到 graylog。

容器系统为 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 上。有一段时间了。

经过一段随机的时间后,访问日志就消失了,graylog 上只显示“读取上游时,上游响应被缓冲到临时文件”。我花了好几个小时在 Google 上搜索东西,摆弄缓冲区(禁用 proxy_cache、禁用 proxy_buffers、增加 proxy_buffers、proxy_buffer_size 和 proxy_busy_buffers_size),但毫无效果。当我禁用代理缓冲时,根本没有日志。当然,堆栈工作正常,所有请求都经过代理 - 只是没有来自代理的访问日志。

但是,当我将 access_log 更改为保存到文件(而不是将其重定向到 stdout)时,所有访问日志都会保存到文件中,并且格式正确。

更新服务/关闭代理容器没有帮助。完全删除堆栈并再次部署有帮助。直到它重复。

有什么想法这里可能存在什么问题以及我应该在哪里查找?

截屏

相关内容