首页 > 解决方案 > 允许通过 nginx 访问 kafka

问题描述

美好的一天,我想kafka从互联网连接到我的服务器。Kafka 安装在虚拟服务器上,所有服务器都隐藏在nginx.

我更新了 kafka 设置(server.properties)。添加:listeners=PLAINTEXT://:9092

我可以通过 ip 地址从本地网络连接到 kafka 服务器10.0.0.1:9092,但无法通过域名从 Internet 连接。

来自卡夫卡的回应:java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Topic test-topic not present in metadata after 60000 ms.

Nginx:[26/Nov/2019:12:38:25 +0100] "\x00\x00\x00\x14\x00\x12\x00\x02\x00\x00\x00\x00\x00" 400 166 "-" "-" "request_time=1.535" "upstream_response_time=-" "upstream_connect_time=-" "upstream_header_time=-"

nginx的配置:

server {
    listen       9092;
    server_name  site.name;

    # Max Request size
    client_max_body_size 20m;

    location / {
        proxy_pass      http://10.0.0.1:9092;
    }
}

有谁知道问题是什么?

标签: nginxapache-kafka

解决方案


Kafka 不使用 http 协议进行通信,因此不能以 HTTP 反向代理为前端。

您必须使用 nginx 流定义块进行 TCP 代理

(我没有亲自尝试过)

https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/

无法通过域名从 Internet 连接。

听起来你的advertised.listeners配置有问题。请注意,没有明确的方法可以在代理后面“隐藏”Kafka,因为您的客户端需要单独与每个代理直接通信(因此违背了拥有 Ngnix 的目的,除非您想为每个代理运行一个服务器)

如果您真的想将 Kafka 公开给公共网络,您应该真正使用 SSL/SASL 侦听器,而不是 PLAINTEXT


如果你想使用HTTP,那么你可以安装Kafka REST Proxy,然后把Nginx放在前面


推荐阅读