我已经看到很多关于使用 Apache 作为 Glassfish(和其他 Java 应用程序服务器)的代理(mod_proxy 或 mod_jk)的最佳方法的讨论,但我还没有看到任何人真正解释原因。
我现在的设置是单个 VPS,运行 Ubuntu Server,Glassfish 在端口 8080 上接受 HTTP 请求(iptables 将端口 80 请求转发到端口 8080,因此我不必以 root 身份运行 Glassfish)。我运营一些小型网站。
我的网站分为两个主要部分:静态和动态。它们分别位于不同的子域中。使用 Apache(或其他 Web 服务器)处理静态内容,然后使用 Apache 作为动态内容的代理,这样做很容易,但这样做有什么理由吗?
如果我要使用 Apache,理想情况下它必须在少于 100 MB 的内存中运行,以便为其他所有运行程序节省空间。
使用最新的应用程序服务器(Glassfish 3),使用 Apache 作为代理可以获得任何性能优势吗?
答案1
Glassfish 在提供静态内容方面表现如何?基于名称的虚拟主机?重定向?我敢打赌 Apache 在所有这些方面都更胜一筹。不过,如果您对小型前端 Web 服务器特别感兴趣,请考虑 nginx 而不是 Apache。
答案2
有很多理由可以让你考虑在 Java 应用程序服务器前使用反向代理:
- 在 Linux 上,您不应以 root 身份运行 GlassFish,但除非您是 root,否则您无法使用端口 80 或 443。反向代理是解决此问题的一种方式。其他解决此问题的方法包括 xinetd 和 iptables。或者,您可以不使用标准 Web 端口(对用户或 SEO 不友好)。
- 如果您已有现有的 Web 服务器占用了您想要的端口,您可以通过反向代理“共享”它。例如,将 PHP 应用程序和 Java 应用程序都放在同一个 Web 服务器的 80 端口上。
- Apache 经过了更好的测试(使用很多)并且比 GlassFish(使用不多)更安全,因此它可以保护它免受直接访问。例如,安全专家 (SANS) 建议使用三层架构,其中前端 Web 服务器位于 DMZ 中,应用程序服务器位于中间安全级别(数据库位于第三个更安全的网络中)。
- 您可以在用户不知情的情况下对应用程序服务器进行更改(例如,重命名或将其从一个拆分为多个)。
- 静态内容可能会有更好的性能(可以使用本机操作系统文件访问 - 但如果您告诉 GlassFish 可以将静态内容缓存在内存中,因此这可以忽略不计)
- 更熟悉的 URL 重写、重定向、自定义标头、缓存、虚拟主机(注意:GlassFish 可以完成所有这些操作,或者可以使用自定义 Servlet 过滤器或第三方 Servlet 过滤器(如 Tuckey URLRewrite)来完成这些操作)。