Apache静态分离指Apache专注服务静态资源、反向代理动态请求至Tomcat,构建期预处理静态文件(压缩/哈希),运行时零计算,通过职责分离提升性能与可维护性。

Java应用中所谓的“Apache静态分离”并不是指Apache主动“加工”动态内容,而是通过合理分工——让Apache(或更现代的Nginx)专注处理静态资源(HTML、CSS、JS、图片等),而将动态请求(如Servlet、Spring MVC接口)反向代理给后端Java容器(Tomcat/Jetty)执行。所谓“动静加工结合”,本质是静态资源可借助构建工具预处理(压缩、合并、哈希指纹),动态内容则由Java框架按需生成,二者在部署层面解耦又协同,才能达成性能与可维护性的平衡。
静态资源交给Apache(或Nginx)直接服务
避免Java容器(如Tomcat)处理大量静态文件,能显著降低JVM线程压力和GC频率。配置示例(Apache httpd.conf):
- 启用mod_proxy和mod_proxy_http模块
- 用Alias指令映射静态路径:
Alias /static "/var/www/myapp/static" - 对静态目录启用Expires和ETag:
ExpiresActive On; ExpiresByType image/jpg "access plus 1 year" - 确保DocumentRoot不覆盖应用上下文路径,避免静态资源被Tomcat误拦截
动态请求精准反向代理到Tomcat
不是所有请求都走代理,只代理明确的动态路径(如/api/、/admin/、/*.do),其余默认由Apache本地响应:
- 使用ProxyPass和ProxyPassReverse限定范围:
ProxyPass /api/ http://localhost:8080/myapp/api/ - 排除静态路径优先匹配(利用ProxyPass !):
ProxyPass /static/ !,再写动态代理规则 - 开启mod_proxy_balancer可为多实例Tomcat做负载,但单机场景慎用,避免引入额外延迟
构建阶段完成静态资源“加工”,运行时零计算
所谓“动静加工结合”的核心不在运行时,而在构建期。Java项目(如Maven)应集成前端构建流程:
- 用Webpack/Vite对JS/CSS做tree-shaking、code-splitting、hash命名,输出带指纹的文件(
app.a1b2c3.js) - Maven插件(如frontend-maven-plugin)在package阶段自动执行构建,把产物拷贝至src/main/resources/static或独立静态目录
- Java代码中通过Thymeleaf或FreeMarker动态注入带版本号的资源链接,确保浏览器缓存更新即时生效
关键细节决定性能上限
容易被忽略但影响显著的点:
- Apache MPM选择:高并发下推荐event模式(非prefork),配合mod_http2启用HTTP/2
- Tomcat连接器调优:设置maxThreads=200、acceptCount=100、禁用AJP(改用HTTP/1.1 proxy)
- Gzip压缩交由Apache统一处理:在Apache中启用mod_deflate,而非让Tomcat重复压缩响应体
- 静态资源CDN化:生产环境将/static/路径指向CDN域名,Apache仅作回源代理,进一步卸载流量
这套配置不是堆砌参数,而是回归分层本质:让每个组件做最擅长的事。Apache守好边缘,做缓存、压缩、路由;Java专注业务逻辑,不碰字节流;构建工具提前“加工”,运行时只交付成品。性能巅峰,往往藏在清晰的职责边界里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










