title: Solr8 在linux服务器的部署与所遇到的问题记录
tags: [Sdudoc, Tomcat, Solr, Liunx, Sdudoc]
categories: 技术
Tomcat配置
-
在 linux 的 /usr/local 目录下新建一个 solr 目录
-
下载最新的Tomcat到 Linux 系统的 /usr/local/solr下,下载链接:tomcat
[root@localhost solr]# ls apache-tomcat-8.5.75.tar.gz
然后解压压缩包
tar -zxvf apache-tomcat-8.5.75.tar.gz
将解压后生成的文件夹名称改为 tomcat-solr 以方便之后辨识
mv apache-tomcat-8.5.75 tomcat-solr
-
转到 solr/tomcat-solr/conf 目录下,修改 server.xml 配置文件
cd tomcat-solr/conf/ vi server.xml
为了防止端口冲突,我们要更改一些内容:
-
将 Connector 的端口改为 8088
<Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector executor="tomcatThreadPool" port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-
-
执行 bin 目录下的 startup.sh
sh bin/shartup.sh ---- Using CATALINA_BASE: /usr/local/solr/tomcat-solr Using CATALINA_HOME: /usr/local/solr/tomcat-solr Using CATALINA_TMPDIR: /usr/local/solr/tomcat-solr/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/solr/tomcat-solr/bin/bootstrap.jar:/usr/local/solr/tomcat-solr/bin/tomcat-juli.jar Using CATALINA_OPTS: Tomcat started. ----
-
查看一下日志输出
tail -f logs/catalina.out ---- 25-Jan-2022 21:58:43.916 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/solr/tomcat-solr/webapps/host-manager] 25-Jan-2022 21:58:43.950 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/solr/tomcat-solr/webapps/host-manager] has finished in [35] ms 25-Jan-2022 21:58:43.951 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/solr/tomcat-solr/webapps/ROOT] 25-Jan-2022 21:58:43.968 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/solr/tomcat-solr/webapps/ROOT] has finished in [17] ms 25-Jan-2022 21:58:43.968 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/solr/tomcat-solr/webapps/examples] 25-Jan-2022 21:58:44.237 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/solr/tomcat-solr/webapps/examples] has finished in [269] ms 25-Jan-2022 21:58:44.238 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/solr/tomcat-solr/webapps/manager] 25-Jan-2022 21:58:44.259 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/solr/tomcat-solr/webapps/manager] has finished in [22] ms 25-Jan-2022 21:58:44.264 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8088"] 25-Jan-2022 21:58:44.285 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [690] milliseconds ----
尝试连接对应端口发现出现了io timeout情况,解决方案在附录中写出
Solr 配置
solr下载地址:下载地址
本来想着利用tomcat来运行solr,但是我惊奇的发现solr的新版本中竟然没有了war包,查看官方文档,可以发现取消了原有的war包:
Solr is a server
Solr is intended to be a server not a Java web application, similar to mysql or the Apache web server. When Solr was first created, designing it as a web application was a convenient choice, to avoid writing a lot of tricky code to build a network layer. These days, this design decision has become a limiting factor.
但是我们配了半天的tomcat也不能白配,于是我们可以将解压后的压缩包中的 server/solr-webapp/webapp 文佳佳复制到 /usr/local/solr/tomcat-solr/webapps/solr下
cp -r server/solr-webapp/webapp /usr/local/solr/tomcat-solr/webapps/solr
然后将一些jar包复制到 WEB-INF/lib下
[root@localhost solr-8.11.0]# cp server/lib/ext /usr/local/solr/tomcat-solr/webapps/solr/WEB-INF/lib/
server/lib/metrics* 开头的5个jar复制到 /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/下
[root@localhost lib]# cp metr* /usr/local/solr/tomcat-solr/webapps/solr/WEB-INF/lib/
将 server/resources/ 下的 log4j.properties (solr8中是log4j2-console.xml 和 log4j2.xml),添加到刚才的 solr 工程中,记得在WEB-INF下创建一个classes目录
[root@localhost resources]# mkdir /usr/local/solr/tomcat-solr/webapps/solr/WEB-INF/classes
[root@localhost resources]# cp log4j* /usr/local/solr/tomcat-solr/webapps/solr/WEB-INF/classes/
然后注释掉的标签和其内容
将server/solr 目录复制到 /use/local/solr 下,并重命名为solrhome
[root@localhost server]# cp -r solr /usr/local/solr/solrhome
然后就是关联solr和solrhome
修改Tomcat中 webapps/solr/WEB-INF下的web.xml
然后我们惊讶地发现,没有关于重定向 solrhome 的地方
我们先将下面内容注释掉:
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
即这段注释掉即可。
此时开启tomcat即可访问solr服务。
solr8的用户只需要加上这段即可,solr7直接修改“你的solrhome位置”部分为solrhome路径:
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>“你的solrhome位置”</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
注意:Tomcat10启动时会报ClassCastException,那是由于Tomcat把Filter修改了来源包,建议用Tomcat8
不过为了保险起见,如果想用原生配置的可以查看官方文档:官方文档
附录
问题1:无法连接到linux服务器的8088端口
观察到上面的logs可以发现服务器的tomcat实际上已经启动成功了,并且占用的是8088端口,但是当我用浏览器访问该端口时,却发现io timeout。初步判断是防火墙的问题。
我们先尝试ping一下服务器:
ping 211.87.232.198
正在 Ping 211.87.232.198 具有 32 字节的数据:
来自 211.87.232.198 的回复: 字节=32 时间=37ms TTL=60
来自 211.87.232.198 的回复: 字节=32 时间=41ms TTL=60
来自 211.87.232.198 的回复: 字节=32 时间=40ms TTL=60
来自 211.87.232.198 的回复: 字节=32 时间=41ms TTL=60211.87.232.198 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 37ms,最长 = 41ms,平均 = 39ms
可以发现网络连接上是没有问题的,然后我们再使用 telnet 测试8088端口:
telnet 211.87.232.198 8088
正在连接211.87.232.198…无法打开到主机的连接。 在端口 8088: 连接失败
该端口没有回应,说明可能是防火墙的问题。
这时候还可能会出现一种情况,即 tcp 的连接失败,之前遇到过类似的情况:
ping得通说明ICMP是没有问题的,所以问题应该出在TCP上
失败的原因是因为服务器的tcp_timestamps=1,在进行tcp连接时会使用时间戳作为TCP头中的一项,在建立连接的过程中这个时间戳必须是递增的,但是如果经过了NAT协议,NAT协议会改变IP地址和TCP段的端口,映射到网关自己的一个端口号上,如果这个映射的端口号曾经被使用过,那么可能会出现时间戳紊乱,导致TCP连接建立失败。
只需要在 /etc/sysctl.conf 中添加一项
net.ipv4.tcp_timestamp=0
然后再执行
sysctl -p
即可
但是这里并不是上述情况。当我使用指令
systemctl status firewalld
发现防火墙是开启的
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-10-10 03:51:50 EDT; 3 months 16 days ago
Docs: man:firewalld(1)
Main PID: 580 (firewalld)
CGroup: /system.slice/firewalld.service
└─580 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
检查端口开放情况
firewall-cmd --list-ports
8081/tcp 8080/tcp 3306/tcp
可以看出没有8088端口,于是我们添加8088端口到防火墙即可
firewall-cmd --zone=public --add-port=8088/tcp --permanent
----
success
----
firewall-cmd --reload
----
success
----
再次访问对应端口,成功。