NFS + Nginx搭建小型文件服務器(實現上傳和下載)


一、需求分析:所有文件均存儲在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/; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM