一、下载并安装jdk
到oracle官网下载jdk,然后上传到CentOS上。
1
2
3
4
5
6
7
|
cd
/opt/tools/
[root@mylinux1 tools]
# ll jdk-8u101-linux-i586.tar.gz apache-tomcat-7.0.72.tar.gz
-rw-r--r-- 1 root root 8931288 Sep 14 20:39 apache-tomcat-7.0.72.
tar
.gz
-rw-r--r-- 1 root root 183456778 Oct 4 20:19 jdk-8u101-linux-i586.
tar
.gz
tar
-zxf jdk-8u101-linux-i586.
tar
.gz
mv
jdk1.8.0_101
/usr/local/jdk
chown
-R root:root
/usr/local/jdk
|
下面配置JAVA环境变量:
1
2
3
4
5
6
7
|
echo
'#Add java env below'
>>
/etc/profile
echo
'export JAVA_HOME=/usr/local/jdk'
>>
/etc/profile
echo
'export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HOME/bin:$PATH'
>>
/etc/profile
echo
'export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar'
>>
/etc/profile
echo
'export TOMCAT_HOME=/usr/local/tomcat'
>>
/etc/profile
echo
'#java env ended'
>>
/etc/profile
source
/etc/profile
|
[root@mylinux1 tools]# tail -6 /etc/profile
#Add java env below
export JAVA_HOME=/usr/local/jdk
export PATH=JAVAHOME/bin:JAVA_HOME/jre/bin:HOME/bin:PATH
export CLASSPATH=CLASSPATH:JAVA_HOME/lib:JAVAHOME/jre/lib:JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
#java env ended
测试是否安装成功:
[root@mylinux1 tools]# echo $JAVA_HOME
/usr/local/jdk
[root@mylinux1 tools]# java -version
-bash: /usr/local/jdk/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解决方法:
yum -y install ld-linux.so.2
[root@mylinux1 tools]# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) Client VM (build 25.101-b13, mixed mode)
[root@mylinux1 tools]# jps -lvm
1180 sun.tools.jps.Jps -lvm -Denv.class.path=:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar -Dapplication.home=/usr/local/jdk -Xms8m
二、安装tomcat
1
2
3
4
|
wget http:
//mirrors
.cnnic.cn
/apache/tomcat/tomcat-7/v7
.0.72
/bin/apache-tomcat-7
.0.72.
tar
.gz
tar
-zxf apache-tomcat-7.0.72.
tar
.gz
mv
apache-tomcat-7.0.72
/usr/local/tomcat
chown
-R root:root
/usr/local/tomcat/
|
三、启动tomcat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@mylinux1 tools]
# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:
/usr/local/tomcat
Using CATALINA_HOME:
/usr/local/tomcat
Using CATALINA_TMPDIR:
/usr/local/tomcat/temp
Using JRE_HOME:
/usr/local/jdk
Using CLASSPATH:
/usr/local/tomcat/bin/bootstrap
.jar:
/usr/local/tomcat/bin/tomcat-juli
.jar
Tomcat started.
[root@mylinux1 tools]
# lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE
/OFF
NODE NAME
java 1266 root 46u IPv6 13514 0t0 TCP *:webcache (LISTEN)
[root@mylinux1 tools]
# netstat -lnt|grep 8080
tcp 0 0 :::8080 :::* LISTEN
[root@mylinux1 tools]
# ps -ef|grep java
root 1266 1 2 21:33 pts
/0
00:00:05
/usr/local/jdk/bin/java
-Djava.util.logging.config.
file
=
/usr/local/tomcat/conf/logging
.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.
dirs
=
/usr/local/tomcat/endorsed
-classpath
/usr/local/tomcat/bin/bootstrap
.jar:
/usr/local/tomcat/bin/tomcat-juli
.jar -Dcatalina.base=
/usr/local/tomcat
-Dcatalina.home=
/usr/local/tomcat
-Djava.io.tmpdir=
/usr/local/tomcat/temp
org.apache.catalina.startup.Bootstrap start
root 1298 1052 0 21:36 pts
/0
00:00:00
grep
java
|
打开浏览器,输入http://localhost:8080访问,可以看到tomcat的默认页面。
四、tomcat配置文件
[root@mylinux1 tomcat]# ll logs/
total 24
-rw-r--r-- 1 root root 5300 Oct 4 21:33 catalina.2016-10-04.log #命令行输出日志
-rw-r--r-- 1 root root 5300 Oct 4 21:33 catalina.out
-rw-r--r-- 1 root root 0 Oct 4 21:33 host-manager.2016-10-04.log #jvm虚拟机管理日志
-rw-r--r-- 1 root root 445 Oct 4 21:33 localhost.2016-10-04.log #访问日志
-rw-r--r-- 1 root root 908 Oct 4 21:39 localhost_access_log.2016-10-04.txt
-rw-r--r-- 1 root root 0 Oct 4 21:33 manager.2016-10-04.log #管理日志
[root@mylinux1 tomcat]# ll conf/
total 208
drwxr-xr-x 3 root root 4096 Oct 4 21:33 Catalina
-rw------- 1 root root 12257 Sep 14 20:15 catalina.policy
-rw------- 1 root root 6322 Sep 14 20:15 catalina.properties
-rw------- 1 root root 1394 Sep 14 20:15 context.xml
-rw------- 1 root root 3288 Sep 14 20:15 logging.properties
-rw------- 1 root root 6613 Sep 14 20:15 server.xml
-rw------- 1 root root 1950 Sep 14 20:15 tomcat-users.xml
-rw------- 1 root root 167655 Sep 14 20:15 web.xml
下面是一个tomcat配置文件的示例,附上对参数的解析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<!-- Server中的port监听关闭tomcat的请求,
shutdown
指定向端口发送的命令串-->
<Server port=
"8005"
shutdown
=
"SHUTDOWN"
debug=
"0"
>
<Listener className=
"org.apache.catalina.mbeans.ServerLifecycleListener"
debug=
"0"
/>
<Listener className=
"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
debug=
"0"
/>
<GlobalNamingResources>
<Environment name=
"simpleValue"
type
=
"java.lang.Integer"
value=
"30"
/>
<Resource name=
"UserDatabase"
auth=
"Container"
type
=
"org.apache.catalina.UserDatabase"
description=
"User database that can be updated and saved"
>
<
/Resource
>
<ResourceParams name=
"UserDatabase"
>
<parameter>
<name>factory<
/name
>
<!--value与Logger差不多prefix和suffix解释一样,className指定value使用的类名如:org.apache.catalina.values.AccessLogValve类可以记录应用程序的访问信息,directory指定log 文件存放位置,pattern有两值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。 combined方式比common记录更多-->
<value>org.apache.catalina.
users
.MemoryUserDatabaseFactory<
/value
>
<
/parameter
>
<parameter>
<name>pathname<
/name
>
<value>conf
/tomcat-users
.xml<
/value
>
<
/parameter
>
<
/ResourceParams
>
<
/GlobalNamingResources
>
<Service name=
"Catalina"
>
<!-- Connector中的port创建服务器端的端口号,此端口监听用户端的请求
maxThreads最大可以创建请求的线程数
minSpareThreads服务启动时创建的处理请求的进程数
enableLookups如果为
true
,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为
false
则不进行DNS查询,而是返回其ip地址
redirectPort指定服务器正在处理http请求时收到一个SSL传输请求后重定向的端口号
acceptCount指定当处理请求线程都被使用时,可以放入处理队列的数目,超出将不进行处理
connectionTimeout指定超时的时间数(毫秒)-->
<Connector port=
"80"
maxThreads=
"150"
minSpareThreads=
"25"
maxSpareThreads=
"75"
enableLookups=
"false"
redirectPort=
"8443"
acceptCount=
"100"
debug=
"0"
connectionTimeout=
"20000"
disableUploadTimeout=
"true"
/>
<Connector port=
"8009"
enableLookups=
"false"
redirectPort=
"8443"
debug=
"0"
protocol=
"AJP/1.3"
/>
<!--Engine指定缺省的处理请求主机名,需要有一个与host元素的name属性一致-->
<Engine name=
"Catalina"
defaultHost=
"localhost"
debug=
"0"
>
<!--logger中表示日志信息className为指定logger使用的类名此类必须实现 org.apache.catalina.Logger接口prefix指定log文件的前缀,suffix指定后缀,timestamp如果为
true
则log文件名中加入时间-->
<Logger className=
"org.apache.catalina.logger.FileLogger"
prefix=
"catalina_log."
suffix=
".txt"
timestamp=
"true"
/>
<!--Realm存放用户名密码及role数据库,className指定Realm使用的类名必须实现org.apache.catalina.Realm接口-->
<Realm className=
"org.apache.catalina.realm.UserDatabaseRealm"
debug=
"0"
resourceName=
"UserDatabase"
/>
<!--host中name是指定的主机名或ip,appBase应用程序目录,unpackWARs如果为
true
则会自动解压war文件直接运行否则不解压-->
<Host name=
"192.168.4.247"
debug=
"0"
appBase=
"D:/project/hbgs_dddu/webapps"
unpackWARs=
"true"
autoDeploy=
"true"
xmlValidation=
"false"
xmlNamespaceAware=
"false"
>
<!--logger中表示日志信息className为指定logger使用的类名此类必须实现 org.apache.catalina.Logger接口prefix指定log文件的前缀,suffix指定后缀,timestamp如果为
true
则log文件名中加入时间-->
<Logger className=
"org.apache.catalina.logger.FileLogger"
directory=
"logs"
prefix=
"localhost_log.zx"
suffix=
".txt"
timestamp=
"true"
/>
<!--Context一个web应用程序通常为war文件,关于war的具体信息见servlet规范,docBase应用程序的路径或者war 文件的存放路径,path表示此web程序的url前缀,reloadable如果为
true
,Tomcat会自动检测应用程序的变化,自动装载新的应用程序,那么改变代码将不用再次重新启动tomcat-->
<Context path=
""
docBase=
"D:/project/hbgs_dddu/webapps"
debug=
"0"
reloadable=
"true"
/>
<
/Host
>
<
/Engine
>
<
/Service
>
<
/Server
>
|
五、配置tomcat管理用户
cd /usr/local/tomcat/conf/
vi tomcat-users.xml
添加如下内容:
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
然后重启tomcat服务:
../bin/shutdown.sh
../bin/startup.sh
浏览器访问:
打开tomcat默认页面,然后选择“Manager Appp”,然后在弹出的身份认证窗口中输入之前设置的密码,进行登录。
这个就是tomcat的管理界面,有很多配置和管理相关的操作接口,由于安全性的问题,一般在服务器上也不会启动管理界面,所以这里只是了解一下。
六、tomcat安全设置
1、Telnet管理端口保护
server.xml中默认有如下一行:
<Server port="8005" shutdown="SHUTDOWN">
这样允许任何人只要Telnet到服务器的8005端口,输入“SHUTDOWN”,回车,服务器就被关掉了。
安全设置: 1)修改默认的8005管理端口为其他端口(大于1024)
2)修改SHUTDOWN指令为其他字符串
示例配置:<Server port="8205" shutdown="c1gstudio"> 这样的话,只有Telnet到服务器的8205端口,输入“c1gstudio”回车,才能关闭tomcat。
2、禁用管理端
Tomcat管理台的应用文件,默认在{Tomcat安装目录}\server\webapps下,有admin和manager两个应用。
其用户密码,在{Tomcat安装目录}\conf/tomcat-users.xml中定义。在{Tomcat安装目录}\webapps下
admin.xml和manager.xml文件定义了可以通过访问/admin和/manager进入。
默认情况下,完全可以登录tomcat管理台,造成严重安全问题
安全设置: 1)删除默认的tomcat安装目录下的conf/tomcat-users.xml文件,重启tomcat后会自动生成新的文件。
2)删除tomcat安装目录下webapps初始化的所有目录和文件。
示例配置:<Context path="" docBase="/home/tomcat/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true" />
3、文件列表访问控制
tomcat的安装目录下的conf/web.xml文件中的default部分有listings的配置。
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
false为不列出目录文件,true为允许列出,默认为false。
4、隐藏版本信息
在配置中对一些常见错误进行重定向,避免当出现错误时tomcat默认显示的错误页面暴露服务器和版本信息。
安全设置: 1)修改conf/web.xml,重定向403、404以及500等错误到指定的错误页面
2)也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向。
示例配置:
用记事本打开\conf\web.xml文件,在文件的倒数第二行(一行之前)加入以下内容:
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>
注意:必须确保程序根目录下的错误页面已经存在。
5、Server header重写
安全设置:在HTTP Connector配置中加入server的配置。
示例配置: server="webserver"
说明:当tomcat HTTP端口直接提供web服务时,此配置生效。加入此配置,将会替换http响应server header部分的默认配置,默认是Apache-Coyote/1.1。
6、访问限制
通过配置信任ip的白名单,拒绝非白名单ip的访问,此配置主要是针对高保密级别的系统,一般产品不需要。
安全设置:通过配置限定访问的ip来源
示例配置:
<Context path="" docBase=/home/tomcat/tomcat" debug="0" reloadable="false" crossContext="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="202.96.181.210,202.110.151.*" deny="*.*.*.*" />
</Context>
7、启停脚本权限回收
安全设置:去除其他用户对tomcat的bin目录下shutdown.sh、startup.sh以及catalina.sh的可执行权限。
示例配置:chmod -R 744 tomcat/bin/*
8、访问日志格式规范
安全设置:开启tomcat默认访问日志中的Referer和User-Agent记录
示例配置:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/>
说明:开启Referer和User-Agent为了一旦出现安全问题能够更好的根据日志进行问题排查。
9、关闭8009端口
8009/tcp open ajp13
安全设置:8009端口是tomcat和apache的mod_proxy_ajp,mod_jk沟通的端口,没有用到就关了。
配置示例:
tomcatpath/conf/server.xml 中的这段注释掉
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
10、增加防火墙
更安全的方式是同时增加防火墙,来限制访问Tomcat的控制与连接器端口
你可以通过运行netstat -a来查看网络服务器socket及其他现有连接的清单
插入规则
iptables -A INPUT -p tcp -m tcp --dport 8005 -j DROP
保存规则
service iptables save
重载规则
service iptables restart
七、tomcat优化
1、在bin/catalina.bat文件中加入下面参数,对JVM进行优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
set
JAVA_OPTS=
-server
-Xms4000M
-Xmx4000M
#-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
-Xmn600M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-Xss256K
-XX:+DisableExplicitGC
-XX:SurvivorRatio=1
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:LargePageSizeInBytes=128M
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Djava.awt.headless=
true
-Xloggc:log
/gc
.log
|
效果:
系统响应时间增快
JVM回收速度增快同时又不影响系统的响应率
JVM内存最大化利用
线程阻塞情况最小化
2、Tomcat连接参数的优化,主要是针对吞吐量做优化:
修改conf/server.xml文件,把原来
<Connector port="8080" protocol="HTTP/1.1" />
改成下面的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<Connector port=
"8080"
protocol=
"HTTP/1.1"
URIEncoding=
"UTF-8"
minSpareThreads=
"25"
maxSpareThreads=
"75"
enableLookups=
"false"
disableUploadTimeout=
"true"
connectionTimeout=
"20000"
acceptCount=
"300"
maxThreads=
"300"
maxProcessors=
"1000"
minProcessors=
"5"
useURIValidationHack=
"false"
compression=
"on"
compressionMinSize=
"2048"
compressableMimeType=
"text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort=
"8443"
/>
|
八、JVM故障排除方法(例)
处理步骤:
1)jps 获取Java进程的PID
2)jstack pid >> java.txt导出占用高进程的线程栈
3)top -H -p PID 查看对应进程的哪个线程占用CPU过高
4)echo "obase=16; PID" |bc 将线程的PID转换为16进制
5)在第二步导出的java.txt中查找转换成为16进制的线程PID,找到对应的线程栈
6)分析负载高的线程栈都是什么业务操作,优化程序并处理问题(开发的工作)。
本文转自 jerry1111111 51CTO博客,原文链接:http://blog.51cto.com/jerry12356/1858762,如需转载请自行联系原作者