用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搭建文件系統並上傳下載的過程。
完!!!