如何在Ubuntu14.04上优化Tomcat安装
介绍
Tomcat 是 Java Servlet 和 JavaServer Pages 技术的流行实现。 它由 Apache Software Foundation 在流行的 Apache 开源许可下发布。 其强大的特性、有利的许可和强大的社区使其成为最好和最受青睐的 Java servlet 之一。
Tomcat 在安装后几乎总是需要额外的微调。 阅读本文以了解如何优化您的 Tomcat 安装,使其安全高效地运行。
本文继续在 Ubuntu 14.04 上运行 Tomcat 的主题,假设您之前已经阅读过 如何通过 Apt-Get 在 Ubuntu 14.04 上安装 Apache Tomcat 7。
先决条件
本指南已在 Ubuntu 14.04 上进行了测试。 所描述的安装和配置在其他操作系统或操作系统版本上会类似,但配置文件的命令和位置可能会有所不同。
对于本教程,您将需要:
- Ubuntu 14.04 液滴
- 非 root sudo 用户(请参阅 使用 Ubuntu 14.04 进行初始服务器设置)
- 根据 How To Install Apache Tomcat 7 on Ubuntu 14.04 via Apt-Get 中的说明安装和配置 Tomcat
本教程中的所有命令都应以非 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 只是一个 Java servlet,具有 Web 服务器的基本功能,而 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 /
部分,它指定应如何处理所有请求并确保它看起来像这样:
/etc/nginx/sites-enabled/default
location / { proxy_pass http://127.0.0.1:8080/; }
上面的 proxy_pass
指令意味着所有请求都应该转发到 Tomcat 侦听的 TCP 端口 8080 上的本地 IP 127.0.0.1。 关闭文件,然后使用以下命令重新启动 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 应用程序,那么我们至少可以限制对它们的访问。 它们的 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
:
sudo nano /etc/nginx/sites-enabled/default
在 server_name
指令之后但在默认根位置 (location /
) 之上添加以下内容并将 your_local_ip
替换为本地计算机的 IP 地址:
/etc/nginx/sites-enabled/default
... location /manager/ { allow your_local_ip; deny all; proxy_pass http://127.0.0.1:8080/manager/; } ...
您应该通过添加另一个配置块,将 manager
替换为 host-manager
像这样(再次,将 your_local_ip
替换为您的本地 IP地址):
/etc/nginx/sites-enabled/default
... location /host-manager/ { allow your_local_ip; deny all; proxy_pass http://127.0.0.1:8080/host-manager/; } ...
重新启动 Nginx 后,对 manager
和 host-manager
Web 上下文的访问将仅限于您的本地 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
在 Connector
配置部分添加 address="127.0.0.1"
如下:
/etc/tomcat7/server.xml
... <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,那么将 1GB 的 RAM 分配给 xxx 可能是安全的。 但是请记住,Tomcat 实际使用的内存会比Xmx
的大小略高一些。 - 最小堆大小
Xms
是启动时分配的内存量。 在大多数情况下,它应该等于 xx 值。 因此,您将避免运行代价高昂的内存分配过程,因为分配的内存大小将始终保持不变。 - 永久存储类的内存
MaxPermSize
应该允许 Tomcat 加载应用程序的类并从Xmx
值中留出空闲内存用于这些类的实例化。 如果您不确定应用程序的类需要多少内存,那么您可以将MaxPermSize
设置为Xmx
的一半大小作为开始 — 在我们的示例中为 512 MB。
在 Ubuntu 14.04 上,您可以通过编辑文件 /etc/default/tomcat7
来自定义 Tomcat 的 JVM 选项。 因此,要应用上述提示,请使用您喜欢的编辑器打开此文件:
sudo nano /etc/default/tomcat7
如果您已按照先决条件中的 Tomcat 安装说明进行操作,您应该会找到以下行:
/etc/default/tomcat7
... JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC" ...
如果您的 Droplet 有 2 GB 的 RAM,并且您想为 Tomcat 分配大约 1 GB 的内存,则此行应更改为:
/etc/default/tomcat7
... 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 的测试和开发环境。