一、需求分析:所有文件均存儲在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訪問靜態文件,對外提供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/; }