以前老系统采用的是
文件共享模式进行存储文件:
原有的部署模式,在用户请求:
上传文件接口:域名/BasicsShow/admin/file/uploadFile
下载文件接口:域名/BasicsShow/admin/file/
importFile这两个接口的时候,会自动分配web服务器的81和82上,可能是81执行,也可能是82执行。这样的话,请求81的上传图片就会保存到81的文件夹a。访问82的上传文件请求将文件保存到82的服务器。如果81和82两个服务器的文件夹不进行人为的同步,则下载图片的请求,有50%的几率会请求不到图片,因为如果上传请求把图片上传到81,下载请求有50%几率请求81,50%几率请求82.如果请求81,拿得到图片,否则拿不到。一般是通过文件同步工具进行同步。但是要求81和82文件夹都要可以设为共享。设为共享的目的是下载图片的时候可以由前端直接请求文件夹中的图片。
优点:一台服务器挂掉,另一台正常工作。
弊端:
1、文件夹必须设为共享。
2、文件夹必须依靠文件同步工具进行同步。
这样的话,外网服务器不能文件共享,所以这种方式不可以应用到外网服务器。
Nginx实现文件服务器:
上传文件、下载文件都不会走81和82的两个web服务器,而是通过nginx进行拦截,当发现是文件下载和文件上传的请求,进行拦截,直接请求道部署到92上的Java项目(基本和81和82上的项目一样),这样保证文件服务器唯一,无论是上传和下载都只走一台机器,数据唯一。文件下载的方式也摒弃了原有的文件夹共享前端直接请求图片的方式,采用流的方式进行输出。
优点:
1、数据唯一,可以满足多个web请求的文件上传下载工作。
2、不用设置文件夹共享,不依赖文件同步工具。
缺点:
文件服务器挂掉后,所有web服务器的文件上传下载都会受影响(可以采用服务器的热备)
Nginx配置:
client_max_body_size 30m;将http请求的文件大小设置为最大30M,默认为1M。
server {
listen 8080;//监控拦截8080端口,所有访问8080端口的请求都会被拦截。
server_name 10.26.201.81; //代表本机的IP。
location/BasicsShow/admin/file/ {//拦截包含/BasicsShow/admin/file/的请求
if ($request_method = 'OPTIONS') {
add_header'Access-Control-Allow-Origin' '*';
add_header'Access-Control-Allow-Headers' '*';
add_header'Access-Control-Allow-Methods' '*';
return 204;
}
proxy_passhttp://10.26.201.92:8080/BasicsShow/admin/file/;//请求跳转的服务器。
}
location / {
#由于跨域请求,浏览器会先发送一个OPTIONS的预检请求
if ($request_method = 'OPTIONS') {
add_header'Access-Control-Allow-Origin' '*';
add_header'Access-Control-Allow-Headers' '*';
add_header'Access-Control-Allow-Methods' '*';
return 204;
}
proxy_pass http://10.26.201.81:9090/;
}
这样设置,81和82的文件上传下载都会被转发到http://10.26.201.92:8080/
BasicsShow/admin/file/上。其他请求不进行跳转,依然在81和82上。