centos tomcat 启动,如何启动tomcat
今天给各位分享centos tomcat 启动的知识,其中也会对如何启动tomcat进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
CentOS 7 下Tomcat启动超慢的原因及解决方案
CentOS 7系统中安装好openjdk和Tomcat后,启动过程很慢,长达数分钟,日志如下:
tomcat启动耗时278084ms折合278秒,对于刚刚安装的干净tomcat,这肯定是不对劲的。
其中有一条日志引起了笔者的注意:
显然tomcat执行到这里时出问题了,google了一下,经过一番搜索明白了其中的缘由。
在tomcat官方wiki文档的 HowToFasterStartUp章节中,Entropy Source部分有一段这样的说明:
从这里我们得知Tocmat的Session ID是通过SHA1PRNG算法计算得到的,计算Session ID的时候必须有一个密钥,为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥,它强依赖于获取熵池中的随机数来进行创建。
那么什么是/dev/random?什么是熵池?
/dev/random
从维基百科得知,在UNIX操作系统(包括类UNIX系统)中,/dev/random是一个特殊的设备文件,可以用作随机数生成器或伪随机数生成器。
Linux内核中的是第一个以背景噪声产生真正的随机数产生的实现,它允许程序访问来自设备驱动程序或其它来源的背景噪声。
Linux上有两个通用的随机设备:/dev/random和/dev/urandom。其中/dev/random的随机性最好,因为它是一个阻塞的设备。而/dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数生成器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。所以它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
熵池
熵池本质上是若干字节,/proc/sys/kernel/random/entropy_avail中存储了熵池现在的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量,单位都是bit。如果 entropy_avail的值小于要产生的随机数bit数,那么/dev/random就会堵塞。
为什么熵池不够用?
熵池实际上是从各种noice source中获取数据,noice source可能是键盘事件、鼠标事件、设备时钟中等。linux内核从2.4升级到2.6时,处于安全性的考虑,废弃了一些source。source减少了,熵池补给的速度当然也变慢,进而不够用。
其实,通过消耗熵池,可以构造DDOS攻击。原理很简单,熵池空了,依赖随机数的业务(SSL,加密等)就不能正常进行。
通过以上信息,笔者得知该问题是由于熵池不足导致的。怎么解决?
使用非阻塞性的生成器/dev/urandom代替/dev/random。
1、可在JVM环境中配置
通过配置发生器指定熵收集守护进程
修改$JAVA_PATH/jre/lib/security/java.security中参数 securerandom.source为:
2、也可在Tomcat环境中配置
通过配置JRE使用非阻塞的Entropy Source获取熵
在$TOMCAT_HOME/bin/catalina.sh中加入:
这个系统属性egd表示熵收集守护进程(entropy gathering daemon)。
1、[硬件随机数生成器]安装并使用rng-tools作为额外的熵随机数生成器(推荐)
cat/dev/random命令会消耗熵池, rngd守护进程会补充熵池,可使用如下命令来测试随机数生成的情况:
2、[软件随机数生成器]在rng-tools仍不满足的情况下,可使用haveged作为额外的熵随机数生成器
要检查是否需要 Haveged,可使用下面命令查看当前收集到的熵:
如果结果比较低(<1000),建议安装 haveged,否则加密程序会处于等待状态,直到系统有足够的熵。
安装 haveged之后,可以再次查看系统熵看下有无提升。
因为方法一存在一定的不安全性,且需要对环境进行配置,为了满足熵的需要,这里笔者选择了第二种方法,使用rng-tools作为额外的熵随机数生成器,同以上操作后顺利解决了问题。
操作后重启tomcat日志如下,启动速度快了两个数量级:
参考文档:
centos怎样编写tomcat宕机自动重新启动
一、设置tomcat定时启动
1,首先将tomcat注册为服务,先打开tomcat的bin目录下service.bat文件,修改下面的值,这是sevvice的注册名称和显示名称,一般可使用默认值。
set SERVICE_NAME=Tomcat7
set PR_DISPLAYNAME=Apache Tomcat
【然后修改jvm大小,搜索到--JvmMs 128--JvmMx 256进行修改,因为做成服务启动,启动的时候就不会用到 catalina.bat,也就不会读取里面的jvm设置了。】(可选,可以不设置)
然后运行cmd命令窗口,cd到tomcat的bin目录下,运行下面的命令
service.bat install运行成功过后,会提示服务已经安装成功。
2,制作重启脚本restart.bat,文件内容如下
net stop Tomcat7 net start Tomcat7
3,利用控制面板里面的“任务计划”设置第2步的脚本运行时间计划
4,如果想删除服务,也很简单,先把服务停掉,然后在cmd窗口运行下面的命令即可,后面那个Tomcat7是服务名。
sc delete Tomcat7
需要注意的是,需要先把服务停掉,才能一次删除成功,或者删除之后再停止服务,就会发现服务已经删除成功了。
二、监听tomcat
只要运行start.bat即可,相关配置在config.properties文件中,默认即可,如果服务名不对应就修改关闭和启动命令的服务名即可:net start【Tomcat7】括号中服务名,然后运行start.bat
下面是具体的监听代码:
首先是监听类TomcatMonitor.java:
[java] view plain copy
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;
/**
*@describe:TomcatMonitor.java
*
*@date 2016-7-4
*@author liuweilong
*/
public class TomcatMonitor implements Runnable{
String start="";//系统命令启动
String stop="";//系统命令关闭
String testHttp="";//测试连接地址
int testIntervalTime=1;//测试连接间隔时间,单位为秒
int waitIntervalTime=2;//等待测试间隔时间,单位为秒
int testTotalCount=5;//测试连接总次数
Thread thread=null;
public TomcatMonitor(){
InputStream in= TomcatMonitor.class.getResourceAsStream("config.properties");
Properties p= new Properties();
try{
p.load(in);
stop=p.getProperty("stop");
start=p.getProperty("start");
testHttp=p.getProperty("testHttp");
testIntervalTime=Integer.parseInt(p.getProperty("testIntervalTime"));
waitIntervalTime=Integer.parseInt(p.getProperty("waitIntervalTime"));
testTotalCount=Integer.parseInt(p.getProperty("testTotalCount"));
} catch(Exception e){
e.printStackTrace();
}
System.out.println("*******************初始化成功!*******************");
thread=new Thread(this);
thread.start();
}
public void run(){
System.out.println("正在监控中...");
int testCount=0;
while(true){
testCount=0;
testCount++;
boolean isrun=test();
System.out.println("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false?"失败.":"成功!"));
while(!isrun){
if(testCount>=testTotalCount)break;
try{
thread.sleep(testIntervalTime*1000);
} catch(InterruptedException e){
e.printStackTrace();
}
testCount++;
System.out.println("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false?"失败.":"成功!"));
isrun=test();
}
if(!isrun){
try{
//关闭tomcat服务
Process proc= Runtime.getRuntime().exec(stop);
thread.sleep(5000);
//启动tomcat服务
System.out.println("测试连接失败,正在重启tomcat");
Process p=Runtime.getRuntime().exec(start);
System.out.println("重启tomcat成功");
}catch(Exception e){
e.printStackTrace();
System.out.println("重启tomcat异常,请查看先关错误信息。。。。。");
}
}
try{
thread.sleep(waitIntervalTime*1000);
} catch(InterruptedException e){
e.printStackTrace();
}
isrun=test();
}
}
public boolean test(){
URL url=null;
try{
url= new URL(testHttp);
} catch(MalformedURLException e){
e.printStackTrace();
}
try{
URLConnection urlConn=url.openConnection();
urlConn.setReadTimeout(15000);
BufferedReader reader= new BufferedReader(new InputStreamReader( urlConn.getInputStream()));//实例化输入流,并获取网页代码
String s;
while((s= reader.readLine())!= null){
return true;
}
} catch(Exception e){
return false;
}
return false;
}
public static void main(String[] args) throws Exception{
TomcatMonitor tm=new TomcatMonitor();
}
}
然后是对应的配置文件config.properties:
[plain] view plain copy
#系统命令启动
start=net start Tomcat7
#关闭
stop= net stop Tomcat7
#测试连接总次数
testTotalCount=3
#连接失败时,再次检测时间间隔,单位为秒
testIntervalTime=3
#连接超时时间,即多少秒tomcat没响应视为宕机,单位为秒
connectionTimeout=15
#tomcat启动时间,防止在tomcat尚未启动完成的时候,程序又去检验tomcat状态,造成尚未启动完成又重新启动,单位为秒
tomcatStartTime=600
#测试连接地址
testHttp=
#正常情况下,每次检测间隔时间,单位为秒
waitIntervalTime=30
最后是启动的start.bat:
[plain] view plain copy
java-cp. TomcatMonitor
centos tomcat 无法启动
先给你解决这个问题,其实要告诉你,要学习搜索。网上大把的资料。这样会不断解决新问题。
要学习解决问题的方法。
此外另一个话题是:OPenjdk和SUnJDK的区别。一个是开源社区,一个是公司产品,代码多数一样。OPen是社区版,某些功能减少,版本授权不一样。通常使用中一般使用官方JDK较多。
特别在国内,对版权的问题基本上是无视的。
-----------------------------
1,Centos中的Service,就启动某个程序,并且开机能自动运行。通过这个脚本文件放置在
/etc/init.d/tomcat
2,即使是启动脚本,程序执行是要可以的。所以说,你直接在Tomcat的bin/下是可以执行启动程序的。
这里执行成功了,才能用脚本来启动,
这里执行不成功,需要通过日志来定位问题。原因,权限不对,路径不对,etc.
3,启动脚本,正确的启动脚本是根据你的安装环境来定的,通常有的应用程序在编辑安装或者YUm安装或者RPM安装就是准备好了启动脚本,Tomcat可能没有。在源码安装的方式下:
这时,你要搜索网上的。对比一下。结合你安装的路径。
下面是我写的一个启动脚本,根据上次回答你给你路径而写的。你尝试一下。
保存成tomcat文件,然后放置/etc/init.d/替换现有的。
#chmod+x/etc/init.d/tomcat
#chkconfig tomcat on
+++++++++++++++++++++++++
#!/bin/bash
# build this file in/etc/rc.d/init.d/svn
# chmod 755/etc/rc.d/init.d/svn
# chkconfig: 2345 62 52
# that answers incoming ftp service requests.
# processname:Tomcat
# Source function library.
./etc/rc.d/init.d/functions
# Source networking configuration.
./etc/sysconfig/network
# centos6.2 Tomcat: service tomcat start(restart/stop/status)
Tomcat_Home=/usr/local/tomcat
ProgPath=/usr/local/tomcat/bin
tomcat=`/bin/ps-A|grep java|awk'{print$4}'`
Prog=tomcat
if [!-f"$ProgPath/startup.sh" ]
then
echo"can not find tomcat,please install it!!"
exit
fi
case"$1" in
start)
if [-x$ProgPath/startup.sh ];then
if ["$tomcat"="java" ];then
echo"Tomcat Server is running!!!"
exit
fi
echo-n$"Starting tomat Server:"
daemon$ProgPath/startup.sh
echo
else
echo"Have no right for running server"
fi
;;
stop)
if ["$tomcat"="" ];then
echo"Tomcat server have already stop!!!"
else
echo-n$"Stoping Tomcat Server:"
daemon$ProgPath/shutdown.sh
killproc$tomcat
echo
fi
;;
restart)
if ["$tomcat"="java" ];then
$0 stop
sleep 7
$0 start
else
$0 start
fi
;;
status)
ps-A|awk'{if($4=="java"){print"Tomcat is running..."}}'
if ["$tomcat"=="" ];then
echo"Tomcat is sleeping.."
exit 0
fi
;;
*)
echo"Usage: tomcat{ start| stop| restart| status}"
exit 1
esac