www.91084.com

GVKun编程网logo

记一次升级Tomcat(记一次升级仪式)

14

本文将为您提供关于记一次升级Tomcat的详细介绍,我们还将为您解释记一次升级仪式的相关知识,同时,我们还将为您提供关于3.1.从零开始学springboot-记一次tomcat7报错、java–如何

本文将为您提供关于记一次升级Tomcat的详细介绍,我们还将为您解释记一次升级仪式的相关知识,同时,我们还将为您提供关于3.1. 从零开始学 springboot - 记一次 tomcat7 报错、java – 如何在linux上升级Tomcat、Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项(tomcat8为例)、linux安装的是tomcat7,打开tomcat管理界面发现是tomcat6的实用信息。

本文目录一览:

记一次升级Tomcat(记一次升级仪式)

记一次升级Tomcat(记一次升级仪式)

总述

    JDK都要出12了,而我们项目使用的jdk却仍然还停留在JDK1.6。为了追寻技术的发展的脚步,我这边准备将项目升级到JDK1.8。而作为一个web项目,我们的容器使用的是Tomcat。看了下Tomcat版本与JDK版本之间的兼容关系http://tomcat.apache.org/whichversion.html以及网上所传的各种JDK1.8和Tomcat7不兼容的问题, 我决定将Tomcat升级到8。我这里本地验证采用的tomcat版本是8.5.38https://tomcat.apache.org/download-80.cgi。

问题一:请求js文件报404错误

    其实这个问题严格来讲不是升级到Tomcat8出现的问题,而是升级到Tomcat9出现的问题。正好我开始尝试的是Tomcat9,无法解决这个问题才降到Tomcat8。所以这里一并记录下来。

    这个问题在从Tomcat6升级到Tomcat7之后也会存在,原因如下,在项目代码中对js的请求路径中包含了{、}等特殊符号:

<script type="text/javascript" src="${ctx}/js/common/include_css.js?{''ctx'':''${ctx}'',''easyui'':''easyui''}"></script>

    前台会发现加载js的时候报了404的错误,后台报错信息如下:

Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986

    出现这个问题的原因是因为Tomcat升级之后对安全进行了升级,其中就有对请求中的特殊字符进行校验,具体校验规则参照下面的代码:

(InternalInputBuffer、InternalAprInputBuffer、InternalNioInputBuffer)

/**
 * Read the request line. This function is meant to be used during the
 * HTTP request header parsing. Do NOT attempt to read the request body
 * using it.
 *
 * @throws IOException If an exception occurs during the underlying socket
 * read operations, or if the given buffer is not big enough to accommodate
 * the whole line.
 */
@Override
public boolean parseRequestLine(boolean useAvailableDataOnly)

	throws IOException {

	int start = 0;

	//
	// Skipping blank lines
	//

	byte chr = 0;
	do {

		// Read new bytes if needed
		if (pos >= lastValid) {
			if (!fill())
				throw new EOFException(sm.getString("iib.eof.error"));
		}
		// Set the start time once we start reading data (even if it is
		// just skipping blank lines)
		if (request.getStartTime() < 0) {
			request.setStartTime(System.currentTimeMillis());
		}
		chr = buf[pos++];
	} while ((chr == Constants.CR) || (chr == Constants.LF));

	pos--;

	// Mark the current buffer position
	start = pos;

	//
	// Reading the method name
	// Method name is a token
	//

	boolean space = false;

	while (!space) {

		// Read new bytes if needed
		if (pos >= lastValid) {
			if (!fill())
				throw new EOFException(sm.getString("iib.eof.error"));
		}

		// Spec says method name is a token followed by a single SP but
		// also be tolerant of multiple SP and/or HT.
		if (buf[pos] == Constants.SP || buf[pos] == Constants.HT) {
			space = true;
			request.method().setBytes(buf, start, pos - start);
		} else if (!HttpParser.isToken(buf[pos])) {
			throw new IllegalArgumentException(sm.getString("iib.invalidmethod"));
		}

		pos++;

	}

	// Spec says single SP but also be tolerant of multiple SP and/or HT
	while (space) {
		// Read new bytes if needed
		if (pos >= lastValid) {
			if (!fill())
				throw new EOFException(sm.getString("iib.eof.error"));
		}
		if (buf[pos] == Constants.SP || buf[pos] == Constants.HT) {
			pos++;
		} else {
			space = false;
		}
	}

	// Mark the current buffer position
	start = pos;
	int end = 0;
	int questionPos = -1;

	//
	// Reading the URI
	//

	boolean eol = false;

	while (!space) {

		// Read new bytes if needed
		if (pos >= lastValid) {
			if (!fill())
				throw new EOFException(sm.getString("iib.eof.error"));
		}

		// Spec says single SP but it also says be tolerant of HT
		if (buf[pos] == Constants.SP || buf[pos] == Constants.HT) {
			space = true;
			end = pos;
		} else if ((buf[pos] == Constants.CR)
				   || (buf[pos] == Constants.LF)) {
			// HTTP/0.9 style request
			eol = true;
			space = true;
			end = pos;
		} else if ((buf[pos] == Constants.QUESTION) && (questionPos == -1)) {
			questionPos = pos;
		} else if (HttpParser.isNotRequestTarget(buf[pos])) {
			throw new IllegalArgumentException(sm.getString("iib.invalidRequestTarget"));
		}

		pos++;

	}

	request.unparsedURI().setBytes(buf, start, end - start);
	if (questionPos >= 0) {
		request.queryString().setBytes(buf, questionPos + 1,
									   end - questionPos - 1);
		request.requestURI().setBytes(buf, start, questionPos - start);
	} else {
		request.requestURI().setBytes(buf, start, end - start);
	}

	// Spec says single SP but also says be tolerant of multiple SP and/or HT
	while (space) {
		// Read new bytes if needed
		if (pos >= lastValid) {
			if (!fill())
				throw new EOFException(sm.getString("iib.eof.error"));
		}
		if (buf[pos] == Constants.SP || buf[pos] == Constants.HT) {
			pos++;
		} else {
			space = false;
		}
	}

	// Mark the current buffer position
	start = pos;
	end = 0;

	//
	// Reading the protocol
	// Protocol is always "HTTP/" DIGIT "." DIGIT
	//
	while (!eol) {

		// Read new bytes if needed
		if (pos >= lastValid) {
			if (!fill())
				throw new EOFException(sm.getString("iib.eof.error"));
		}

		if (buf[pos] == Constants.CR) {
			end = pos;
		} else if (buf[pos] == Constants.LF) {
			if (end == 0)
				end = pos;
			eol = true;
		} else if (!HttpParser.isHttpProtocol(buf[pos])) {
			// 关键点在这一句,如果校验不通过,则会报参数异常
			throw new IllegalArgumentException(sm.getString("iib.invalidHttpProtocol"));
		}

		pos++;

	}

	if ((end - start) > 0) {
		request.protocol().setBytes(buf, start, end - start);
	} else {
		request.protocol().setString("");
	}

	return true;

}

我们进一步跟进HttpParser中的方法:

public static boolean isNotRequestTarget(int c) {
	// Fast for valid request target characters, slower for some incorrect
	// ones
	try {
		// 关键在于这个数组
		return IS_NOT_REQUEST_TARGET[c];
	} catch (ArrayIndexOutOfBoundsException ex) {
		return true;
	}
}


// Combination of multiple rules from RFC7230 and RFC 3986. Must be
// ASCII, no controls plus a few additional characters excluded
if (IS_CONTROL[i] || i > 127 ||
		i == '' '' || i == ''\"'' || i == ''#'' || i == ''<'' || i == ''>'' || i == ''\\'' ||
		i == ''^'' || i == ''`''  || i == ''{'' || i == ''|'' || i == ''}'') {
	// 可以看到只有在REQUEST_TARGET_ALLOW数组中的值才不会设置成true,所以我们需要追踪REQUEST_TARGET_ALLOW数组的赋值
	if (!REQUEST_TARGET_ALLOW[i]) {
		IS_NOT_REQUEST_TARGET[i] = true;
	}
}

String prop = System.getProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow");
if (prop != null) {
	for (int i = 0; i < prop.length(); i++) {
		char c = prop.charAt(i);
		// 可以看到在配置文件中配置了tomcat.util.http.parser.HttpParser.requestTargetAllow并且包含{、}、|的时候,REQUEST_TARGET_ALLOW数组中的值才会为true
		if (c == ''{'' || c == ''}'' || c == ''|'') {
			REQUEST_TARGET_ALLOW[c] = true;
		} else {
			log.warn(sm.getString("httpparser.invalidRequestTargetCharacter",
					Character.valueOf(c)));
		}
	}
}

    解决办法: 其实通过源码分析不难得到解决办法

在Tomcat的catalina.properties文件中添加以下语句:

tomcat.util.http.parser.HttpParser.requestTargetAllow={}|

当然需要注意的是,这个后门在Tomcat8.5以后就无法使用的,Tomcat9之后的解决办法暂时未找到,可能只有对URL进行编码了。

问题二:Cookie设置报错

     这个问题就是在升级到Tomcat8.5以上的时候会出现的,具体原因是Tomcat8.5采用的Cookie处理类是:

Rfc6265CookieProcessor,而在之前使用的处理类是LegacyCookieProcessor。该处理类对domai进行了校验:

private void validateDomain(String domain) {
	int i = 0;
	int prev = -1;
	int cur = -1;
	char[] chars = domain.toCharArray();
	while (i < chars.length) {
		prev = cur;
		cur = chars[i];
		if (!domainValid.get(cur)) {
			throw new IllegalArgumentException(sm.getString(
					"rfc6265CookieProcessor.invalidDomain", domain));
		}
		// labels must start with a letter or number
		if ((prev == ''.'' || prev == -1) && (cur == ''.'' || cur == ''-'')) {
			throw new IllegalArgumentException(sm.getString(
					"rfc6265CookieProcessor.invalidDomain", domain));
		}
		// labels must end with a letter or number
		if (prev == ''-'' && cur == ''.'') {
			throw new IllegalArgumentException(sm.getString(
					"rfc6265CookieProcessor.invalidDomain", domain));
		}
		i++;
	}
	// domain must end with a label
	if (cur == ''.'' || cur == ''-'') {
		throw new IllegalArgumentException(sm.getString(
				"rfc6265CookieProcessor.invalidDomain", domain));
	}
}

新的Cookie规范对domain有以下要求

1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成 2、必须是数字或字母开头 (所以以前的cookie的设置为.XX.com 的机制要改为 XX.com 即可) 3、必须是数字或字母结尾

原来的代码设置domain时如下:

cookie.setDomain(".aaa.com");

这就导致设置domain的时候不符合新的规范,直接报错如下:

java.lang.IllegalArgumentException: An invalid domain [.aaa.com] was specified for this cookie
        at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:181)
        at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:123)
        at org.apache.catalina.connector.Response.generateCookieString(Response.java:989)
        at org.apache.catalina.connector.Response.addCookie(Response.java:937)
        at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)

    解决办法(以下3中任意一种皆可)

  1. 修改原来代码为:

    cookie.setDomain("aaa.com");
    
  2. 如果是Spring-boot环境,直接替换默认的Cookie处理类:

    @Configuration
    @ConditionalOnExpression("${tomcat.useLegacyCookieProcessor:false}")
    public class LegacyCookieProcessorConfiguration {
        @Bean
        EmbeddedServletContainerCustomizer embeddedServletContainerCustomizerLegacyCookieProcessor() {
            return new EmbeddedServletContainerCustomizer() {
                @Override
                public void customize(ConfigurableEmbeddedServletContainer factory) {
                    if (factory instanceof TomcatEmbeddedServletContainerFactory) {
                        TomcatEmbeddedServletContainerFactory tomcatFactory =
                                (TomcatEmbeddedServletContainerFactory) factory;
                        tomcatFactory.addContextCustomizers(new TomcatContextCustomizer() {
                            @Override
                            public void customize(Context context) {
                                context.setCookieProcessor(new LegacyCookieProcessor());
                            }
                        });
                    }
                }
            };
        }
    }
    
  3. 在Tomcat的context.xml中增加如下配置,指定Cookie的处理类:

    <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" /> 
    

参考链接

https://blog.csdn.net/fy_sun123/article/details/73115381

http://ju.outofmemory.cn/entry/367186

https://www.cnblogs.com/lr393993507/p/7755867.html http://tomcat.apache.org/tomcat-8.5-doc/config/cookie-processor.html

3.1. 从零开始学 springboot - 记一次 tomcat7 报错

3.1. 从零开始学 springboot - 记一次 tomcat7 报错

背景

博主时隔多年,再次进行 java 的开发,本地环境为 jdk1.8+IDEA+tomcat7+maven3.6,检出公司项目,运行报错,艰难排之

报错信息

ERROR 2019-03-06 09:31:23o.s.w.c.ContextLoaderContext initialization failed
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name ''springSecurityFilterChain'' defined in class 
org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: 
Factory method ''springSecurityFilterChain'' threw exception; nested exception is 
java.lang.IllegalStateException: HttpServletRequest.changeSessionId is undefined. 
Are you using a Servlet 3.1+ environment?

搜索引擎限制了长度,所以博主只能一段一段的百度,试图找到相同遭遇的道友,奈何前面的一大坨都没有找到相似的,最后 Are you using a Servlet 3.1+ environment? 这段找到了一些信息

1.png

博主一想,有些道理,可能真是自己的 tomcat 太过老旧,遂安装最新 9.0,运行,成功。。。。。

总结

内在原因在截图中已经描述了,看来软件还是用最新的比较好

请关注我的订阅号

订阅号.png

java – 如何在linux上升级Tomcat

java – 如何在linux上升级Tomcat

我当前运行的Tomcat如下

Tomcat Version : Apache Tomcat/5.5.36
Servlet Specification Version : 2.4
JSP version : 2.0

我需要改成它

Tomcat Version : Apache Tomcat/8.0.14
Servlet Specification Version : 3.1
JSP version : 2.3

我下载了Tomcat版本8,我有以下内容,如何运行Tomcat 8并使其成为服务器的默认设置?

root@server [/opt]# ls
./                           cpanel/                    pcre/
../                          curlssl/                   PHP_with_imap_client/
apache-tomcat-8.0.18/        jdk1.7.0_75/               suPHP/
apache-tomcat-8.0.18.tar.gz  jdk-7u75-linux-x64.tar.gz  xml2/

我尝试了以下命令,但失败了.

root@server [/opt/apache-tomcat-8.0.18/bin]# ./startup.sh
Cannot find apache-tomcat-8.0.18/bin/setclasspath.sh
This file is needed to run this program

在〜/ .bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global deFinitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
JAVA_HOME="/usr/lib/jvm/jre-1.7.0-openjdk.x86_64"
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH

export CATALINA_HOME="apache-tomcat-8.0.18"

Java版本

java -version
java version "1.7.0_75"
OpenJDK Runtime Environment (rhel-2.5.4.0.el6_6-x86_64 u75-b13)
OpenJDK 64-Bit Server VM (build 24.75-b04,mixed mode)
root@server [/opt/apache-tomcat-8.0.18/bin]# 

O / S

Linux server.myproject.com 2.6.32-220.13.1.el6.x86_64 #1 SMP Tue Apr 17 
23:56:34 BST 2012 x86_64 x86_64 x86_64 GNU/Linux
最佳答案
Tomcat startup.sh脚本使用$CATALINA_HOME查找setclasspath.sh,这是启动失败的原因.因此,$CATALINA_HOME需要是tomcat安装目录的绝对路径,例如

export CATALINA_HOME =“/ opt / apache-tomcat-8.0.18”

如果您计划再次升级,可以考虑将$CATALINA_HOME设置为/ opt / tomcat,然后创建从/ opt / tomcat到/opt/apache-tomcat-8.0.18的符号链接或者您最终安装的任何未来版本.由于您可能有多个环境变量指向您的tomcat目录,因此在更新引用时会为您提供单个更改点.

ln -nsf /opt/apache-tomcat-8.0.18 / opt / tomcat

Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项(tomcat8为例)

Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项(tomcat8为例)

安装Tomcat

下载Tomcat压缩包

Tomcat有Tomcat7,Tomcat8和Tomcat9等版本,目前企业使用较多的是Tomcat8,所以这里以Tomcat8为列

进入Tomcat8下载网址:Tomcat8下载网址https://tomcat.apache.org/download-80.cgi

点击左侧Download下的对应版本,这里我下载的是apache-tomcat-8.5.47.tar.gz,即Linux环境的压缩包

Tomcat主要有三个安装版本

  • tar.gz:Linux环境下的压缩包,免安装
  • Windows.zip:Windows压缩包,免安装,解压即用,同时注意根据自己电脑是64位系统还是32位系统下载对应的压缩包
  • Windows Service Installer:Windows安装包,32位和64位版本的Windows系统都适用

安装Tomcat

将下载好的apache-tomcat-8.5.47.tar.gz放到指定目录,我这里放到/usr/local/tomcat,如下图所示

进入/usr/local/tomcat目录,解压Tomcat压缩包

# 进入/usr/local/tomcat目录
cd /usr/local/tomcat
# 解压Tomcat压缩包
tar -zxvf apache-tomcat-8.5.47.tar.gz

启动Tomcat

进入Tomcat的bin目录,启动Tomcat

# 进入Tomcat的bin目录,启动Tomcat
cd apache-tomcat-8.5.47/bin/
# 启动Tomcat
./startup.sh

查看Tomcat是否启动成功

# 查看Tomcat是否启动成功执行
ps -ef | grep tomcat
# 如果输出如下,说明Tomcat安装成功
root  2381  1 11 22:18 pts/0 00:00:02 /usr/local/jdk1.8.0_152/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/apache-tomcat-8.5.47/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/apache-tomcat-8.5.47/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.47/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat/apache-tomcat-8.5.47 -Dcatalina.home=/usr/local/tomcat/apache-tomcat-8.5.47 -Djava.io.tmpdir=/usr/local/tomcat/apache-tomcat-8.5.47/temp org.apache.catalina.startup.Bootstrap start
root  2513 29060 0 22:18 pts/0 00:00:00 grep --color=auto tomcat

使用浏览器访问Tomcat,地址Linux的ip:8080,我这里的ip端口是http://47.106.106.158:8080/,如下图说明在Linux(CentOS7)环境安装启动Tomcat成功,为自己点一个赞

注意:开放8080端口或者关闭防火墙

附加:开放8080端口或者关闭防火墙,如果是阿里云只能在阿里云控制台配置开放端口

# 开启8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 查询端口号8080是否开启
firewall-cmd --query-port=8080/tcp
# 重启防火墙
firewall-cmd --reload
# 查看开放端口列表
firewall-cmd --list-port
# 命令含义
--zone #作用域
--add-port=8080/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
# 关闭防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

设置Tomcat为开机启动项

按照上面的方式启动Tomcat,如果我们的虚拟机或者服务器关闭了,重启服务器后Tomcat是关闭的,但是我们希望虚拟机或者服务器重启后,Tomcat可以自己启动,所以我们需要设置Tomcat为开机启动项

创建setenv.sh文件,为Tomcat添加启动参数

catalina.sh在执行的时候会调用同级路径下的setenv.sh来设置额外的环境变量,因此在/usr/local/tomcat/apache-tomcat-8.5.47/bin路径下创建setenv.sh文件,内容如下:

# 设置Tomcat的PID文件
CATALINA_PID="$CATALINA_BASE/tomcat.pid"
# 添加JVM选项
JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"

/usr/local/tomcat/apache-tomcat-8.5.47/bin/catalina.sh文件开头添加JAVA_HOME和JRE_HOME,其中/usr/local/jdk1.8.0_152为jdk的安装目录

export JAVA_HOME=/usr/local/jdk1.8.0_152
export JRE_HOME=/usr/local/jdk1.8.0_152/jre

如果在catalina.sh不配置JAVA_HOME和JRE_HOME就会报如下的错误

[root@JourWon ~]# systemctl status tomcat
● tomcat.service - Tomcat
 Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since Mon 2019-10-21 19:54:54 CST; 6s ago
 Process: 8746 ExecStart=/usr/local/tomcat/apache-tomcat-8.5.47/bin/startup.sh (code=exited, status=1/FAILURE)

Oct 21 19:54:54 JourWon systemd[1]: Starting Tomcat...
Oct 21 19:54:54 JourWon startup.sh[8746]: Neither the JAVA_HOME nor the JRE_...d
Oct 21 19:54:54 JourWon startup.sh[8746]: At least one of these environment ...m
Oct 21 19:54:54 JourWon systemd[1]: tomcat.service: control process exited,...=1
Oct 21 19:54:54 JourWon systemd[1]: Failed to start Tomcat.
Oct 21 19:54:54 JourWon systemd[1]: Unit tomcat.service entered failed state.
Oct 21 19:54:54 JourWon systemd[1]: tomcat.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

在/usr/lib/systemd/system路径下添加tomcat.service文件,内容如下:

[Unit]
Description=Tomcat
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
TimeoutSec=0
PIDFile=/usr/local/tomcat/apache-tomcat-8.5.47/tomcat.pid
ExecStart=/usr/local/tomcat/apache-tomcat-8.5.47/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

此外service文件修改后需要调用systemctl daemon-reload命令重新加载。

配置TimeoutSec=0的目的是让开机启动不处理tomcat启动超时,保证tomcat耗时过长时不会被系统terminating,如果不配置可能出现下面的情况

Oct 21 20:26:37 JourWon startup.sh[1634]: Existing PID file found during start.
Oct 21 20:26:37 JourWon startup.sh[1634]: Removing/clearing stale PID file.
Oct 21 20:26:37 JourWon startup.sh[1634]: Tomcat started.
Oct 21 20:26:37 JourWon systemd[1]: PID file /usr/local/tomcat/apache-tomcat-8.5.47/tomcat.pid not readable (yet?) after start.
Oct 21 20:26:38 JourWon polkitd[464]: Unregistered Authentication Agent for unix-process:1628:19013 (system bus name :1.23, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, loca
Oct 21 20:28:07 JourWon systemd[1]: tomcat.service start operation timed out. Terminating.
Oct 21 20:28:07 JourWon systemd[1]: Failed to start Tomcat.

把Tomcat加入开机自启动

systemctl enable tomcat.service

重启服务器

reboot

再次连接后,查看服务状态

[root@JourWon ~]# systemctl status tomcat
● tomcat.service - Tomcat
 Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
 Active: activating (start) since Mon 2019-10-21 20:12:19 CST; 8s ago
 Process: 9244 ExecStart=/usr/local/tomcat/apache-tomcat-8.5.47/bin/startup.sh (code=exited, status=0/SUCCESS)
 CGroup: /system.slice/tomcat.service
   └─9255 /usr/local/jdk1.8.0_152/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/apache-tomcat-8.5.47/conf/logging.properties -Djava.util.logging.manager=org.apac...

Oct 21 20:12:19 JourWon systemd[1]: Starting Tomcat...
Oct 21 20:12:19 JourWon startup.sh[9244]: Existing PID file found during start.
Oct 21 20:12:19 JourWon startup.sh[9244]: Removing/clearing stale PID file.
Oct 21 20:12:19 JourWon startup.sh[9244]: Tomcat started.
Oct 21 20:12:19 JourWon systemd[1]: PID file /usr/local/tomcat/apache-tomcat-8.5.47/tomcat.pid not readable (yet?) after start.

查看开机启动列表命令

systemctl list-unit-files | grep enabled

查看Tomcat是否设置为开机启动项,如果显示为enabled,说明设置成功

参数说明

  • static:表示该服务与其他服务相关联,不能单独设置该服务的启动状态
  • disabled:表示禁止开机启动
  • enabled:表示允许开机启动
[root@JourWon ~]# systemctl list-unit-files | grep tomcat
tomcat.service        enabled

总结

以上所述是小编给大家介绍的Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项(tomcat8为例),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

您可能感兴趣的文章:
  • 阿里云服务器linux系统搭建Tomcat部署Web项目
  • Linux云服务器安装JDK和Tomcat的详细步骤(推荐)
  • 阿里云服务器安装配置tomcat 添加外网访问端口的教程
  • Linux CentOS下安装Tomcat9及web项目的部署
  • centos6配置tomcat8开机自启动脚本
  • Centos8.2云服务器环境安装Tomcat8.5的详细教程

linux安装的是tomcat7,打开tomcat管理界面发现是tomcat6

linux安装的是tomcat7,打开tomcat管理界面发现是tomcat6

linux安装的是tomcat7,打开tomcat管理界面发现是tomcat6?

今天关于记一次升级Tomcat记一次升级仪式的介绍到此结束,谢谢您的阅读,有关3.1. 从零开始学 springboot - 记一次 tomcat7 报错、java – 如何在linux上升级Tomcat、Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项(tomcat8为例)、linux安装的是tomcat7,打开tomcat管理界面发现是tomcat6等更多相关知识的信息可以在本站进行查询。

本文标签: