FastDFS文件管理系統


用FastDFS一步步搭建文件管理系統

3、訪問文件

簡單的測試訪問文件

① 修改nginx.conf

復制代碼
# vim /usr/local/nginx/conf/nginx.conf

添加如下行,將 /group1/M00 映射到 /ljzsg/fastdfs/file/data
location /group1/M00 {
    alias /ljzsg/fastdfs/file/data;
}

# 重啟nginx
# /usr/local/nginx/sbin/nginx -s reload
復制代碼

② 在瀏覽器訪問之前上傳的圖片、成功。

http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

 

四、FastDFS 配置 Nginx 模塊

1、安裝配置Nginx模塊

① fastdfs-nginx-module 模塊說明

  FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲, 但是同組存儲服務器之間需要進行文件復制, 有同步延遲的問題。

  假設 Tracker 服務器將文件上傳到了 192.168.51.128,上傳成功后文件 ID已經返回給客戶端。

  此時 FastDFS 存儲集群機制會將這個文件同步到同組存儲 192.168.51.129,在文件還沒有復制完成的情況下,客戶端如果用這個文件 ID 在 192.168.51.129 上取文件,就會出現文件無法訪問的錯誤。

  而 fastdfs-nginx-module 可以重定向文件鏈接到源服務器取文件,避免客戶端由於復制延遲導致的文件無法訪問錯誤。

② 下載 fastdfs-nginx-module、解壓

復制代碼
# 這里為啥這么長一串呢,因為最新版的master與當前nginx有些版本問題。
# wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip

# 解壓
# unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip

# 重命名
# mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1  fastdfs-nginx-module-master
復制代碼

③ 配置Nginx

在nginx中添加模塊

復制代碼
# 先停掉nginx服務
# /usr/local/nginx/sbin/ngix -s stop

進入解壓包目錄 # cd /softpackages/nginx-1.12.1/ # 添加模塊 # ./configure --add-module=../fastdfs-nginx-module-master/src 重新編譯、安裝 # make && make install
復制代碼

 ④ 查看Nginx的模塊

# /usr/local/nginx/sbin/nginx -V

有下面這個就說明添加模塊成功

⑤ 復制 fastdfs-nginx-module 源碼中的配置文件到/etc/fdfs 目錄, 並修改

# cd /softpackages/fastdfs-nginx-module-master/src

# cp mod_fastdfs.conf /etc/fdfs/

修改如下配置,其它默認

復制代碼
# 連接超時時間
connect_timeout=10 # Tracker Server tracker_server=file.ljzsg.com:22122
# StorageServer 默認端口 storage_server_port=23000 # 如果文件ID的uri中包含/group**,則要設置為true url_have_group_name = true # Storage 配置的store_path0路徑,必須和storage.conf中的一致 store_path0=/ljzsg/fastdfs/file
復制代碼

⑥ 復制 FastDFS 的部分配置文件到/etc/fdfs 目錄

# cd /softpackages/fastdfs-5.05/conf/

# cp anti-steal.jpg http.conf mime.types /etc/fdfs/

 ⑦ 配置nginx,修改nginx.conf

# vim /usr/local/nginx/conf/nginx.conf

修改配置,其它的默認

在80端口下添加fastdfs-nginx模塊

location ~/group([0-9])/M00 {
    ngx_fastdfs_module;
}

注意:

  listen 80 端口值是要與 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相對應。如果改成其它端口,則需要統一,同時在防火牆中打開該端口。

  location 的配置,如果有多個group則配置location ~/group([0-9])/M00 ,沒有則不用配group。

⑧ 在/ljzsg/fastdfs/file 文件存儲目錄下創建軟連接,將其鏈接到實際存放數據的目錄,這一步可以省略。

# ln -s /ljzsg/fastdfs/file/data/ /ljzsg/fastdfs/file/data/M00 

⑨ 啟動nginx

# /usr/local/nginx/sbin/nginx

打印處如下就算配置成功

⑩ 在地址欄訪問。

能下載文件就算安裝成功。注意和第三點中直接使用nginx路由訪問不同的是,這里配置 fastdfs-nginx-module 模塊,可以重定向文件鏈接到源服務器取文件。

http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

 

最終部署結構圖(盜的圖):可以按照下面的結構搭建環境。

 

五、Java客戶端

前面文件系統平台搭建好了,現在就要寫客戶端代碼在系統中實現上傳下載,這里只是簡單的測試代碼。

1、首先需要搭建 FastDFS 客戶端Java開發環境

① 項目中使用maven進行依賴管理,可以在pom.xml中引入如下依賴即可:

<dependency>
   <groupId>net.oschina.zcx7878</groupId>
   <artifactId>fastdfs-client-java</artifactId>
   <version>1.27.0.0</version>
</dependency>

其它的方式,參考官方文檔:https://github.com/happyfish100/fastdfs-client-java

② 引入配置文件

可直接復制包下的 fastdfs-client.properties.sample 或者 fdfs_client.conf.sample,到你的項目中,去掉.sample。

我這里直接復制 fastdfs-client.properties.sample 中的配置到項目配置文件 config.properties 中,修改tracker_servers。只需要加載這個配置文件即可

2、客戶端API

個人封裝的FastDFS Java API以同步到github:https://github.com/bojiangzhou/lyyzoo-fastdfs-java.git

 

六、權限控制

前面使用nginx支持http方式訪問文件,但所有人都能直接訪問這個文件服務器了,所以做一下權限控制。

FastDFS的權限控制是在服務端開啟token驗證,客戶端根據文件名、當前unix時間戳、秘鑰獲取token,在地址中帶上token參數即可通過http方式訪問文件。

① 服務端開啟token驗證

復制代碼
修改http.conf
# vim /etc/fdfs/http.conf

設置為true表示開啟token驗證
http.anti_steal.check_token=true

設置token失效的時間單位為秒(s)
http.anti_steal.token_ttl=1800
密鑰,跟客戶端配置文件的fastdfs.http_secret_key保持一致 http.anti_steal.secret_key=FASTDFS1234567890 如果token檢查失敗,返回的頁面 http.anti_steal.token_check_fail=/ljzsg/fastdfs/page/403.html
復制代碼

記得重啟服務。

② 配置客戶端

客戶端只需要設置如下兩個參數即可,兩邊的密鑰保持一致。

# token 防盜鏈功能
fastdfs.http_anti_steal_token=true
# 密鑰
fastdfs.http_secret_key=FASTDFS1234567890

③ 客戶端生成token

訪問文件需要帶上生成的token以及unix時間戳,所以返回的token是token和時間戳的拼接。

之后,將token拼接在地址后即可訪問:file.ljzsg.com/group1/M00/00/00/wKgzgFnkaXqAIfXyAAEoRmXZPp878.jpeg?token=078d370098b03e9020b82c829c205e1f&ts=1508141521

復制代碼
 1     /**
 2      * 獲取訪問服務器的token,拼接到地址后面
 3      *
 4      * @param filepath 文件路徑 group1/M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
 5      * @param httpSecretKey 密鑰
 6      * @return 返回token,如: token=078d370098b03e9020b82c829c205e1f&ts=1508141521
 7      */
 8     public static String getToken(String filepath, String httpSecretKey){
 9         // unix seconds
10         int ts = (int) Instant.now().getEpochSecond();
11         // token
12         String token = "null";
13         try {
14             token = ProtoCommon.getToken(getFilename(filepath), ts, httpSecretKey);
15         } catch (UnsupportedEncodingException e) {
16             e.printStackTrace();
17         } catch (NoSuchAlgorithmException e) {
18             e.printStackTrace();
19         } catch (MyException e) {
20             e.printStackTrace();
21         }
22 
23         StringBuilder sb = new StringBuilder();
24         sb.append("token=").append(token);
25         sb.append("&ts=").append(ts);
26 
27         return sb.toString();
28     }
復制代碼

④ 注意事項

如果生成的token驗證無法通過,請進行如下兩項檢查:
  A. 確認調用token生成函數(ProtoCommon.getToken),傳遞的文件ID中沒有包含group name。傳遞的文件ID格式形如:M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg

  B. 確認服務器時間基本是一致的,注意服務器時間不能相差太多,不要相差到分鍾級別。

⑤ 對比下發現,如果系統文件隱私性較高,可以直接通過fastdfs-client提供的API去訪問即可,不用再配置Nginx走http訪問。配置Nginx的主要目的是為了快速訪問服務器的文件(如圖片),如果還要加權限驗證,則需要客戶端生成token,其實已經沒有多大意義。

關鍵是,這里我沒找到FastDFS如何對部分資源加token驗證,部分開放。有知道的還請留言。

 

 


 

OK,以上就是單機中使用FastDFS搭建文件系統並上傳下載的過程。

完!!!

 

 


免責聲明!

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



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