介绍
Tomcat是Java Servlet和JavaServer Pages技术的流行实现。 它由Apache软件基金会根据受欢迎的Apache开源许可证发布。 其强大的功能,有利的许可证和伟大的社区使其成为最好和最优选的Java servlet之一。
Tomcat在安装之后几乎总是需要额外的微调。 阅读本文,了解如何优化Tomcat安装,以便其安全高效地运行。
本文将继续在Ubuntu 14.04上运行的Tomcat的主题,并假定您已经阅读以前如何通过apt-get的在Ubuntu 14.04安装Apache Tomcat 7 。
先决条件
本指南已在Ubuntu 14.04上测试。 所描述的安装和配置在其他OS或OS版本上类似,但配置文件的命令和位置可能不同。
对于本教程,您将需要:
- Ubuntu 14.04 Droplet
- 非根Sudo用户(见与Ubuntu 14.04初始服务器设置 )
- Tomcat的安装中的说明配置通过如何在Ubuntu 14.04安装Apache Tomcat 7 apt-get的
本教程中的所有命令都应以非root用户身份运行。 如果需要该命令的root访问权限,它会在前面加sudo
。
标准HTTP端口上的服务请求
您可能已经注意到,Tomcat默认侦听TCP端口8080。 这种默认的端口来,主要是因为该Tomcat中的非特权用户下运行的事实tomcat7
。 在Linux中,只有特权用户喜欢root
被允许在1024以下的端口上侦听,除非另有配置。 因此,您不能简单地将Tomcat的侦听器端口更改为80(HTTP)。
因此,优化Tomcat安装的第一个任务是解决上述问题,并确保您的Tomcat Web应用程序在标准HTTP端口上可用。
解决这个最简单的方法(但不一定是最好的方法)就是创建一个防火墙(iptables的) -从TCP端口80转发到TCP端口8080。这可以通过做iptables
命令:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
为了使这个iptables规则永久检查文章如何设置防火墙在Ubuntu 14.04使用iptables在部分保存你的iptables配置 。
要删除此iptables的规则,你可以简单地替换-A
标志与添加规则-D
在这样上面的命令删除规则标志:
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
从安全或性能的角度来看,这样的简单流量转发不是最佳的。 相反,一个好的做法是在Tomcat前面添加一个Web服务器,如Nginx。 原因是Tomcat只是一个具有Web服务器基本功能的Java servlet,而Nginx是一个典型的,功能强大的完全功能的Web服务器。 这里是使用Nginx作为前端服务器的一些重要的好处:
- Nginx比Tomcat更安全,可以有效地保护它免受各种攻击。 在紧急安全更新的情况下,更新前端Nginx Web服务器比担心停机时间和Tomcat升级相关的兼容性问题更容易,更快,更安全。
- Nginx更有效地提供HTTP和HTTPS流量,更好地支持静态内容,缓存和SSL。
- Nginx很容易配置为监听任何端口,包括80和443。
如果确信上述好处,那么首先确保你已经删除了以前的iptables规则,然后使用命令安装Nginx:
sudo apt-get install nginx
在此之后,编辑Nginx的默认服务器块配置( /etc/nginx/sites-enabled/default
用你喜欢的编辑器是这样的:
sudo nano /etc/nginx/sites-enabled/default
查找location /
一部分,它指定所有的请求应该如何送达,并确保它看起来是这样的:
location / {
proxy_pass http://127.0.0.1:8080/;
}
以上proxy_pass
指令表示,其中的Tomcat监听所有的请求应该被转发到本地IP 127.0.0.1 TCP端口8080上。 关闭文件,并使用命令重新启动Nginx:
sudo service nginx restart
之后,通过在浏览器的标准HTTP端口连接到您的Droplet的IP,尝试访问Tomcat。 该URL应该像http:// your_droplet's_ip
。 如果一切正常,Tomcat的默认页面应该打开。 如果没有,请确保您已删除iptables规则,并且Tomcat已按照本文的先决条件正确安装。
保护Tomcat
保护Tomcat可能是最重要的任务,往往被忽略。 幸运的是,只需几个步骤,你可以有一个相当安全的Tomcat设置。 要遵循本文的这一部分,您应该如前所述在Tomcat前安装和配置Nginx。
删除管理Web应用程序
功能和安全性之间的通常权衡也适用于Tomcat。 为了增加安全性,您可以删除默认的Web管理器和主机管理器应用程序。 这将是不方便的,因为您将必须从命令行执行所有管理,包括Web应用程序部署。
删除Tomcat的Web管理工具对于安全是有好处的,因为你不必担心有人可能会滥用它们。 这种良好的安全实践通常应用于生产现场。
管理Web应用程序包含在Ubuntu的软件包tomcat7-admin
。 因此,要删除它们运行命令:
sudo apt-get remove tomcat7-admin
限制对管理Web应用程序的访问
如果您没有按照上一部分中的建议删除管理Web应用程序,那么我们至少可以限制对它们的访问。 他们的网址应http:// your_servlet_ip /manager/
和http:// your_servlet_ip /host-manager/
。 如果您通过以下网址看到一个404 Not Found错误,那么就意味着他们已经被删除,你不必做任何事情。 不过,您可以阅读以下说明,了解如何继续处理您可能希望保护的其他敏感资源。
在这一点上,Nginx的是接受端口80上的连接,以便您可以访问所有的web应用程序http:// your_servlet_ip
来自世界各地。 同样,Tomcat的端口8080监听全球范围内,即http:// your_servlet_ip :8080
,在这里你可以找到相同的应用程序。 为了提高安全性,我们将通过Nginx限制端口80上的可用资源。 我们还将使Tomcat及其暴露的端口8080仅在本地服务器和Nginx可用。
打开默认的服务器模块配置文件/etc/nginx/sites-enabled/default
:
sudo nano /etc/nginx/sites-enabled/default
后server_name
指令,但默认的根位置上方( location /
)添加以下并替换your_local_ip
与本地计算机的IP地址:
...
location /manager/ {
allow your_local_ip;
deny all;
proxy_pass http://127.0.0.1:8080/manager/;
}
...
你应该通过增加在另一个配置块适用于主机管理器应用程序相同的限制manager
被更换host-manager
像这样(再次,更换your_local_ip
与您当地的IP地址):
...
location /host-manager/ {
allow your_local_ip;
deny all;
proxy_pass http://127.0.0.1:8080/host-manager/;
}
...
一旦你重新启动Nginx的,访问manager
和host-manager
的网络环境将仅限于本地IP地址:
sudo service nginx restart
您可以通过在浏览器中打开测试它http:// your_servlet_ip /manager/
和http:// your_servlet_ip /host-manager/
。 应用程序应该可用,但如果您尝试使用公共代理或其他计算机访问相同的URL,那么您应该看到403 Forbidden错误。
此外,作为一个额外的措施,您还可以使用命令删除Tomcat的文档和示例:
sudo apt-get remove tomcat7-docs tomcat7-examples
请注意,Tomcat仍然侦听TCP端口8080上的外部连接。因此,Nginx及其安全措施可以轻松地绕过。 要解决此问题,请将Tomcat配置为仅在本地接口127.0.0.1上侦听。 为此,打开文件/etc/tomcat7/server.xml
用你喜欢的编辑器:
sudo nano /etc/tomcat7/server.xml
添加address="127.0.0.1"
的Connector
配置部分是这样的:
...
<Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
...
之后重新启动Tomcat使新设置生效:
sudo service tomcat7 restart
遵循上述步骤将确保您对Tomcat有一个良好的基本安全级别。
微调JVM设置
当然,通用Java虚拟机(JVM)微调原则也适用于Tomcat。 虽然JVM调整是一个整体科学本身,有一些基本的,良好的做法,任何人都可以轻松应用:
- 最大堆大小,
Xmx
,是最大内存的Tomcat可以使用。 它应该设置为一个值,留下足够的可用内存Droplet本身运行和任何其他服务,你可以在Droplet。 例如,如果您的Droplet有2 GB的RAM,那么可能安全地为xmx分配1GB的RAM。 但是,请记住,实际内存Tomcat使用会比规模高那么一点点Xmx
。 - 最小堆大小
Xms
,为内存在启动时分配的金额。 在大多数情况下,它应该等于xmx值。 因此,您将避免使昂贵的内存分配进程运行,因为分配的内存的大小将始终是恒定的。 - 其中,类永久存储,内存
MaxPermSize
,应该让Tomcat能够加载应用程序的类和从离开空闲的内存Xmx
这些类的实例化价值。 如果你不知道你的应用程序的类有多少内存需要,那么你可以在设置MaxPermSize
为一半大小Xmx
作为一个开始- 512 MB在我们的例子。
在Ubuntu 14.04,您可以通过编辑该文件自定义Tomcat的JVM选项/etc/default/tomcat7
。 所以,要应用上述提示,请打开此文件与您最喜欢的编辑:
sudo nano /etc/default/tomcat7
如果你遵循Tomcat的安装说明从前提条件,你应该找到以下行:
...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"
...
如果你的Droplet有2 GB的内存,你想分配到1GB到Tomcat,这行应该改为:
...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xms1024m -Xmx1024m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC"
...
要使此设置生效,您必须重新启动Tomcat:
sudo service tomcat7 restart
以上JVM配置是一个良好的开端,但你应该监视Tomcat的日志( /var/log/tomcat7/catalina.out
的问题),尤其是重新启动Tomcat或做部署后。 要监视日志使用tail
命令是这样的:
sudo tail -f /var/log/tomcat7/catalina.out
如果你是新来tail
,你必须按下组合键Ctrl-C
在键盘上停止尾矿日志。
搜索类似的错误OutOfMemoryError
。 这样的错误会表明你要适应的JVM设置,更具体地说增加Xmx
大小。
结论
而已! 现在你只需要几个简单的步骤就可以保护和优化Tomcat。 建议这些基本优化不仅适用于生产环境,甚至适用于暴露于Internet的测试和开发环境。