1. 程式人生 > >Nginx 整合 FastDFS 實現檔案伺服器

Nginx 整合 FastDFS 實現檔案伺服器

  上一篇文章《[FastDFS 分散式檔案系統詳解](https://www.cnblogs.com/mrhelloworld/p/fastdfs.html)》中帶大家詳細瞭解它的核心概念,架構體系及 FastDFS 環境的搭建與使用。但是此時還無法通過 HTTP 對檔案進行訪問,這篇文章將帶大家解決這個問題。   如果我們想通過 HTTP 訪問 FastDFS 中儲存的圖片資訊,需要藉助其他工具實現,Nginx 就是一個不錯的選擇,它是一個高效能的 HTTP 和反向代理 Web 伺服器。關於 Nginx 更多的內容請閱讀《[一篇文章搞定 Nginx 反向代理與負載均衡](https://www.cnblogs.com/mrhelloworld/p/nginx.html)》。    ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8f2a7ba25a9d4acd814b10cf1178c811~tplv-k3u1fbpfcp-zoom-1.image)      那麼問題來了:既然檔案都上傳至 Storage 伺服器了,在 Storage 伺服器中直接安裝 Nginx 反向代理至檔案資源路徑,好像就能實現瀏覽器直接訪問檔案的效果。究竟是不是這樣玩的呢?繼續往下看。   其實真實環境中並不是這樣使用的,因為 FastDFS 是**通過 Tracker 伺服器將檔案儲存在 Storage 伺服器**中,而且**同組儲存伺服器之間還需要進行檔案複製**,會有**同步延遲**的問題。   假設 Tracker 伺服器將檔案上傳到了 192.168.10.102,上傳成功以後檔案相關資訊已經返回給客戶端了。此時 FastDFS 的叢集儲存機制會將這個檔案同步到同組中的其他機器上進行儲存 192.168.10.103,在檔案還沒有複製完成的情況下,客戶端如果用這個檔案的相關資訊在 192.168.10.103 上進行獲取,就會出現檔案無法訪問的錯誤。   解決辦法就是使用 `fastdfs-nginx-module`,它可以**重定向檔案連結到源伺服器**進行獲取,避免客戶端由於複製延遲導致的檔案無法訪問的錯誤。    ## 配置 fastdfs-nginx-module    ### 下載資源      Nginx 整合 FastDFS 時 Nginx 需要新增 `fastdfs-nginx-module` 模組。直接通過 Github:https://github.com/happyfish100/fastdfs-nginx-module 下載壓縮包或者使用 git 命令下載,或者通過資源地址:https://sourceforge.net/projects/fastdfs/files/ 下載。   下載以後,上傳資源 `fastdfs-nginx-module-master.zip` 至伺服器 `/usr/local/src` 目錄後並解壓。 ```shell unzip fastdfs-nginx-module-master.zip ```    ### 修改配置      複製配置檔案 `mod_fastdfs.conf` 到 `/etc/fdfs` 目錄中。 ```shell cp /usr/local/src/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/ ```      `vim /etc/fdfs/mod_fastdfs.conf` 編輯配置檔案,主要關注以下部分。 ```properties # tracker 伺服器的 IP 和埠 tracker_server = 192.168.10.101:22122 # url 地址是否包含組名/卷名 url_have_group_name = true # 資料組/卷對應的路徑地址 store_path0 = /fastdfs/storage/store ```    ### 拷貝資源      複製 `fastdfs` 安裝包中的兩個配置檔案 `http.conf` 和 `mime.types` 到 `/etc/fdfs` 目錄中。 ```shell cp /usr/local/src/fastdfs-master/conf/http.conf /etc/fdfs/ cp /usr/local/src/fastdfs-master/conf/mime.types /etc/fdfs/ ```    ## 安裝 Nginx    ### 下載資源      下載 Nginx 並解壓。 ```shell # 下載 nginx 壓縮包 wget -P /usr/local/src http://nginx.org/download/nginx-1.18.0.tar.gz # 解壓 tar -zxvf /usr/local/src/nginx-1.18.0.tar.gz -C /usr/local/src ```    ### 安裝依賴      Nginx 是基於 C 語言開發的,HTTP 模組使用了 pcre 來解析正則表示式,且可以使用 zlib 對 HTTP 包的內容進行 gzip 壓縮,Nginx 不僅支援 HTTP 協議,還支援 HTTPS,HTTPS 需要 openssl 提供支援,所以安裝 Nginx 之前必須先安裝它所依賴的環境。 ```shell yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl-devel ```    ### 安裝 Nginx      編譯並安裝。 ```shell # 切換至 nginx 的解壓目錄 cd /usr/local/src/nginx-1.18.0 # 建立 nginx 的安裝目錄 mkdir -p /usr/local/nginx # 新增 fastdfs-nginx-module 模組,指定 nginx 的安裝路徑 ./configure --add-module=/usr/local/src/fastdfs-nginx-module-master/src --prefix=/usr/local/nginx/ # 編譯並安裝 make && make install ```    ## 配置 Nignx      `vim /usr/local/nginx/conf/nginx.conf` 編輯配置檔案,在 80 埠下新增以下內容。關於 Nginx 啟動使用者的問題請根據自身實際環境進行配置。 ```conf location\~/group[0-9]/ { ngx_fastdfs_module; } ``` ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7ea848b10e014f95a25a54b1fdd172fd~tplv-k3u1fbpfcp-zoom-1.image)    ## 測試      啟動 Nginx,命令為:`/usr/local/nginx/sbin/nginx`   此時客戶端上傳圖片以後得到檔名為:`group1/M00/00/00/wKgKZl9tkTCAJAanAADhaCZ_RF0495.jpg`   瀏覽器訪問:http://192.168.10.102/group1/M00/00/00/wKgKZl9tkTCAJAanAADhaCZ_RF0495.jpg 效果如下: ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3c885082d2b14ec4b9f2f89d6b38372a~tplv-k3u1fbpfcp-zoom-1.image)   至此 Nginx 整合 FastDFS 實現檔案伺服器就到這裡,其實目前的環境只是一個單節點的 FastDFS,如果要實現高可用,`Tracker` 和 `Storage` 都需要搭建多個節點形成叢集環境,後續文章中會詳細的教大家搭建 FastDFS 的叢集環境。下文我們先解決 Java 客戶端如何操作 FastDFS 實現檔案上傳下載替換刪除。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2669b3b662904cdaa9e78d0c3dd1d010~tplv-k3u1fbpfcp-zoom-1.image) 本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。 大家可以通過 `分類` 檢視更多關於 `FastDFS` 的文章。