前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上优化Tomcat安装

如何在Ubuntu 14.04上优化Tomcat安装

原创
作者头像
所有的酒都不如你
修改2018-10-22 11:59:52
9790
修改2018-10-22 11:59:52
举报

介绍

Tomcat是Java Servlet和JavaServer Pages技术的流行实现。它由Apache Software Foundation根据流行的Apache开源许可证发布。其强大的功能,有利的许可证和优秀的社区使其成为最好和最受欢迎的Java servlet之一。

Tomcat安装后几乎总是需要额外的微调。阅读本文以了解如何优化Tomcat安装,以便安全有效地运行。

准备

本指南已在Ubuntu 14.04上测试过。所描述的安装和配置在其他OS或OS版本上类似,但配置文件的命令和位置可能不同。

在本教程中,您将需要:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 安装和配置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命令完成:

代码语言:javascript
复制
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

要删除此iptables规则,您只需将-A标志替换为添加规则,并-D在上面的命令中删除规则,如下所示:

代码语言:javascript
复制
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通过更好地支持静态内容,缓存和SSL,更有效地为HTTP和HTTPS流量提供服务。
  • Nginx很容易配置为侦听任何端口,包括80和443。

如果确信上述好处,那么首先确保已删除以前的iptables规则,然后使用以下命令安装Nginx:

代码语言:javascript
复制
sudo apt-get install nginx

之后,使用您喜欢的编辑器编辑Nginx的默认服务器块配置(/etc/nginx/sites-enabled/default),如下所示:

代码语言:javascript
复制
sudo nano /etc/nginx/sites-enabled/default

查找该location /部分,该部分指定应如何提供所有请求,并确保它看起来像这样:

代码语言:javascript
复制
location / {
    proxy_pass http://127.0.0.1:8080/;
}

上述proxy_pass指令意味着所有请求都应转发到Tomcat侦听的TCP端口8080上的本地IP 127.0.0.1。关闭文件,然后使用以下命令重新启动Nginx:

代码语言:javascript
复制
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包中。因此,要删除它们,请运行以下命令:

代码语言:javascript
复制
sudo apt-get remove tomcat7-admin

限制对管理Web应用程序的访问

如果您没有按照上一部分中的建议删除管理Web应用程序,那么我们至少可以限制对它们的访问。他们的网址应该是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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-enabled/default

server_name指令之后但是在默认根位置(location /)之上添加以下内容并替换your_local_ip为本地计算机的IP地址:

代码语言:javascript
复制
...
location /manager/ {
    allow your_local_ip;
    deny all;
    proxy_pass http://127.0.0.1:8080/manager/;
}
...

您应该对主机管理器应用程序应用相同的限制,方法是添加另一个配置块,其中manager替换为host-manager这样(再次,用您的本地IP地址替换your_local_ip):

代码语言:javascript
复制
...
location /host-manager/ {
    allow your_local_ip;
    deny all;
    proxy_pass http://127.0.0.1:8080/host-manager/;
}
...

一旦你重新启动Nginx的,访问managerhost-manager网络环境将仅限于本地IP地址:

代码语言:javascript
复制
sudo service nginx restart

您可以通过在浏览器中打开测试http://your_servlet_ip/manager/http://your_servlet_ip/host-manager/。应用程序应该可用,但如果您尝试使用公共代理或其他计算机访问相同的URL,则应该看到403 Forbidden错误。

此外,作为额外措施,您还可以使用以下命令删除Tomcat的文档和示例:

代码语言:javascript
复制
sudo apt-get remove tomcat7-docs tomcat7-examples

请注意,Tomcat仍然在TCP端口8080上侦听外部连接。因此,可以轻松绕过Nginx及其安全措施。要解决此问题,请将Tomcat配置为仅侦听本地接口127.0.0.1。为此,使用您喜欢的编辑器打开/etc/tomcat7/server.xml文件:

代码语言:javascript
复制
sudo nano /etc/tomcat7/server.xml

添加address="127.0.0.1"Connector配置部分是这样的:

代码语言:javascript
复制
...
<Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    URIEncoding="UTF-8"
    redirectPort="8443" />
...

之后重启Tomcat以使新设置生效:

代码语言:javascript
复制
sudo service tomcat7 restart

执行上述步骤可确保您具有良好的基本安全级别。

微调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上,您可以通过编辑/etc/default/tomcat7文件来自定义Tomcat的JVM选项。因此,要应用上述提示,请使用您喜欢的编辑器打开此文件:

代码语言:javascript
复制
sudo nano /etc/default/tomcat7

如果您已遵循先决条件中的Tomcat安装说明,则应找到以下行:

代码语言:javascript
复制
...
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,则此行应更改为:

代码语言:javascript
复制
...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xms1024m -Xmx1024m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC"
...

要使此设置生效,您必须重新启动Tomcat:

代码语言:javascript
复制
sudo service tomcat7 restart

上面的JVM配置是一个很好的开始,但您应该监视Tomcat的log(/var/log/tomcat7/catalina.out)以查找问题,尤其是在重新启动Tomcat或进行部署之后。要监视日志,请使用以下tail命令:

代码语言:javascript
复制
sudo tail -f /var/log/tomcat7/catalina.out

如果您对于tail来说是新用户,则必须按Ctrl-C键盘上的组合键才能停止拖尾日志。

搜索错误如OutOfMemoryError。这样的错误表明您必须调整JVM设置,更具体地说,增加Xmx大小。

结论

而已!现在,您只需几个易于遵循的步骤即可保护和优化Tomcat。建议进行这些基本优化,不仅适用于生产,甚至适用于暴露于Internet的测试和开发环境。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Optimize Your Tomcat Installation on Ubuntu 14.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 准备
      • 在标准HTTP端口上提供请求
        • 保护Tomcat
          • 删除管理Web应用程序
          • 限制对管理Web应用程序的访问
        • 微调JVM设置
          • 结论
          相关产品与服务
          云开发 CloudBase
          云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档