1.安装前准备
在Tomcat官网或镜像网站下载Tomcat8.5,
官网网址:https://tomcat.apache.org/download-80.cgi
镜像网站:http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/
目前Tomcat8最新版本为8.5.59,下载地址为:
http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.59/bin/apache-tomcat-8.5.59.tar.gz
可以将其下载到服务器或者将其通过U盘复制到应用服务器上。假定apache-tomcat-8.5.59.tar.gz存放于服务器的位置为:/root/apache-tomcat-8.5.59.tar.gz
2.安装Tomcat
首先以root身份登录,然后解压apache-tomcat-8.5.59.zip。
tar -zxf/root/apache-tomcat-8.5.59.tar.gz
解压后会在/root目录下多出一个apache-tomcat-8.5.15文件夹来,然后通过下面的命令将其移动到/usr/local目录下:
mv ./apache-tomcat-8.5.59//usr/local
注意:/usr/local/apache-tomcat-8.5.59这个目录在设置Tomcat环境变量时会用到。当然,也可以不设置Tomcat相关的环境变量,使用相关脚本对Tomcat进行操作时会自动检测这些环境变量。
至此,Tomcat已经安装完成。
下面配置Tomcat有关的环境变量,在/etc/profile中添加如下内容:
exportCATALINA_HOME=/usr/local/apache-tomcat-8.5.59exportCATALINA_BASE=/usr/local/apache-tomcat-8.5.59exportPATH=$PATH:$CATALINA_HOME/bin
然后运行下面的命令使配置生效:
source /etc/profile
经过以上配置后,可以通过如下命令启动Tomcat:
/usr/local/apache-tomcat-8.5.59/bin/startup.sh
启动成功后即可在服务器上打开浏览器并输入网址http://localhost:8080查看,如下图所示:
如果要关闭Tomcat也很简单,执行如下命令:
/usr/local/apache-tomcat-8.5.59/bin/shutdown.sh
注意:使用/usr/local/apache-tomcat-8.5.59/bin/catalina.sh加上参数也可以启动或者停止Tomcat,如 /usr/local/apache-tomcat-8.5.59/bin/catalina.shstart来启动Tomcat,/usr/local/apache-tomcat-8.5.59/bin/catalina.shstop来停止Tomcat,除此之外还可以使用debug/run/configtest/version参数,不过没有restart参数来重启Tomcat。
另外还需要注意的是,如果服务器同时开启了IPv4和IPv6,Tomcat8.5可能只监听IPv6协议的8080端口,需要在/usr/local/apache-tomcat-8.5.59/bin/catalina.sh中修改参数,参数名为JAVA_OPTS,下面是例子:
修改前:
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
修改后:
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Address=true"
即增加“-Djava.net.preferIPv4Stack=true-Djava.net.preferIPv4Address=true”配置。
3.配置Tomcat为系统服务
在/usr/lib/systemd/system/目录增加tomcat.service文件,并将以下内容粘贴到新创建的tomcat.service文件:
[Unit]Description=Apache Tomcat 8.5.59After=syslog.target network.target remote-fs.target nss-lookup.target [Service]Type=forkingPIDFile=/usr/local/apache-tomcat-8.5.59/tomcat.pidExecStart=/usr/local/apache-tomcat-8.5.59/bin/startup.shExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true [Install]WantedBy=multi-user.target
然后可以执行如下命令来检验是否配置正确:
systemctl enabletomcat.service:设置tomcat这个service随系统一起启动
systemctl disabletomcat.service:禁止tomcat这个service随系统一起启动
systemctl starttomcat.service:启动tomcat这个service
systemctl stoptomcat.service:停止tomcat这个service
systemctl reload tomcat.service:重新启动tomcat这个service
同时还可以通过如下命令查看Tomcat是否正确配置为随系统启动:
systemctl list-unit-files |grep tomcat
执行情况如下:
[root@localhost dw]#systemctl list-unit-files | grep tomcat
tomcat.service enabled
可以看出,Tomcat已经被成功配置为随操作系统启动。
3.给Tomcat增加内存
默认情况下,Tomcat所使用的内存较小,在并发访问量大的情况下有可能会出现内存溢出异常,因此需要给Tomcat增加内存,在本系统中默认给Tomcat配置最大可能内存为4G,操作步骤如下:
在/usr/local/apache-tomcat-8.5.59/bin/目录创建setenv.sh,文件内容如下:
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.59export CATALINA_BASE=/usr/local/apache-tomcat-8.5.59exportPATH=$PATH:$CATALINA_HOME/bin#add tomcat pidCATALINA_PID="/usr/local/apache-tomcat-8.5.59/tomcat.pid"#add Java optsJAVA_OPTS="-server -Xms4096m-Xmx4096m"
保存文件之后,重启Tomcat即可生效。
4.更改Tomcat默认端口
Tomcat默认使用8080端口作为监听端口,以便于与其它Web服务器集成,但在本项目中直接使用Tomcat作为Web服务器,为便于用户操作,需要将Tomcat的默认端口由8080改为80。在Tomcat的安装目录下的conf目录中的server.xml文件中保存了tomcat的配置信息,首先将server.xml备份,然后在server.xml中修改,执行如下命令对server.xml进行备份:
cd /usr/local/apache-tomcat-8.5.59/conf/cp server.xml server_bak.xml
然后运行vim /usr/local/apache-tomcat-8.5.59/conf/server.xml打开server.xml,找到端口配置部分,如下所示:
<Connector port="8080"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
将其中的“8080”和“8443”分别改成80及443,并且加上”allowTrace="true"”配置。这样一来直接输入服务器的IP地址即可访问Tomcat的HTTP端口了,改完后的代码如下:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" allowTrace="true"/>
5.给Tomcat配置HTTPS协议支持
5.1为服务器制作证书并启用HTTPS
首先检查JDK及Tomcat项目的环境变量是否配置正确,打开/etc/profile文件,如果看到如下配置则证明配置正确:
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.59export CATALINA_BASE=/usr/local/apache-tomcat-8.5.59export PATH=$PATH:$CATALINA_HOME/bin
然后执行下面的命令,利用JDK提供的keytool工具在Tomcat的安装目录下生成tomcat.keystore文件:
keytool-genkey -alias tomcat -keyalg RSA -keypass goodluck@2020 -keystore /usr/local/apache-tomcat-8.5.59/tomcat.keystore-storepass goodluck@2020 -validity 36500
以下是执行过程中需要输入的参数:
Whatis your first and last name? [Unknown]: gggjdwWhatis the name of your organizational unit? [Unknown]: jsdwggWhatis the name of your organization? [Unknown]: ggjsdkyggWhatis the name of your City or Locality? [Unknown]: ngjgWhatis the name of your State or Province? [Unknown]: jgsgWhatis the two-letter country code for this unit? [Unknown]: zhggIsCN=gggjdw, OU=jsdwgg, O=jsdkygg, L=ngjg, ST=jgsg, C=zhgg correct? [no]: yes
这样就在tomcat的根目录下生成了自签名证书文件,证书密码和保存密码均为msver@2020,证书有效期为100年。可以通过下面的命令查看:
keytool-list -keystore /usr/local/apache-tomcat-8.5.59/tomcat.keystore
以下是程序执行结果:
keytool-list -keystore /usr/local/apache-tomcat-8.5.59/tomcat.keystoreEnterkeystore password:Keystoretype: jksKeystoreprovider: SUN Yourkeystore contains 1 entry tomcat,Dec 23, 2020, PrivateKeyEntry,Certificatefingerprint (SHA1): 8C:73:4B:17:4F:F7:47:D9:42:4B:20:04:B1:B0:2B:F6:BE:60:A7:E3
注意:在查看时需要输入证书密码。
打开Tomcat的配置文件,如下命令:
vim $CATALINA_HOME/conf/server.xml
在节点外添加如下节点:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="tomcat.keystore" keystorePass="goodluck@2020" />
其中keystoreFile是通过JDK提供的keytool创建的证书文件,其存放位置在Tomcat的根目录, keystorePass是创建证书时设置的密码。
然后通过下面的命令重启tomcat服务器:
systemctl stop tomcat.servicesystemctl start tomcat.service
这样就可以在服务器上通过HTTPS访问了,访问网址:
https://localhost
由于证书是没有经过认证的,所以在使用浏览器打开的时候会出现提示,如下图所示(以Chrome为例):
这时,需要点击图中的“高级”按钮,出现下面的链接:
然后就可以看到正常的网页内容了。
5.2为客户端生成证书
因为客户端不信任服务器端自行制作的证书,为避免客户端每次访问时出现警告,采用下面的命令生成客户端需要的证书:
keytool -keystore /usr/local/apache-tomcat-8.5.59/tomcat.keystore-export -alias tomcat -file /usr/local/apache-tomcat-8.5.59/msver.cer
一旦命令运行成功,就会在/usr/local/apache-tomcat-8.5.59/目录下生成msver.cer文件。将此证书文件提供给客户端,双击msver.cer就会出现导出安全证书提示,一路按照默认设置确认即可。
5.3强制HTTPS访问
打开安装目录下的conf/web.xml文件,在节点后增加如下内容:
<login-config> <auth-method>CLIENT-CERTauth-method> <realm-name>Client Cert Users-only Arearealm-name> login-config> <security-constraint> <web-resource-collection > <web-resource-name >SSLweb-resource-name> <url-pattern>/*url-pattern> web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIALtransport-guarantee> user-data-constraint> security-constraint>
然后重启Tomcat即可强制HTTPS访问。
6.防范Host头部攻击配置
为了方便获取网站域名,开发人员一般依赖于请求包中的Host首部字段。例如,在php里用_SERVER[“HTTP_HOST”]。但是这个Host字段值是不可信赖的(可通过HTTP代理工具篡改),如果应用程序没有对Host字段值进行处理,就有可能造成恶意代码的传入。
Host首部字段是HTTP/1.1新增的,旨在告诉服务器,客户端请求的主机名和端口号,主要用来实现虚拟主机技术。
运用虚拟主机技术,单个主机可以运行多个站点。以下图为例,hacker和usagidesign两个站点都运行在同一服务器A上,不管我们请求哪个域名,最终都会被解析成服务器A的IP地址,这个时候服务器就不知道该将请求交给哪个站点处理,因此需要Host字段指定请求的主机名。
我们访问hacker域名,经DNS解析,变成了服务器A的IP,请求传达到服务器A,A接收到请求后,发现请求报文中的Host字段值为hacker,进而将请求交给hacker站点处理。
这个时候,问题就出现了。为了方便获取网站域名,开发人员一般依赖于请求包中的Host首部字段。例如,在php里用_SERVER[“HTTP_HOST”]。但是这个Host字段值是不可信赖的(可通过HTTP代理工具篡改),如果应用程序没有对Host字段值进行处理,就有可能造成恶意代码的传入。
即将部署的配电自动化主站版本管理系统的服务器IP为172.17.51.230,因此需要在Tomcat根目录下的conf/server.xml中增加配置,在节点下增加节点,节点内容如下:
172.17.51.230
修改后的节点内容如下:
"localhost" appBase= unpackWARs="true" autoDeploy="true"> <Alias>172.17.51.230Alias> "org.apache.catalina.valves.AccessLogValve"directory= prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> Host>
最终的server文件如下(修改部分用红框标出):
7.禁用不常用HTTP方法
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 向指定资源位置上传其最新内容。
DELETE 请求服务器删除Request-URI所标识的资源。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
HTTP的访问中,一般常用的两个方法是:GET和POST。
在tomcat的根目录下的conf/web.xml配置文件最后可以加上请求方式限制,限制请求代码如下:
<security-constraint> <web-resource-collection> <url-pattern>/*url-pattern> <http-method>HEADhttp-method> <http-method>PUThttp-method> <http-method>DELETEhttp-method> <http-method>OPTIONShttp-method> <http-method>TRACEhttp-method> web-resource-collection> <auth-constraint> auth-constraint> security-constraint>
通过上面的配置,就只允许GET/POST类型的请求了。
最终在Tomcat根目录下conf/web.xml中增加的配置如下:
然后重启Tomcat服务器,配置生效。
7.清理非必要资源
在Tomcat中默认带有很多示例,但是这些示例在生产环境中没有任何作用,因此可以将这些示例删除。
执行下面的命令:
rm -rf /usr/local/apache-tomcat-8.5.59/webapps/docs/rm -rf /usr/local/apache-tomcat-8.5.59/webapps/examples/
然后备份/usr/local/apache-tomcat-8.5.59/webapps/ROOT/index.jsp文件,执行如下命令:
cp /usr/local/apache-tomcat-8.5.59/webapps/ROOT/index.jsp/usr/local/apache-tomcat-8.5.59/webapps/ROOT/index.jsp_bak
最后编辑/usr/local/apache-tomcat-8.5.59/webapps/ROOT/index.jsp文件,文件最终内容如下:
<htmllang="en"><head><title>msvertitle>head><body><scripttype ="text/javascript">document.location.href="/youwebApp";script>body>html>