我的日志记录设置是一个Docker主机,为syslog公开了UDP 514. Nginx容器的端口已发布,因此当您将日志发送到10.1.1.100时(如下图所示),它首先命中Nginx,其配置为Logstash容器的透明负载平衡是:
user root;
events {worker_connections 32768;}
stream {
upstream logstash_servers {
server logstash-collector-01:514;
server logstash-collector-02:514;
server logstash-collector-03:514;
}
listen 514 udp;
proxy_pass logstash_servers;
proxy_bind $remote_addr transparent;
}
}
这很好用.但是,TCP 514(或任何TCP,就此而言)没有.即使我添加正确的侦听器和配置,我相信TCP握手没有完成,因为Nginx执行透明的负载平衡,其proxy_bind传递,例如,10.1.1.5作为源IP,例如172.18.0.4(Logstash实例).然后该实例尝试完成握手,但10.1.1.5(以及沿途的任何路由器)不知道如何路由到172.18.0.0/16的Docker网络.
这里有解决方案能够使用TCP进行日志记录吗?
查看您的设置,您甚至可以在514上有一个前端logstash监听器,它可以转发到另一个logstash实例进行实际处理.
由于logstash不是AFAIK执行负载平衡,您可以根据您放置的某些标记/类型来“路由”事件.
检查https://www.nginx.com/resources/admin-guide/tcp-load-balancing/,为了同时拥有TCP和UDP,您需要以下内容:
stream {
upstream logstash_servers {
server logstash-collector-01:514;
server logstash-collector-02:514;
server logstash-collector-03:514;
}
server {
listen 514;
...
}
server {
listen 514 udp;
...
}
}
我不清楚在UDP服务器块中使用logstash_servers是否会导致Nginx对它们说UDP或TCP,因此您可能需要使它们都可用.
我有点怀疑在连接到logstash后端时使用’错误’IP作为源的Nginx节点问题 – 通常,你的Nginx前端将使用’正确’的IP来做这件事,在你的情况下,将意味着在172.18 / 16内的地址.
这类似于在反向代理localhost时如何使用Nginx:在这种情况下,Nginx将使用源IP为127.0.0.1(或:: 1)与localhost应用程序通信,而不是Nginx看到请求来自的IP .
还有一个事实,你似乎说这一切都适用于UDP – 这往往会说路由不是一个问题,但你的TCP设置可能是.