一、搭建JDK环境
通常情况下CentOS 7自带的JDK为OpenJDK,不同于Oracel SUN JDK,为了与在PC上保持相同的JDK配置方式及使用习惯,可替换为Oracle SUN JDK。
(1)卸载OpenJDK
先通过命令查询Java相关的现有安装:
rpm -qa | grep java
结果如下:
python-javapackages-3.4.1-11.el7.noarch java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64 tzdata-java-2018e-3.el7.noarch javapackages-tools-3.4.1-11.el7.noarch java-1.8.0-openjdk-headless-1.8.0.171-8.b10.el7_5.x86_64 通过rpm -e xx(xx为上述包)逐个卸载,并再次查看发现已经下载干净,操作过程如下: [root@centos jvm]# rpm -e java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64 [root@centos jvm]# rpm -e java-1.8.0-openjdk-headless-1.8.0.171-8.b10.el7_5.x86_64 [root@centos jvm]# rpm -e tzdata-java-2018e-3.el7.noarch [root@centos jvm]# rpm -e javapackages-tools-3.4.1-11.el7.noarch [root@centos jvm]# rpm -e python-javapackages-3.4.1-11.el7.noarch [root@centos jvm]# rpm -qa |grep java [root@centos jvm]# java -version bash: /usr/bin/java: No such file or directory
(2)下载Oracle SUN JDK
到Oracle网站下载JDK(http://www.oracle.com/technetwork/java/javase/downloads/index.html),对CentOS 7选择相应版本的RPM安装包即可;
例如:jdk-8u171-linux-x64.rpm
(3)安装Oracle SUN JDK
root权限下,将下载后的版本通过rpm命令安装即可,命令示例:
rpm -ivh jdk-8u171-linux-x64.rpm
(4)验证安装
输入命令java -version即可,另外可通过ls /usr/java查看默认安装路径下的java安装版本,操作过程如下:
[root@centos_vm2 tools]# java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) [root@centos_vm2 tools]# ls /usr/java default jdk1.8.0_171-amd64 latest
(5)修改环境变量配置文件
在/etc/profile文件中添加如下几行:
#java environment export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin
后执行source /etc/profile命令使得配置生效;
二、搭建Maven开发环境
(1)下载Maven安装包
到apache网站下载maven(http://maven.apache.org/download.cgi) ,选择所需版本并下载
(2)安装Maven
建议安装目录:/usr/local/maven/,需root权限下先创建好该目录:
mkdir /usr/local/maven
先将下载的安装包解压的某个目录(笔者的安装包、安装包解压均在/var/ftp/tools/目录下):
tar -zxvf apache-maven-3.5.4-bin.tar.gz
然后复制目录到安装目录:
cp -r apache-maven-3.5.4/* /usr/local/maven/
之后可查看安装目录下的文件、目录列表:
[root@centos_vm2 tools]# ls /usr/local/maven bin boot conf lib LICENSE NOTICE README.txt
(3)修改环境变量配置文件:
在/etc/profile文件中添加环境变量MAVEN_HOME,并添加到PATH中,结合上面JAVA环境变量引起的变更,合计如下:
#java environment export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export MAVEN_HOME=/usr/local/maven export PATH=$PATH:${JAVA_HOME}/bin:${MAVEN_HOME}/bin
执行如下命令使得配置文件生效
source /etc/profile
(4)验证安装
执行mvn -v查看版本,执行echo $MAVEN_HOME查看环境变量,过程如下:
[root@centos tools]# mvn -v Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00) Maven home: /usr/local/maven Java version: 1.8.0_171, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_171-amd64/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix" [root@centos tools]# echo $MAVEN_HOME /usr/local/maven
三、搭建Tomcat环境
(1)下载Tomcat安装包
到apache网站下载Tomcat(http://tomcat.apache.org/) ,选择所需版本并下载
(2)安装Tomcat
建议安装目录/usr/local/tomcat,解压压缩包:
tar -zxvf apache-tomcat-9.0.10.tar.gz
之后将解压后的目录复制到/usr/local/tomcat,操作过程如下:
[root@centos usr]# su root [root@centos usr]# cd /usr/local [root@centos local]# mkdir tomcat [root@centos local]# cd /var/ftp/tools [root@centos tools]# cp -r apache-tomcat-9.0.10/* /usr/local/tomcat/
(3)开放Tomcat的8080服务端口
执行如下命令开放8080端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
上述命令中的参数含义:
--zone #作用域
--add-port=8080/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
然后重启防火墙:
firewall-cmd --reload
之后在/usr/local/tomcat/bin下,如需启动Tomcat服务则执行
./startup.sh
如需停止Tomcat服务则执行:
./shutdown.sh
四、将Tomcat服务化(可选步骤)
将Tomcat服务化管理在许多时候比较方便,通常包含如下几个步骤:
(1)设置环境变量、用户及组:
环境变量可以通过/etc/profile设置,也可以通过在tomcat/bin/setenv.sh进行设置:
例如,在/etc/profile中设置相关路径:
export CLASS_PATH=.:$JAVA_HOME/lib export CATALINA_HOME=/usr/local/tomcat export CATALINA_BASE=/usr/local/tomcat export PATH=$PATH:$JAVA_HOME/bin:$CATLINA_HOME:/bin
然后通过/usr/local/tomcat/bin/setenv.sh 设置运行参数,文件内容如下:
#add tomcat pid CATALINA_PID="$CATALINA_BASE/tomcat.pid" #add java opts JAVA_OPTS="-server -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=1024m -Xms512M -Xmx1024M -XX
可配置tomcat服务运行时的用户及组,并赋予相应的权限:
[root@snails ~]# getent group tomcat || groupadd -r tomcat [root@snails ~]# getent passwd tomcat || useradd -r -d /opt -s /bin/nologin -g tomcat tomcat [root@snails ~]# chown -R tomcat:tomcat /usr/local/tomcat
上述命令getent用于查询,如果没有查询到则执行||之后的命令;groupadd或者useradd之后的参数-r表示的是系统群组、系统用户;useradd之后的参数-s /bin/nologin表示该用户无法直接登录,只用于系统作业使用;
注:本部分来源参考自:https://www.jianshu.com/p/29ecd624046f
(1)服务描述文件:
用service或systemctl管理服务的时候,需先在服务管理目录(即/usr/lib/systemd/system目录,或者/lib/systemd/system目录,后者是前者的软连接)创建一个脚本文件,
vim /usr/lib/systemd/system/tomcat.service
来管理服务的启动和停止,内容示例如下:
[Unit] Description=Apache Tomcat 9 After=network.target [Service] Type=forking PIDFile=/usr/local/tomcat/tomcat.pid ExecStart=/usr/local/tomcat/bin/startup.sh ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target
上述内容中的参数说明如下:
[Unit]:服务的说明
Description:描述服务
Documentation (可选):服务文档
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式,取值有:simple、forking、oneshot、notify、dbus,其中:
> simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
> forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
> oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
> notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
> dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
PIDFile: 进程ID文件路径,对于上述tomcat的配置,相应的tomat/bin/catalina.sh需加入CATALINA_PID参数,参考方式是在脚本一开始的# OS specific support.行之前添加变更,示例如下:
# ----------------------------------------------------------------------------- CATALINA_PID=/usr/local/tomcat/tomcat.pid # OS specific support. $var _must_ be set to either true or false.
ExecStartPre (可选):启动前要做什么
ExecStart:为服务的具体运行命令
ExecReload:为重启命令,kill命令-s参数为向进程发送信号,HUP为重新运行的信号
ExecStop:为停止命令,kill命令-s参数为向进程发送信号,QUIT为退出程序的信号
User、Group(可选):为运行时所使用的用户、群组,如果没有将tomcat目录绑定到该用户,则这两个参数不要在配置中出现
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径,User、Group不指定则默认为root
[Install]服务安装的相关设置,可设置为多用户
注:本部分参考自:https://blog.csdn.net/younger_china/article/details/52539522
然后执行systemctl enable tomcat设置为开机自动启动,或者先通过tomcat/bin子目录下的shutdown.sh停掉当前运行的tomcat,然后执行systemctl start tomcat运行即可;
(2)启动阻塞超时的问题:
全新的tomcat环境,在没有运行过的情况下,tomcat/logs子目录下是没有日志文件的,第一次运行后将产生日志文件,最常见的是根据catalina.out日志文件定位问题。
Tomcat启动有时因为超时导致启动失败,常见的原因是安全随机数耗时的问题,从启动日志中看到类似如下的告警:
19-Jul-2018 22:43:02.156 WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [149,396] milliseconds. 19-Jul-2018 22:43:02.174 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [149,652] ms
这是由于在服务器环境下,系统的随机数参考环境变量比较少导致计算比较慢,解决方式有两种:
方式一:可以通过配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入这么一行:
-Djava.security.egd=file:/dev/./urandom
例如:
# Make the umask available when using the org.apache.catalina.security.SecurityListener
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
方式二:打开 $JAVA_HOME/jre/lib/security/java.security (本安装中是这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换为:
securerandom.source=file:/dev/./urandom
注:路径中间的点号是在某些版本中securerandom.source 设置为 /dev/urandom 它也仍然使用的 /dev/random,因此用了变通的方式,如果所用版本测试验证直接用securerandom.source=file:/dev/urandom能正常工作,则无需用带点号的路径;
(3)Tomcat停止时原线程、IP端口释放不彻底的问题
某些Tomcat web工程版本开发调测时发现用tomcat/bin下的shutdown.sh关闭不彻底,这时需要手工用kill 进程号才能彻底关闭掉,通常这类问题是开启的非守护线程并没有停止掉造成的,可借助几个步骤:
第一步:查看Tomcat进程号
ps -ef|grep tomcat
第二步:用JDK自带的jstack工具分析活动线程
$JAVA_HOME/bin/jstack <pid>
<pid>为具体的进程号
第三步:找到主线程main、自建线程检查是否是守护线程,如果不是,修改相应的Java代码,在类似于new Thread()的动作之后注意设置为守护线程,再重新发布版本验证;
第四步:对于IP端口号未及时释放的,为了不影响调测,临时可通过kill强制关闭进程:
kill <pid>
后续需检查自行占用端口的代码在程序退出时释放及时释放端口资源;
第五步:多个tomcat目录的实例运行,关闭失败,需要记录各个实例的进程ID,在相应的tomcat/bin/catalina.sh代码前面添加如下操作:
############# if [ -z "$CATALINA_PID" ]; then CATALINA_PID=$PRGDIR/CATALINA_PID cat $CATALINA_PID fi############
在相应的tomcat/bin/shutdown.sh中:
exec "$PRGDIR"/"$EXECUTABLE" stop "$@"
添加强制停止的参数,即:
exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"