You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Solr 9.5.0健康检查返回401认证错误,求助排查

问题描述

我正在使用Apache Solr 9.5.0,执行以下健康检查命令:

solr/bib/solr run_tool healthcheck -zkHost "$ZK_HOST" -collection "$HEALTHCHECK_COLLECTION" $VERBOSE

返回错误如下:

-- RECENT
{collection_name}
INFO  - 2024-12-18 12:32:04.867; org.apache.solr.util.configuration.SSLConfigurations; Setting javax.net.ssl.keyStorePassword
INFO  - 2024-12-18 12:32:04.873; org.apache.solr.util.configuration.SSLConfigurations; Setting javax.net.ssl.trustStorePassword

ERROR: Error from server at https://localhost:25103/solr/dev-audit-2024_shard1_replica_n1/select?q=*%3A*&rows=0&_stateVer_=dev-audit-2024%3A111&wt=javabin&version=2: Expected mime type in [application/vnd.apache.solr.javabin, application/octet-stream] but got text/html. <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 401 require authentication</title>
</head>
<body><h2>HTTP ERROR 401 require authentication</h2>
<table>
<tr><th>URI:</th><td>/solr/dev-audit-2024_shard1_replica_n1/select</td></tr>
<tr><th>STATUS:</th><td>401</td></tr>
<tr><th>MESSAGE:</th><td>require authentication</td></tr>
<tr><th>SERVLET:</th><td>default</td></tr>
</table>

</body>
</html>

我的配置如下:

security.json

{
    "authentication":{
     "class":"solr.CertAuthPlugin",
     "credentials":{"gmpsolr":"encrypted password"}
    },
    "authorization":{
     "class":"solr.RuleBasedAuthorizationPlugin",
     "user-role":{"gmpsolr":"admin"},
     "permissions":[{"name":"all",
     "role":"admin"}]
    }}

启动参数

-DSTOP.KEY=solrrocks
-DSTOP.PORT=24103
-DdisableAdminUI=false
-Dhost=10.0.2.15
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
-Djavax.net.ssl.keyStore=/......../solr/server/etc/solr-ssl.keystore.jks
-Djavax.net.ssl.keyStoreType=JKS
-Djavax.net.ssl.trustStore=/......../solr/server/etc/solr-ssl.keystore.jks
-Djavax.net.ssl.trustStoreType=JKS
-Djdk.tls.ephemeralDHKeySize=2048
-Djdk.xml.xpathExprGrpLimit=0
-Djdk.xml.xpathExprOpLimit=0
-Djdk.xml.xpathTotalOpLimit=0
-Djetty.home=/......../solr-9.5.0/server
-Djetty.port=25103
-Dlog4j2.formatMsgNoLookups=true
-Dsolr.default.confdir=/......./solr-9.5.0/server/solr/configsets/_default/conf
-Dsolr.http1=true
-Dsolr.install.dir=/......./solr-9.5.0
-Dsolr.install.symDir=/......./solr
-Dsolr.jetty.host=0.0.0.0
-Dsolr.jetty.https.port=25103
-Dsolr.jetty.inetaccess.excludes=
-Dsolr.jetty.inetaccess.includes=
-Dsolr.jetty.keystore.type=JKS
-Dsolr.jetty.keystore=/......./solr/server/etc/solr-ssl.keystore.jks
-Dsolr.jetty.ssl.needClientAuth=false
-Dsolr.jetty.ssl.wantClientAuth=false
-Dsolr.jetty.truststore.type=JKS
-Dsolr.jetty.truststore=/......./solr/server/etc/solr-ssl.keystore.jks
-Dsolr.keyStoreReload.enabled=true
-Dsolr.log.dir=/......./log
-Dsolr.log.muteconsole
-Dsolr.max.booleanClauses=10000
-Dsolr.modules=scripting
-Dsolr.solr.home=/......./dbs/recentNode
-Dsolr.zk.embedded.host=0.0.0.0
-Duser.timezone=UTC
-DzkClientTimeout=30000

同时curl命令可正常执行:

curl -u gmpsolr:password -k https://localhost:25103/solr/admin/collections?action=CLUSTERSTATUS

请问我是否遗漏了什么配置?


解决方案

问题核心是健康检查工具未携带认证信息,导致请求被Solr的认证插件拦截返回401。可以通过以下方式解决:

  • 直接添加基本认证参数到命令
    在健康检查命令中加入-basicAuth参数,指定用户名和明文密码,完整命令示例:

    solr/bib/solr run_tool healthcheck -zkHost "$ZK_HOST" -collection "$HEALTHCHECK_COLLECTION" $VERBOSE -basicAuth gmpsolr:your_plain_password
    
  • 通过配置文件传递认证信息
    若不想在命令行明文暴露密码,可修改solr.in.sh(Linux)或solr.in.cmd(Windows)配置文件,添加以下环境变量:

    SOLR_AUTH_TYPE=basic
    SOLR_AUTHENTICATION_OPTS="-Dbasicauth=gmpsolr:your_plain_password"
    

    之后执行健康检查命令时,工具会自动读取该配置中的认证信息。

  • 适配CertAuthPlugin的证书认证(可选)
    你当前使用的solr.CertAuthPlugin支持证书认证,但健康检查工具默认不会自动加载客户端证书。若要使用证书认证,需在命令中添加SSL参数指定客户端证书路径,不过相比之下基本认证的方式更适配该工具的使用场景。

另外,虽然你的security.json已配置gmpsolr用户属于admin角色并拥有all权限,理论上权限无问题,但可额外验证该用户对目标集合的访问权限是否正常。


内容的提问来源于stack exchange,提问作者Aditya Mhetras

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:59:50