Nginx + FastDFS檔案儲存系統服務對映架構設計
阿新 • • 發佈:2018-12-12
由於我們做的國外遊戲運營業務,有大量的遊戲檔案,圖片等資源都需要儲存,而考慮到成本問題,我們都是自己買阿里雲伺服器,然後自己手工搭建檔案儲存服務,之前都是按教程安裝,然後使用;後來我們為了安全,下載遊戲連結防盜鏈,然後遊戲下載連結都是動態生成,而且想做到遊戲連結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和檔案實體地址關係儲存)
檔案路徑解析流程步驟
- Nginx作為負載均衡,接受使用者請求,並將請求轉發到某個Tomcat例項上。
- Tomcat 通過查詢本地快取,得到實體地址,並將實體地址寫入Response Header中,其key為:X-Accel-Redirect。
- Nginx獲取到Response Header中包含X-Accel-Redirect,讀取其中的value,並再次將請求分發到fastdfs-nginx-module上。
- 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;
}
檔案儲存系統整體結構圖
最後記得領紅包哦!!