一、需求分析:所有文件均存储在A服务器目录下,实现文件的上传下载。
代码部署在C服务器,A服务器共享目录给C服务器,实现文件的上传;B服务器挂载A服务器目录,借助Nginx代理实现Http方式的文件下载。
二、网络流程图:
三、具体实施:
1、实现上传
A服务器相关配置
①A服务器安装NFS服务
yum install nfs-utils
# 修改配置文件(此文件一般是空的)
vi /etc/exports
//支持配置多台服务器
/home/share/ 10.0.33.18(rw,sync,insecure,no_subtree_check,no_root_squash) #B服务器挂载端
/home/share/ 10.0.7.36(rw,sync,insecure,no_subtree_check,no_root_squash) #C服务器,测试上传用的
######到此服务端配置完成
ro 只读
rw 读写
sync: 资料同步写入到内存与硬盘当中
async:资料会先暂存于内存当中,而非直接写入硬盘
all_squash 所有登录用户指定为nobody
no_all_squash 以当前登录的用户所设定的权限(默认设定)
anonuid 在使用all_squash时的选择,可以对登录的帐号指定为指定的用户ID帐号
anougid 在使用all_squash时的选择,可以对登录的帐号指定为指定的组ID帐号
root_squash root用户指定为nobodyno_root_squash:(允许远程用户以root帐号登录(比较不安全))不讲root用户及所属用户组映射为匿名用户或用户组,默认root是被映射为匿名用户的nfsnobody,所有即使开了rw写权限,客户机也使无法写入的,这个不映射为匿名用户,还保留原来的用户权限就可以读写了,因为一般都是用root用户登录的。
②C服务器测试上传,直接上代码
package com.docker.dockertest.test;
import com.emc.ecs.nfsclient.nfs.io.Nfs3File;
import com.emc.ecs.nfsclient.nfs.io.NfsFileInputStream;
import com.emc.ecs.nfsclient.nfs.io.NfsFileOutputStream;
import com.emc.ecs.nfsclient.nfs.nfs3.Nfs3;
import com.emc.ecs.nfsclient.rpc.CredentialUnix;
import java.io.*;
public class NfsTransferFile {
private static final String NFS_IP = "10.0.33.18";
private static final String NFS_DIR = "/home/share";
public static void main(String[] args) {
uploadFileToNfs();
// downLoadFileFromNfs();
}
//上传本地文件到Nfs服务器指定目录
public static void uploadFileToNfs() {
String localDir = "/Users/Downloads/haha.txt";
InputStream inputStream = null;
OutputStream outputStream = null;
try {
//创建一个本地文件对象
File localFile = new File(localDir);
//获取本地文件的文件名,此名字用于在远程的Nfs服务器上指定目录创建同名文件
String localFileName = localFile.getName();
Nfs3 nfs3 = new Nfs3(NFS_IP, NFS_DIR, new CredentialUnix(0, 0, null), 3);
//创建远程服务器上Nfs文件对象
Nfs3File NfsFile = new Nfs3File(nfs3, "/" + localFileName);
//打开一个文件输入流
inputStream = new BufferedInputStream(new FileInputStream(localFile));
//打开一个远程Nfs文件输出流,将文件复制到的目的地
outputStream = new BufferedOutputStream(new NfsFileOutputStream(NfsFile));
//缓冲内存
byte[] buffer = new byte[1024];
while ((inputStream.read(buffer)) != -1) {
outputStream.write(buffer);
}
System.out.println("文件上传完成!");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
2、实现下载
①A服务器配置共享到B服务器
上面已配置A到B的共享
②B服务器挂载指定目录
yum -y install nfs-utils
systemctl start nfs-utils
systemctl enable nfs-utils
rpcinfo -p
mount 10.0.33.19:/home/share /home/utry
③B服务器搭建Nginx代理
搭建Nginx的步骤详见:
Nginx深入学习(一篇搞定)
这边只需配置nginx访问静态文件,对外提供http下载方式。
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# 访问路径带有share 的,一律跳转 xxx.xx.xx.xx/home/utry/xx.txt
location ^~ /share {
root /home/utry/;
}