允许通过nginx访问kafka

qiz*_*zer 2 nginx apache-kafka

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

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

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

卡夫卡的回复: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;
    }
}

Run Code Online (Sandbox Code Playgroud)

有谁知道问题是什么?

cri*_*007 6

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

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

(我个人没有尝试过)

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

无法通过域名连接互联网。

听起来像是你的配置有问题advertised.listeners。请注意,没有明确的方法可以将 Kafka“隐藏”在代理后面,因为您的客户端需要单独与每个代理直接通信(因此,除非您想使用一台 Nginx 服务器或打开一个新端口,否则就违背了使用 Ngnix 的目的) Broker),因此还要求 Kafka 知道它需要“通告”代理而不是它自己的地址。

如果你真的想将 Kafka 暴露给公共网络,你应该使用 SSL/SASL 监听器,而不是 PLAINTEXT


如果你想使用HTTP,那么你可以安装Kafka REST Proxy,然后将Nginx放在它的前面。那么你的客户将使用 http 而不是标准的 kafka 库