1. 程式人生 > >Nginx + FastDFS檔案儲存系統服務對映架構設計

Nginx + FastDFS檔案儲存系統服務對映架構設計

由於我們做的國外遊戲運營業務,有大量的遊戲檔案,圖片等資源都需要儲存,而考慮到成本問題,我們都是自己買阿里雲伺服器,然後自己手工搭建檔案儲存服務,之前都是按教程安裝,然後使用;後來我們為了安全,下載遊戲連結防盜鏈,然後遊戲下載連結都是動態生成,而且想做到遊戲連結2分鐘有效,所以必須自己在Nginx到FastDFS中有一個檔案路徑對映,並且在對映服務中可以自定義做一些邏輯校驗,後來幾經查詢資料,才通過了解到可以利用Nginx的X-Accel-Redirect的響應頭做服務內部跳轉。目前已經上線了,而且執行良好,所以自己整理一下資料和自己的實踐以備後續有用。
我們利用Fastdfs來作為APP和H5應用,圖片儲存服務系統,用於解決一下問題:

  • 大量靜態檔案的儲存和訪問
  • 將檔案和資料服務分開儲存
  • 解決NAS儲存單點問題
該系統主要分為三個模組
  • CMS檔案管理模組
    一套基於HTML的UI介面的檔案上傳管理模組
  • 檔案對映模組
    負責解析使用者請求,利用X-Accel-Redirect響應頭對映檔案路徑
  • 檔案儲存模組
    完全基於Fastdfs實現,易於擴充套件,要求安裝fastdfs-nginx-module

檔案對映模組介紹

對映模組基於Nginx內部原理實現,通過X-Accel-Redirect響應頭進行Nginx內部跳轉,所有在使用者端瀏覽器是看不到該Header,所以不會暴露檔案的真實地址,同時瀏覽器也不會做302跳轉,是在一次請求中完成的。對映模組就是一個部署於Tomcat之上的web站點,其職責就是接受Nginx轉發過來的請求,把URL地址轉換為fastdfs儲存實體地址,並返回給Nginx,Nginx拿到實體地址後讀取檔案並返回給使用者。

Nginx作為高效能的反向代理伺服器,在本模組中起到的作用不僅僅是負載均衡,還利用到了Nginx的一個內部特性sendfile,利用該特性,Tomcat作為對映模組僅需要處理對映關係,而不用處理檔案IO操作,而我們知道,應用程式伺服器上的效能瓶頸往往是IO操作,通過部署這樣的系統結構,得以提高系統的整體效能。

對映模組工作流程

  • Nginx(負載均衡和讀取檔案的作用)
  • Tomcat站點(處理URL和實體地址對應關係和許可權程式邏輯)
  • MySql(儲存URL和檔案實體地址關係儲存)
檔案路徑解析流程步驟
  1. Nginx作為負載均衡,接受使用者請求,並將請求轉發到某個Tomcat例項上。
  2. Tomcat 通過查詢本地快取,得到實體地址,並將實體地址寫入Response Header中,其key為:X-Accel-Redirect。
  3. Nginx獲取到Response Header中包含X-Accel-Redirect,讀取其中的value,並再次將請求分發到fastdfs-nginx-module上。
  4. fastdfs-nginx-module返回資料給Nginx,使用者接收到檔案流,整體流程結束。

Nginx配置

WEB站點轉發規則配置
location / {
    proxy_pass  http://192.168.0.11:28085/;  #首先pass到應用伺服器
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

    client_max_body_size       10m;
    client_body_buffer_size    128k;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
}
Nginx檔案處理規則
location /app/M00 {
    charset utf-8;
    internal;	(表示這個只做Nginx內部處理)
    expires -1s;
    ngx_fastdfs_module;
    #proxy_pass http://192.168.0.11:38088;
}

檔案儲存系統整體結構圖

在這裡插入圖片描述
最後記得領紅包哦!!
在這裡插入圖片描述