Apache + Tomcat VS独立的Tomcat或GlassFish

我正在设置一个Debian服务器来为Java Web应用程序提供服务。 我已经做了好几个星期的研究了。 Tomcat的网站上说,如果你不是集群,最好使用独立的Tomcat来提高速度。 但是,我看到很多人build议使用Apache + Tomcat为您提供更好的安全性和防御攻击。

请假定该进程将作为非特权用户在端口80上运行。 我会假设,如果你在服务器前面运行防火墙,Tomcat应该没问题。 但是,如果您只是想使用Linux防火墙运行暴露的Web服务器,那么最好的select是什么?

或者,也许有人可以推荐另一个开源Web服务器。 我试图保持解决scheme尽可能轻,因为这些webapps将在容器中运行。

所有意见欢迎和重视。

从我自己的经验来看,在Tomcat面前保留一些东西来保护外部世界是非常明智的。 如果你使用Tomcat原生扩展运行tomcat,IO速度非常快,而且Tomcatperformance得非常好。

另外,Tomcat可以运行在80端口而无需使用jsvc运行,如果没有随发行版一起提供,那么构build和使用起来非常简单。

但是,为了防止出现一个简单的Web前端,也是很有用的:因为这个前端可以给你一点灵活性,这是Tomcat永远不会拥有的(gzip即时重写规则,在同一个IP上处理多个tomcat:端口使用简单的虚拟主机和代理映射,…)

Apache2可以在这个前端使用mod_proxy + AJP 。 AJP处理标题和源代码转发到Tomcat,当你不得不在你的域中添加RewriteRules时,你将永远不会高兴,因为Apache提供了一个非常简单的方法。

但是,AJPselectwebapp状态更改非常缓慢,并且必须等待30秒才能重新启动Web应用程序,以便在Internet上再次使用它,这是非常令人沮丧的。 在最新的AJP + Tomcat组合中,也有一些不太好的问题,导致空的页面和破碎的内容types(可以固定,但通过放弃tomcat原生增强…)。

简单的HTTP Mod_proxy也可以使用,但是由于不是一个真正的代理(Apache改变了Host:头,源IP变成代理地址,…)是我不太喜欢的东西。

其他不错的select包括:

  • HAProxy :非常聪明和简单的代理,非常善于处理负载,configuration相当简单,坚如磐石,一个真正的HTTP代理,可以通过通常的X-Forwarded-For Header转发源IP。 我在生产中使用这个,我对此非常高兴。 它可以扩展到数以千计的实时连接,同时限制到后端的活动连接的数量,并有许多内置的好function。 但是,这可能不适合做比HTTP路由更聪明的东西(比如RewriteRules)。

  • Nginx :我听说这个服务器确实支持AJP。 比Apache更轻,比HAProxyfunction更强大,如果有机会,我今天可能试试。

结论

  • 如果您有足够的时间进行testing,请尝试Nginx,
  • 如果你喜欢有一个简单而坚实的前端,去HAProxy,
  • 如果你更喜欢“传统”的路线,去Apache2 + AJP,
  • 如果您认为Tomcat足够强大并且可以为您提供所需的所有function,请使用jsvc并将Tomcat放置在端口80

我在UNIX上与Tomcat和Glassfish碰到的问题是(因为它们是Java应用程序,我猜)他们不能绑定到端口80,然后删除root权限。 以root身份运行这些types的东西并不是一个好习惯,所以有两个select:

(1)运行应用程序服务器作为绑定到高端口(例如8080)的常规用户,并使用类似iptables规则的东西将80端口的stream量redirect到8080端口。我已经用Linux上的一些Glassfish服务器完成了这个工作,很好。

(2)以Apache后面的常规用户身份运行应用程序服务器。 Apache可以绑定到端口80,删除权限,然后将请求代理到高端口上的应用程序服务器上。

我更喜欢后者,但主要是因为我已经与Apache合作了很长时间,发现configuration和pipe理起来很方便。 所以,如果你知道Apache使用它,当你需要重写一些URL或调整过期头时,你会很高兴。 另一方面,如果你没有Apache的经验(或者在这种情况下,因为你需要尽可能轻量级的东西),坚持Tomcat和使用iptables可能会更容易。

在@ deutsch的回答之后,Tomcat不必在UNIX上以root身份运行。 如果你从一个软件包(例如Fedora / CentOS / Red Hat的tomcat6 RPM)安装它,它将以一组有限的权限作为用户tomcat运行。

话虽如此,我同意@ Deutsch的最后一段, 使用Apache作为Tomcat的前端,除非您处于非常严格的截止date之前才能部署。 即使你还不熟悉它,在Tomcat前面用mod_proxy进行基本的部署也很容易,而且你几乎肯定会从更高的灵活性和安全性中受益。