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