英文:
Broadleaf Commerce Embedded Solr cannot run with root user
问题
以下是翻译好的部分:
我下载了一个新的 6.1 版本的 broadleaf-commerce,并且在我的本地机器上通过以下命令成功运行(在我的 macbook 上):java -javaagent:./admin/target/agents/spring-instrument.jar -jar admin/target/admin.jar
。但是在我的 centos 7 上,我运行以下命令时出现了错误:
2020-10-12 13:20:10.838 INFO 2481 --- [ main] c.b.solr.autoconfigure.SolrServer : 正在同步 solr 配置文件:jar:file:/home/mynewuser/seafood-broadleaf/admin/target/admin.jar!/BOOT-INF/lib/broadleaf-boot-starter-solr-2.2.1-GA.jar!/solr/standalone/solrhome/configsets/fulfillment_order/conf/solrconfig.xml 至:/tmp/solr-7.7.2/solr-7.7.2/server/solr/configsets/fulfillment_order/conf/solrconfig.xml
*** [警告] *** 您的最大进程限制当前为 62383。
应将其设置为 65000 以避免操作中断。
如果您不再希望看到此警告,请在您的配置文件或 solr.in.sh 中将 SOLR_ULIMIT_CHECKS 设置为 false。
警告:以 root 用户身份启动 Solr 存在安全风险,不被视为最佳实践。正在退出。
请查阅参考指南。要覆盖此检查,请使用参数 -force 启动
2020-10-12 13:20:11.021 ERROR 2481 --- [ main] c.b.solr.autoconfigure.SolrServer : 启动 Solr 时出现问题
这里是 Solr 配置的源代码,我相信这是更改配置以通过编程方式使用参数 -force
的地方。
package com.community.core.config;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.broadleafcommerce.core.search.service.SearchService;
import org.broadleafcommerce.core.search.service.solr.SolrConfiguration;
import org.broadleafcommerce.core.search.service.solr.SolrSearchServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
*
*
* 作者:Phillip Verheyden(phillipuniverse)
*/
@Component
public class ApplicationSolrConfiguration {
@Value("${solr.url.primary}")
protected String primaryCatalogSolrUrl;
@Value("${solr.url.reindex}")
protected String reindexCatalogSolrUrl;
@Value("${solr.url.admin}")
protected String adminCatalogSolrUrl;
@Bean
public SolrClient primaryCatalogSolrClient() {
return new HttpSolrClient.Builder(primaryCatalogSolrUrl).build();
}
@Bean
public SolrClient reindexCatalogSolrClient() {
return new HttpSolrClient.Builder(reindexCatalogSolrUrl).build();
}
@Bean
public SolrClient adminCatalogSolrClient() {
return new HttpSolrClient.Builder(adminCatalogSolrUrl).build();
}
@Bean
public SolrConfiguration blCatalogSolrConfiguration() throws IllegalStateException {
return new SolrConfiguration(primaryCatalogSolrClient(), reindexCatalogSolrClient(), adminCatalogSolrClient());
}
@Bean
protected SearchService blSearchService() {
return new SolrSearchServiceImpl();
}
}
英文:
I download a fresh 6.1 broadleaf-commerce and run my local machine via java -javaagent:./admin/target/agents/spring-instrument.jar -jar admin/target/admin.jar
successfully on mine macbook. But in my centos 7 I run sudo java -javaagent:./admin/target/agents/spring-instrument.jar -jar admin/target/admin.jar
with following error
2020-10-12 13:20:10.838 INFO 2481 --- [ main] c.b.solr.autoconfigure.SolrServer : Syncing solr config file: jar:file:/home/mynewuser/seafood-broadleaf/admin/target/admin.jar!/BOOT-INF/lib/broadleaf-boot-starter-solr-2.2.1-GA.jar!/solr/standalone/solrhome/configsets/fulfillment_order/conf/solrconfig.xml to: /tmp/solr-7.7.2/solr-7.7.2/server/solr/configsets/fulfillment_order/conf/solrconfig.xml
*** [WARN] *** Your Max Processes Limit is currently 62383.
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
WARNING: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
Please consult the Reference Guide. To override this check, start with argument '-force'
2020-10-12 13:20:11.021 ERROR 2481 --- [ main] c.b.solr.autoconfigure.SolrServer : Problem starting Solr
Here is the source code of solr configuration, I believe it is the place to change the configuration to run with the argument -force
in programming way.
package com.community.core.config;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.broadleafcommerce.core.search.service.SearchService;
import org.broadleafcommerce.core.search.service.solr.SolrConfiguration;
import org.broadleafcommerce.core.search.service.solr.SolrSearchServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
*
*
* @author Phillip Verheyden (phillipuniverse)
*/
@Component
public class ApplicationSolrConfiguration {
@Value("${solr.url.primary}")
protected String primaryCatalogSolrUrl;
@Value("${solr.url.reindex}")
protected String reindexCatalogSolrUrl;
@Value("${solr.url.admin}")
protected String adminCatalogSolrUrl;
@Bean
public SolrClient primaryCatalogSolrClient() {
return new HttpSolrClient.Builder(primaryCatalogSolrUrl).build();
}
@Bean
public SolrClient reindexCatalogSolrClient() {
return new HttpSolrClient.Builder(reindexCatalogSolrUrl).build();
}
@Bean
public SolrClient adminCatalogSolrClient() {
return new HttpSolrClient.Builder(adminCatalogSolrUrl).build();
}
@Bean
public SolrConfiguration blCatalogSolrConfiguration() throws IllegalStateException {
return new SolrConfiguration(primaryCatalogSolrClient(), reindexCatalogSolrClient(), adminCatalogSolrClient());
}
@Bean
protected SearchService blSearchService() {
return new SolrSearchServiceImpl();
}
}
答案1
得分: 1
这里有一个先行声明,建议您最好不要以“root”身份启动应用程序。如果您在Docker中,可以使用USER
命令切换到非root用户。
在Broadleaf Community中,Solr服务器的启动是通过broadleaf-boot-starter-solr
依赖在程序中完成的。这是将Solr与Spring生命周期关联起来的包装器。所有真正的魔法发生在com.broadleafcommerce.solr.autoconfigure.SolrServer
类中。
在那个类中,您会看到一个startSolr()
方法。这个方法是向Solr添加启动参数的地方。
在您的情况下,您需要大部分地复制这个方法,并使用cmdLine.addArgument(...)
来添加额外的参数。示例代码如下:
class ForceStartupSolrServer extends SolrServer {
public ForceStartupSolrServer(SolrProperties props) {
super(props);
}
protected void startSolr() {
if (!isRunning()) {
if (!downloadSolrIfApplicable()) {
throw new IllegalStateException("Could not download or expand Solr, see previous logs for more information");
}
stopSolr();
synchConfig();
{
CommandLine cmdLine = new CommandLine(getSolrCommand());
cmdLine.addArgument("start");
cmdLine.addArgument("-p");
cmdLine.addArgument(Integer.toString(props.getPort()));
// START MODIFICATION
cmdLine.addArgument("-force");
// END MODIFICATION
Executor executor = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(System.out);
streamHandler.setStopTimeout(1000);
executor.setStreamHandler(streamHandler);
try {
executor.execute(cmdLine);
created = true;
checkCoreStatus();
} catch (IOException e) {
LOG.error("Problem starting Solr", e);
}
}
}
}
}
然后创建一个@Configuration
类来覆盖由SolrAutoConfiguration
创建的blAutoSolrServer
bean(请注意对于org.broadleafoverrides.config
的特定包要求):
package org.broadleafoverrides.config;
public class OverrideConfiguration {
@Bean
public ForceStartupSolrServer blAutoSolrServer(SolrProperties props) {
return new ForceStartupSolrServer(props);
}
}
英文:
Let me preface this by saying you would be better off simply not starting the application as root
. If you are in Docker, you can use the USER
command to switch to a non-root user.
The Solr server startup in Broadleaf Community is done programmatically via the broadleaf-boot-starter-solr
dependency. This is the wrapper around Solr that ties it to the Spring lifecycle. All of the real magic happens in the com.broadleafcommerce.solr.autoconfigure.SolrServer
class.
In that class, you will see a startSolr()
method. This method is what adds startup arguments to Solr.
In your case, you will need to mostly copy this method wholesale and use cmdLine.addArgument(...)
to add additional arguments. Example:
class ForceStartupSolrServer extends SolrServer {
public ForceStartupSolrServer(SolrProperties props) {
super(props);
}
protected void startSolr() {
if (!isRunning()) {
if (!downloadSolrIfApplicable()) {
throw new IllegalStateException("Could not download or expand Solr, see previous logs for more information");
}
stopSolr();
synchConfig();
{
CommandLine cmdLine = new CommandLine(getSolrCommand());
cmdLine.addArgument("start");
cmdLine.addArgument("-p");
cmdLine.addArgument(Integer.toString(props.getPort()));
// START MODIFICATION
cmdLine.addArgument("-force");
// END MODIFICATION
Executor executor = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(System.out);
streamHandler.setStopTimeout(1000);
executor.setStreamHandler(streamHandler);
try {
executor.execute(cmdLine);
created = true;
checkCoreStatus();
} catch (IOException e) {
LOG.error("Problem starting Solr", e);
}
}
}
}
}
Then create an @Configuration
class to override the blAutoSolrServer
bean created by SolrAutoConfiguration
(note the specific package requirement for org.broadleafoverrides.config
):
package org.broadleafoverrides.config;
public class OverrideConfiguration {
@Bean
public ForceStartupSolrServer blAutoSolrServer(SolrProperties props) {
return new ForceStartupSolrServer(props);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论