如何让基于Quarkus 3.8.4的Keycloak仅监听localhost?
我运行基于Quarkus的Keycloak时,它默认监听系统所有接口,想把它限制为仅监听localhost但一直没成功。之前Quarkus默认只监听localhost,后来改成仅在DEV环境下默认监听localhost,甚至还存在日志错误显示实际监听主机和端口的问题。
现在的问题是,我不确定正确的配置项是什么,也不敢信日志输出——不管是用Java系统属性还是环境变量修改配置,日志始终显示http://0.0.0.0:8080。
根据Quarkus官方文档:
quarkus.http.host
HTTP主机配置
开发/测试模式下默认值为localhost,生产模式下默认值为0.0.0.0
默认设为0.0.0.0是为了方便在容器中部署Quarkus,但这不适合开发/测试模式,因为网络中的其他人可以连接到你的开发机器。
对应的环境变量:QUARKUS_HTTP_HOST
我执行的命令和日志如下:
C:\Program Files\Keycloak\24.0>set JAVA_OPTS_APPEND=-Dquarkus.http.host=127.0.0.1 C:\Program Files\Keycloak\24.0>set QUARKUS_HTTP_HOST=127.0.0.1 C:\Program Files\Keycloak\24.0>bin\kc.bat start-dev "JAVA_OPTS already set in environment; overriding default settings with values: -Dh2.bindAddress=127.0.0.1" "Appending additional Java properties to JAVA_OPTS: -Dquarkus.http.host=127.0.0.1" 2024-05-27 16:19:57,684 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled 2024-05-27 16:19:57,780 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller' 2024-05-27 16:19:58,825 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: <unset>, Hostname: LAP3738, Strict HTTPS: false, Path: <request>, Strict BackChannel: false, Admin URL: <unset>, Admin: <request>, Port: -1, Proxied: false 2024-05-27 16:19:59,535 WARN [io.quarkus.agroal.runtime.DataSources] (JPA Startup Thread) Datasource <default> enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly 2024-05-27 16:20:00,595 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_129835, Site name: null 2024-05-27 16:20:00,595 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener 2024-05-27 16:20:01,413 INFO [io.quarkus] (main) Keycloak 24.0.4 on JVM (powered by Quarkus 3.8.4) started in 5.137s. Listening on: http://0.0.0.0:8080 2024-05-27 16:20:01,413 INFO [io.quarkus] (main) Profile dev activated. 2024-05-27 16:20:01,413 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx] 2024-05-27 16:20:01,415 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production. 2024-05-27 16:24:49,766 INFO [io.quarkus] (main) Keycloak stopped in 0.029s
如上所示,即使修改了主机配置且激活了DEV环境,它仍然在全局监听。
1. 直接通过启动命令传递参数
跳过环境变量设置,直接在启动命令中添加--http-host=127.0.0.1参数,这种方式优先级最高,能确保配置生效:
bin\kc.bat start-dev --http-host=127.0.0.1
2. 修改配置文件
在Keycloak安装目录的conf文件夹下,创建或编辑application.properties文件,添加以下配置:
quarkus.http.host=127.0.0.1
DEV模式启动时会自动加载该文件中的配置。
3. 验证实际监听状态
Quarkus存在日志显示与实际监听不一致的历史问题,不要完全依赖日志。可以用netstat命令验证实际监听端口:
netstat -ano | findstr :8080
如果结果显示127.0.0.1:8080,说明配置已经生效,只是日志显示错误;若仍显示0.0.0.0:8080,再尝试其他方法。
4. 排查配置覆盖问题
检查是否有其他配置文件(如kc.conf)或环境变量覆盖了quarkus.http.host的值。可以添加-Dquarkus.log.level=DEBUG启动参数,查看详细的配置加载日志,确认你的配置是否被正确读取。
内容的提问来源于stack exchange,提问作者Thorsten Schöning

