我需要在某些特定域和链接上使用 Web UI 在 docker 上运行 Kafka,例如:
http://somesite.com/kafka
我正在使用这个docker-compose.yml。
version: '3.3'
services:
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:latest'
ports:
- '9092:9092'
environment:
- KAFKA_BROKER_ID=1
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
kafka-ui:
image: 'provectuslabs/kafka-ui:latest'
environment:
- KAFKA_CLUSTERS_0_NAME=local
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092
- KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper:2181
depends_on:
- kafka
networks:
- default
ports:
- '9099:8080'
当我apache2
通过直接域设置时kafka.somesite.com
,它可以正常工作。
<VirtualHost *:80>
ServerName kafka.somesite.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9099/
ProxyPassReverse / http://127.0.0.1:9099/
</VirtualHost>
但是当我尝试使用链接设置域时somesite.com/kafka
,只有空白屏幕。
<VirtualHost *:80>
ServerName somesite.com
ProxyPreserveHost On
ProxyPass /kafka http://127.0.0.1:9099/
ProxyPassReverse /kafka http://127.0.0.1:9099/
</VirtualHost>
如何通过链接让 Kafka 发挥作用?
谢谢。
答案1
您必须更改两件事。首先,您需要配置 kafka-ui 容器的基本 URL,您可以使用SERVER_SERVLET_CONTEXT_PATH
环境变量。
# ...
kafka-ui:
image: 'provectuslabs/kafka-ui:latest'
environment:
- KAFKA_CLUSTERS_0_NAME=local
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092
- KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper:2181
- SERVER_SERVLET_CONTEXT_PATH=/kafka
# ...
如果不这样做,kafka-ui 生成的所有 URL 都将以 开头,从而导致从而不是/
中获取 CSS、JavaScript 等。/
/kafka/
然后您需要使ProxyPass
指令适应该路径:
ProxyPass /kafka/ http://127.0.0.1:9099/kafka/
ProxyPassReverse /kafka/ http://127.0.0.1:9099/kafka/
始终ProxyPass
确保尾部斜杠匹配,如文档中所述:
如果第一个参数以尾随 / 结尾,则第二个参数也应以尾随 / 结尾,反之亦然。否则,对后端的最终请求可能会遗漏一些必要的斜杠,并且无法提供预期的结果。
答案2
ServerName 仍应为somesite.com
,因为 Apache 仍将其作为基本 URL。当 URL 为 时,somesite.com/kafka
它应将其重定向到http://127.0.0.1:9099/
最重要的是,只要你设置ServerName somesite.com