问题的提出
在java webapp开发过程中有很多需要下载图片的需求,一般情况下我们都是用tomcat/jetty等类似的java web 容器提供java web程序运行服务,由于web容器可以直接提供http服务,所以架构师往往就直接使用java容器来直接提供图片的下载服务,这种做法往往带来的大量用户下载是web容器运行效率不佳,有时会影响servlet页面的处理效率。尽管现代的web容器做了深度优化,处理效率比之以前大大提高,但是一旦用户数量上去后,依然存在进程假死,不提供服务的问题。
深入分析
为什么使用java容器提供图片下载会出现这样的情况呢?我们首先需要看一下磁盘io的过程或者说步骤:
- 应用程序通过io api发出数据读取请求
- 如果是java程序,java进程通过jvm对操作系统发出请求
- 操作提供接收到指令从磁盘读取数据,现代操作系统都具备缓存功能,如果缓存中存在符合要求的数据块,则直接返回
- 操作系统对磁盘发出去读取数据请求,现代的磁盘一般也有缓存功能,如果缓存中存在符合要求的数据块,则直接返回
- 操作系统监控磁盘的数据读取操作,如果读取完成,此时数据被放在称作内核态的内存区域,此时操作系统需要把数据复制到用户态的内存中
这样数据有一个复制的过程,会消耗更多的资源和时间,如果使用java.io话,jvm会把复制到用户态内存的数据切成小块在返回个java app,这样java处理文件的效率会更加低效。现在的操作系统提供了一种称之为“mmap”的技术,可以直接把内核态的内存地址映射成用户态的地址,这样减少了用户态和内核态内存拷贝的消耗,提高了性能。自从jdk1.4,java也引入了使用mmap的技术,提高了效率。一般情况下,web容器提供文件服务时首先需要读取文件数据到内存然后通过tcp发送个客户端浏览器,这个是通过jvm来处理的,一般情况下多了jvm这一层,效率并不会产生太大影响,但一旦用户数上来这看似很小的性能消耗会被无限放大,直接现象就是web容器不能提供服务。另一方面io本身就是一个相对慢的操作,即使是使用c开发,当用户量急剧上升时也可能会出现问题。所以现代操作系统提供了一个叫sendfile的技术,这是在操作系统级别做了优化的技术,可以提供高效的文件读取和传输,很多web服务器比如apache/nginx/lighthttpd都基于这个技术提供了组件,但遗憾的是无论是tomcat还是jetty都还不能提供这个支持。还有一个问题是java的tcp通讯模型问题,虽然java底层已经支持epoll模式,但jdk层的封装上还是selector模式,这与操作系统原生的epoll模式在网络接入和处理上存在差距。基于这3个方面的原因造成了java web容器的问题。
解决方案
通用的技术解决方案
一般的解决方案的核心就是:让专业的人做专业的事。java web容器的作用是运行java web程序,运行动态页面,读取数据库,处理业务逻辑,对于一下静态的页面、图片、文件等直接让apache、nginx或者lighthttpd来提供服务。同时apache层还可以作为负载均衡,动态转发http请求到多个web 容器。
apache提供的图片服务方案
alias方案
apache支持别名技术,所谓的别名就是当用户请求一个资源时,apache根据配置规则自动把请求的资源转换到一个看似毫不相关的本地文件系统资源,比如:
Alias /foo/bar /baz
Alias /foo /gaq
当用户请求/foo/bar时,apache会自动从/baz获取资源,结合url rewrite可以提供更为强大的功能。这种方案在处理不需要权限判断的资源时非常有效,但需要权限判断的资源则不适合。
sendfiles方案
apache提供sendfiles技术的支持,需要安装一个特定的组件。其核心原理是:web程序通过response写入一个特定的header:X-Sendfile,当apache收到该response时会自动识别,然后自动读取需要下载的文件路径,并且读取文件发送至客户端浏览器。这样就可以进行权限判断了,文件下载的步骤是:
- 客户端请求一个文件
- apache转发原始请求至web容器
- web app进行权限判断
- web app根据请求参数查询出文件路径,并且写header
- apache截获response,根据header信息判断是否使用sendfiles技术,发送数据
分享到:
相关推荐
Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,因其高效稳定和低内存占用而备受青睐。在互联网行业中,Nginx经常被用来替代传统的Apache服务器,以应对高并发访问和大型网站的需求。本教程将深入探讨Nginx...
本实战指南旨在探讨如何通过Nginx实现高性能的Web服务,以提升网站的响应速度和稳定性。 一、Nginx与Apache的性能对比 1. 并发处理:Nginx采用异步非阻塞I/O模型,可以同时处理大量并发请求,而Apache则采用多进程...
《实战Nginx取代Apache的高性能Web服务器》一...通过阅读本书,读者不仅可以了解Nginx的基本原理,还能掌握实际操作中的技巧和最佳实践,从而在项目中成功实现Nginx替换Apache,构建出更高性能、更稳定的Web服务环境。
mod_cluster是Apache的一个模块,用于将请求分发到多个应用服务器(如Tomcat),实现负载均衡和高可用性。 Apache HTTP Server的核心功能包括处理HTTP协议,静态内容服务,以及通过各种模块(如mod_rewrite、mod_...
Apache 配置是指对 Apache 服务器的设置和配置,以便实现特定的 Web 服务器功能。 Apache 配置文件 Apache 配置文件是指 Apache 服务器的主配置文件和子配置文件。主配置文件通常位于 `/usr/local/apache2/etc/...
本文详细介绍了如何使用Apache httpd-2.2.15版本实现动态虚拟主机的配置过程,包括编译安装、添加`mod_vhost_alias`模块、配置Apache服务、创建站点文件夹、设置用户认证等关键步骤。通过这些步骤,您可以轻松地在同...
综上所述,`httpd.conf`中的`Alias`和`Location`是Apache配置中的重要组成部分,通过正确使用它们,你可以灵活地控制Web服务器的行为,提供高效、安全的Web服务。理解并熟练掌握这两个指令,对于管理和优化Apache...
### 实战Nginx:取代Apache的高性能Web服务器 #### Nginx简介 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发。自2004年公开发布以来,...
《实战Nginx:取代Apache的高性能Web服务器》是一本深度探讨Nginx技术的书籍,旨在帮助读者理解和掌握如何利用Nginx构建高效、稳定且可扩展的Web服务环境。Nginx作为一款轻量级、高性能的HTTP和反向代理服务器,近年...
Apache Ignite是一款开源的、分布式内存数据网格,它旨在提供高速的数据访问和处理能力,以实现高性能计算。这款产品能够支持缓存、数据库、服务网格、流处理等多种功能,广泛应用于大数据、实时分析和微服务架构中...
在详细介绍Nginx取代Apache作为高性能Web服务器之前,先来阐述一下这两个Web服务器软件的基础知识以及它们之间的主要区别。Apache是目前使用最广泛的Web服务器软件之一,它是一个开源项目,从1995年就开始活跃在Web...
《零成本实现Web性能测试:基于Apache JMeter》首先介绍基础的性能测试理论,接着详细介绍如何使用JMeter完成各种类型的性能测试。实战章节中作者以测试某大型保险公司电话销售系统为例,手把手教会读者如何用JMeter...
为了更好地利用现有的服务器资源,并实现更稳定的服务,开发者通常会选择将Django应用部署在Apache服务器上。本文将详细介绍如何在Apache服务器上部署Django应用。 #### 二、准备工作 在开始部署之前,请确保已经...
nginx是俄罗斯人igor sysoev编写的一款高性能的http和反向代理服务器。nginx选择了epoll和kqueue作为网络i/o模型,在高连接并发的情况下,内存、cpu等系统资源消耗非常低,运行稳定。 本书系统地介绍了nginx与php...
使用`/usr/local/apache2/bin/apachectl start`启动服务。 4. 通过浏览器访问`http://www.lamp.com`进行测试。 3. **httpd服务的日志** - **位置**: - 访问日志:`/usr/local/apache2/log/access_log` - 错误...