我正在我的系统上本地开发一个 Web 应用程序,并使用 Tomcat (tomcat-7.0.52) 为其提供服务。在生产中,我想使用 Apache httpd (Apache/2.2.15) 来为 Tomcat 提供前端。
这有效,我设法根据需要配置了缓存。现在我想配置压缩,但似乎无法让 Apache httpd 修改它从 Tomcat 获得的响应。
但是正如我在这里读到的,这是首选的方法。mod_jk 压缩仅在 httpd 和 Tomcat 之间进行,如果我想直接在 Tomcat 中配置压缩,我需要一个额外的 servlet。
我的 vhost 文件中有以下行,用于启用静态和 httpd 提供的内容的压缩:
#SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/plain text/html application/json text/xml text/css text/javascript
启用第一行对我来说没有任何改变。
我使用 mod_jk 将这些请求传递给 Tomcat:
<IfModule mod_jk.c>
JkMount /myapp/j_security_check worker1
JkMount /myapp/*.jsp worker1
JkMount /myapp/DataSourceLoader worker1
JkMount /myapp/ServletLogin worker1
</IfModule>
使用 Firebug 我可以看到 Tomcat 返回的请求的 mime 类型是
/myapp/j_security_check: "text/plain; charset=UTF-8" (with the space)
/myapp/*.jsp: "text/plain; charset=UTF-8" (with the space)
/myapp/DataSourceLoader: "application/json;charset=UTF-8" (without space)
由于我无法添加空格按类型添加输出过滤器因为我也有不带 UTF-8 的 mime-types,而且我也尝试过设置输出过滤器,我认为这些指令根本不能操纵 Tomcat 答案。
我的问题是:
最好的建议解决方案是什么?Tomcat 压缩还是 Apache httpd 压缩?(根据使用 mod_deflate apache 和 tomcat 进行 gzip 压缩(重定向至此处:https://stackoverflow.com/questions/16653642/tomcat-7-gzip-compression-not-working)应该在httpd中完成)
如何为 mod_jk 结果启用 Apache httpd-compression(可能来自 JBoss 而不是 Tomcat)?
或许相关:如何在 Apache httpd 中从 mod_jk 结果修改缓存标头?
谢谢你!
答案1
布拉马,
我同意#1,可以使用 apache 或其他 Web 服务器来处理压缩。
以下是我的想法:
- 我在 tomcat 前面使用 apache mod_proxy 或 nginx。这样我就可以根据需要处理 SSL、压缩和静态内容。我已经开始转向 nginx 来替换前端的 apache。
- 适用于 apache 或 nginx ngx_http_gzip_module 的 mod_deflate
- 您可以在 tomcat 或 apache 中处理所有缓存规则。这取决于您想要什么规则。