整体机制:多个业务tomcat 多个图片tomcat 通过nginx 实现负载均衡,服务器部分缓存已经完成。现在需要实现客户端缓存。
1 设置nginx 缓存机制
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
location ~ /photoserver/.*\.(gif|jpg|png|htm|jpeg|bmp|html|flv|ico|swf|doc)(.*) { #root nginx_cache/cache; if (!-f $request_filename) { proxy_pass http://img.dahongwa.com; #图片服务器 } proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504 http_404; proxy_cache_methods GET HEAD POST; proxy_cache_min_uses 1; expires max; access_log logs/img.dahongwa.com.log; }
2 配置图片tomcat过滤器
public class ResponseHeaderFilter implements Filter { /** The fc. */ FilterConfig fc; /* * (non-Javadoc) * * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, * javax.servlet.ServletResponse, javax.servlet.FilterChain) */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; // set the provided HTTP response parameters for (Enumeration e = fc.getInitParameterNames(); e.hasMoreElements();) { String headerName = (String) e.nextElement(); response.setHeader(headerName, fc.getInitParameter(headerName)); } // pass the request/response on chain.doFilter(req, response); } /* * (non-Javadoc) * * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig filterConfig) { this.fc = filterConfig; } /* * (non-Javadoc) * * @see javax.servlet.Filter#destroy() */ public void destroy() { this.fc = null; }
配置图片tomcat web.xml文件
<filter> <filter-name>ResponseHeaderFilter</filter-name> <filter-class>com.legendshop.core.photo.ResponseHeaderFilter</filter-class> <init-param> <param-name>Cache-Control</param-name> <param-value>max-age=315360000</param-value> </init-param> <init-param> <param-name>Access-Control-Max-Age</param-name> <param-value>315360000</param-value> </init-param> <init-param> <param-name>Expires</param-name> <param-value>315360000</param-value> </init-param> </filter> <filter-mapping> <filter-name>ResponseHeaderFilter</filter-name> <url-pattern>/photoserver/photo/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ResponseHeaderFilter</filter-name> <url-pattern>/photoserver/images/*</url-pattern> </filter-mapping>
3 在图片tmcat配置 过滤器 ETagContentFilter
<filter> <filter-name>ETagContentFilter</filter-name> <filter-class>com.legendshop.core.photo.ETagContentFilter</filter-class> <init-param> <param-name>Cache-Control</param-name> <param-value>max-age=315360000</param-value> </init-param> <init-param> <param-name>Access-Control-Max-Age</param-name> <param-value>315360000</param-value> </init-param> <init-param> <param-name>Expires</param-name> <param-value>315360000</param-value> </init-param> </filter> <filter-mapping> <filter-name>ETagContentFilter</filter-name> <url-pattern>/photoserver/photo/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ETagContentFilter</filter-name> <url-pattern>/photoserver/images/*</url-pattern> </filter-mapping>
public class ETagContentFilter implements Filter { private static Logger logger = LoggerFactory.getLogger(ETagContentFilter.class); @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest servletRequest = (HttpServletRequest) req; HttpServletResponse servletResponse = (HttpServletResponse) res; ByteArrayOutputStream baos = new ByteArrayOutputStream(); ETagResponseWrapper wrappedResponse = new ETagResponseWrapper(servletResponse, baos); chain.doFilter(servletRequest, wrappedResponse); byte [] bytes = baos.toByteArray(); String token = '"' + ETagComputeUtils.getMd5Digest(bytes) + '"' ; servletResponse.setHeader( "ETag" , token); // always store the ETag in the header String previousToken = servletRequest.getHeader("If-None-Match"); if (previousToken != null && previousToken.equals(token)) { // compare previous token with current one logger.debug("ETag match: returning 304 Not Modified"); servletResponse.setStatus(HttpServletResponse.SC_NOT_MODIFIED); // use the same date we sent when we created the ETag the first time through servletResponse.setHeader("Last-Modified",servletRequest.getHeader("If-Modified-Since")); // servletResponse.setHeader("Cache-Control",315360000); //Cache-Control: max-age=0 + Last-Modified(ETag) }else{ // first time through - set last modified time to now Calendar cal = Calendar.getInstance(); cal.set(Calendar.MILLISECOND, 0 ); Date lastModified = cal.getTime(); servletResponse.setDateHeader("Last-Modified", lastModified.getTime()); logger.debug( " Writing body content " ); servletResponse.setContentLength(bytes.length); ServletOutputStream sos = servletResponse.getOutputStream(); sos.write(bytes); sos.flush(); sos.close(); } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub }
public class ETagResponseWrapper extends HttpServletResponseWrapper { private HttpServletResponse response = null; private ServletOutputStream stream = null; private PrintWriter writer = null; private OutputStream buffer = null; public ETagResponseWrapper( HttpServletResponse response, OutputStream buffer ) { super( response ); this.response = response; this.buffer = buffer; } public ServletOutputStream getOutputStream() throws IOException { if( stream == null ) stream = new ETagResponseStream( response, buffer ); return stream; } public PrintWriter getWriter() throws IOException { if( writer == null ) writer = new PrintWriter( new OutputStreamWriter( getOutputStream(), "UTF-8" ) ); return writer; } public void flushBuffer() throws IOException { stream.flush(); }
public class ETagResponseStream extends ServletOutputStream{ public ETagResponseStream(HttpServletResponse response,OutputStream outputstream)throws IOException { closed = false; stream = null; stream = outputstream; } public void close() throws IOException { if(!closed) { stream.close(); closed = true; } } public void flush() throws IOException { if(!closed) stream.flush(); } public void write(int i) throws IOException { if(!closed) stream.write((byte)i); } public void write(byte abyte0[], int i, int j) throws IOException { if(!closed) stream.write(abyte0, i, j); } public void write(byte abyte0[]) throws IOException { write(abyte0, 0, abyte0.length); } public boolean closed() { return closed; } public void reset() { } private boolean closed; private OutputStream stream; }
好了 下面你刷新就是一堆的304了,去玩吧。
相关推荐
在构建高性能、高可用性的Web应用系统时,"nginx+tomcat7负载均衡+redis缓存session"是一种常见的架构模式。这种模式结合了Nginx的反向代理和负载均衡能力,Tomcat作为Java应用服务器处理业务逻辑,而Redis则用于...
### Nginx+Tomcat负载均衡配置教程 #### 一、Nginx 安装与配置 **1. 下载并安装Nginx** - **下载Nginx**:前往Nginx官方网站下载适合您操作系统的最新版本。推荐下载稳定版以确保运行稳定。 - **解压文件**:将...
本篇将详细讲解如何在Nginx+Tomcat+Redis环境中实现负载均衡,并讨论session管理的关键知识点。 首先,Nginx是一个强大的HTTP和反向代理服务器,它能够通过分发请求到多个后端服务器来实现负载均衡。Nginx支持多种...
Nginx作为一个轻量级的反向代理服务器,通常用于处理静态内容和实现负载均衡,而Tomcat作为Java应用服务器,负责处理动态请求。以下是对这个主题的详细解释: 首先,我们需要安装Nginx。在Linux环境下,这通常通过...
本教程将详细讲解如何通过`Nginx`实现`Tomcat`集群的负载均衡,并实现`session`共享。 首先,我们要理解负载均衡的基本概念。负载均衡是通过将工作负载分散到多个计算资源,以优化资源使用、最大化吞吐量、最小化...
- **负载均衡**:Nginx可以基于多种策略(如轮询、最少连接、IP哈希等)分配请求到不同的Tomcat实例,从而实现负载均衡,提高系统的可用性和响应速度。 - **静态资源处理**:Nginx对静态文件(如CSS、JavaScript、...
这个架构利用Nginx作为反向代理和负载均衡器,Tomcat作为Java应用服务器处理业务逻辑,而Redis则用作缓存系统以提升数据访问速度。下面我们将详细探讨这些组件的作用及其在集群环境中的配置与协同工作。 **Nginx** ...
在IT行业中,构建高效、可扩展的Web服务是至关重要的,而"nginx+tomcat实现负载均衡1"的主题就是探讨如何通过Nginx反向代理和Tomcat应用服务器结合,来提升系统的性能和稳定性。这一组合是业界常用的一种架构模式,...
接下来,"第四节(使用nginx+tomcat负载均衡)"则可能涉及负载均衡的配置。Nginx支持多种负载均衡策略,如轮询(round-robin)、最少连接数(least connections)、IP哈希(ip_hash)等。轮询是最基础的策略,每个请求...
在负载均衡场景下,Nginx可以接收客户端的请求,根据预设策略将请求分发到后端多个Tomcat服务器上,实现服务的横向扩展。配置Nginx的负载均衡策略,如轮询、最少连接、IP哈希等,可以确保服务器资源的充分利用。 **...
在负载均衡场景下,`nginx`可以作为前端服务器,根据预设策略将进来的网络请求分发到后端多个`tomcat`服务器上,实现流量分散,降低单个服务器的压力,提高系统整体可用性。 `tomcat`是Apache软件基金会的Java ...
在构建高性能、高可用性的Web应用系统时,`Nginx`、`Tomcat`和`Redis`常常被结合使用,以实现负载均衡、反向代理、缓存和会话共享等功能。本压缩包文件提供了实现这一组合所需的关键组件及配置说明,帮助你搭建高效...
在这个例子中,Nginx将作为负载均衡器和静态资源服务器,将动态请求转发到Tomcat,同时缓存静态内容,以减轻后端服务器的压力。 2. **memcached_en32or64.zip**: 这是一个Memcached的安装程序,可能包含32位或64位...
在构建高性能、高可用性的Web服务环境中,Java开发和运行环境、数据库系统、负载均衡以及缓存服务都是不可或缺的关键组件。这个压缩包包含了"keepalived+nginx+tomcat+redis+mysql"所需的基础组件,特别是Java ...
本文将详细介绍如何在CentOS 6.5系统上搭建一个基于Nginx、Tomcat和Memcached的负载均衡集群,以实现高效的Session共享和服务器间的负载分配。 首先,Nginx作为一个反向代理服务器和负载均衡器,其主要职责是接收...
总结,构建Linux下Nginx+Memcached+Tomcat的负载均衡集群服务,需要深入了解每个组件的工作原理,正确配置和整合这些组件,以实现高效、稳定的Web服务。同时,不断优化和调整集群策略,以适应业务的增长和变化。
标题 "nginx+tomcat+redis完成session共享" 涉及到的是在分布式系统中...这个解决方案在大型网站和企业级应用中非常常见,因为它能够有效解决Session同步问题,同时充分利用Nginx的负载均衡能力和Redis的高速缓存能力。
"Nginx + Tomcat 实现动静分离负载均衡" 本文将详细介绍如何使用 Nginx 和 Tomcat 实现动静分离负载均衡。动静分离是指将静态资源(如图片、CSS、JavaScript 文件等)和动态资源(如 JSP、Servlet 等)分离,使用...
【Nginx+Tomcat负载平衡】是一种常见的Web服务架构模式,主要用于提高网站或应用的可用性和性能。在这个模式中,Nginx作为反向代理服务器,负责接收来自客户端的HTTP请求,并根据预设的策略将这些请求分发到多个...
这种架构利用Nginx作为反向代理和负载均衡器,Tomcat作为Java应用服务器处理动态请求,而Redis则用于存储和共享Session数据。下面将详细解析这种架构的关键知识点。 1. **Nginx负载均衡**: - Nginx配置中的`...