场景
- 存在多个无状态的Web应用服务,支持多实例集群化部署(使用nginx作为反向代理)
- 在Web应用中存在图片文件上传功能
- 不能将图片文件直接保存到数据库中,数据库中只保存文件访问链接
问题
- 因为Web应用服务是多实例集群化部署的,因此上传图片之后不能简单保存到本地,否则其他实例将无法访问上传之后的图片.
- 图片上传之后不要通过Web应用来访问(像Tomcat这样的Servlet容器不擅长处理静态文件)
解决方案
图片如何存储
针对第一个问题,图片通过Web应用上传之后不能保存在本地,应该使用专门的图片服务器或者分布式文件系统进行存储.
具体实现方案如下:
- 在项目初期的时候,图片数量不算太多,可以直接使用1台独立的静态文件服务器进行存储即可,同时使用RAID机制对磁盘进行一定的冗余备份.
- 随着项目的演进,图片数量达到一定量级出现瓶颈时(如单台服务器存储容量不够,或者文件数量太多访问缓慢等因素),需要考虑使用分布式集群文件系统进行文件存储,如:FastDFS等.
这里还存在一个疑问: Web应用接收到上传的图片文件之后如何保存到静态文件服务器或者集群文件系统呢?
其一, 如果图片文件存储在单独的文件服务器中时,Web应用接收到浏览器上传的图片之后可以通过NFS或者FTP协议将文件同步到图片服务器,但是可能存在同步出错或者延时的情况.当然,还可以开发一个简单的网络服务程序运行于图片服务器上,专门用于接收上传图片.
其二, 如果图片文件存储在分布式集群文件系统中,则直接使用文件系统API将文件写入即可.
如何访问图片
针对第二个问题,图片上传之后访问时如何与Web应用分离?
(1)如果只是单台的图片服务器,可以直接使用nginx作为静态文件服务器即可,简单快捷,访问性能有保证.
(2)如果图片保存到分布式集群文件系统中,则直接通过文件系统API访问即可.