FastDFS+nginx+php的完整應用
FastDFS功能簡介:
FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。
主頁地址:http://code.google.com/p/fastdfs/ #目前據說這上面已停止更新
FastDFS特點:
FastDFS主要解決了大容量的文件(主要是圖片、視頻、音頻等小文件)存儲和高併發訪問的問題,並在文件存取時實現了負載均衡。與其它類GFS系統相比,FastDFS最大的特點在於它是一個輕量級的系統,體現在以下幾個方面。
首先,FastDFS的結構比較簡單,主要由Client、Tracker server和Storage server三部分組成。Client通過Tracker server得到Storage server的信息,然後直接與Storage server通信訪問文件,避免了Tracker server成爲瓶頸。
第二,FastDFS不對文件進行分塊存儲,與支持文件分塊存儲的DFS相比,更加簡潔高效。
第三,FastDFS中的文件ID是由Storage server生成後返回給客戶端的。文件ID中包含了組號、文件相對路徑和文件名等(文件ID中還包含文件大小、時間戳、源Storage server IP地址、文件內容校驗碼、隨機數等),client可以根據文件ID直接定位到文件所在的組(但具體通過哪個Storage server下載需要詢問Tracker server根據負載均衡原則指定)。因此FastDFS不需要存儲文件索引信息。而其他文件系統則通常需要由NameServer存儲文件索引信息,如mogileFS採用MySQL數據庫來存儲文件索引以及系統相關的信息,而MySQL很容易成爲系統瓶頸。
FastDFS特性:
文件不分塊存儲,上傳的文件和OS文件系統中的文件一一對應
支持相同內容的文件只保存一份,節約磁盤空間
下載文件支持HTTP協議,可以使用內置Web Server,也可以和其他Web Server配合使用
支持在線擴容
支持主從文件
存儲服務器上可以保存文件屬性(meta-data)V2.0網絡通信採用libevent,支持大併發訪問,整體性能更好
FastDFS架構示意圖:
文件上傳流程:
1. Client詢問Tracker server應上傳到哪個Storage server;
2. Tracker server返回一臺可用的Storage server,返回的數據爲該Storage server的IP地址和端口;
3. Client直接和該Storage server建立連接,進行文件上傳。
4. Storage server返回新生成的文件ID,文件上傳結束。
5. 連接關閉。
文件下載流程:
1. client詢問tracker可以下載指定文件的storage,參數爲文件ID(組名和文件名);
2. tracker返回一臺可用的storage;
3. client直接和storage通信完成文件下載。
4. 連接關閉。
FastDFS論壇:http://bbs.chinaunix.net/forum-240-1.html
FastDFS google code:http://code.google.com/p/fastdfs/
關於tracker server 和 storage server之間是如何交互的,請看我在附件中的PPT、以及PDF格式的電子書,還有一個是關於配置文件的參數以及fastdfs各項參數是如何調優的,都有詳細的說明,下面就讓我們開始配置過程吧!
配置環境:
CentOS 5.8 x 64
tracker server: 192.168.25.204
storage server: 192.168.25.207
php 客戶端 :192.168.25.205
一、安裝部署
1、配置tracker server
解決依賴關係
[root@varnish ~]# tar xf libevent-2.0.21-stable.tar.gz [root@varnish ~]# cd libevent-2.0.21-stable [root@varnish libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent [root@varnish libevent-2.0.21-stable]# make [root@varnish libevent-2.0.21-stable]# make install [root@varnish libevent-2.0.21-stable]# echo '/usr/local/libevent/include/' >> /etc/ld.so.conf [root@varnish libevent-2.0.21-stable]# echo '/usr/local/libevent/lib/' >> /etc/ld.so.conf [root@varnish libevent-2.0.21-stable]# ldconfig
安裝fastdfs
注意:我們這裏使用的是最新版本的fastdfs,由於最新版的fastdfs取消了自帶的http功能,所以這裏我們就不對make.sh做修改。
[root@varnish ~]# tar xf FastDFS_v4.07.tar.gz [root@varnish ~]# cd FastDFS [root@varnish FastDFS]# ./make.sh C_INCLUDE_PATH=/usr/local/libevent/include/ LIBRARY_PATH=/usr/local/libevent/lib/ [root@varnish FastDFS]# ./make.sh install [root@varnish FastDFS]# ls /etc/fdfs/ client.conf http.conf mime.types storage.conf tracker.conf
配置文件解釋:
tracker.conf //負責均衡調度服務器配置文件
client.conf //客戶端上傳配置文件
http.conf //http服務器配置文件
storage.conf//文件存儲服務器配置文件
mime.types //文件類型配置文件
修改tracker server的配置文件
[root@varnish ~]# vim /etc/fdfs/tracker.conf bind_addr= 改爲 bind_addr=192.168.25.204 base_path=/home/yuqing/fastdfs 改爲 base_path=/data/fastdfs http.server_port=8080 改爲 http.server_port=80
創建/data/fastdfs,用於存放tracker日誌、storage server等信息
[root@varnish ~]# mkdir -p /data/fastdfs 啓動tracker server [root@varnish ~]# /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
2、配置storage server
上述安裝過程是一樣的這裏就不在進行演示,請大家見諒!
修改storage server的配置文件: [root@web2 ~]# vim /etc/fdfs/storage.conf bind_addr= 改爲 bind_addr=192.168.25.207 base_path=/home/yuqing/fastdfs 改爲 base_path=/data/fastdfs store_path0=/home/yuqing/fastdfs 改爲 store_path0=/data/fastdfs tracker_server=192.168.209.121:22122 改爲 tracker_server=192.168.25.204:22122 http.server_port=8888 改爲 http.server_port=80
創建數據目錄,並啓動storage server(有刷屏的感覺)
查看tracker和storage的鏈接情況:
3、測試上傳文件
我們這裏在tracker server上配置客戶端上傳文件
[root@varnish ~]# vim /etc/fdfs/client.conf base_path=/home/yuqing/fastdfs 改爲 base_path=/data/fastdfs tracker_server=192.168.0.197:22122 改爲 tracker_server=192.168.25.204:22122
上傳個文件,如果上傳成功,會返回一個url,我們記住這個url,等下要用到
http://192.168.25.207/group1/M00/00/00/wKgZz1IEYnSASqs2AAAGgpr6pLY3507236_big
二、在storage server上安裝nginx
1、安裝nginx關於fastdfs集合的擴展模塊,注意這個模塊nginx默認的編譯模塊中沒有,需手動下載安裝
[root@web2 ~]# tar xf fastdfs-nginx-module_v1.15.tar.gz [root@web2 ~]# cd fastdfs-nginx-module
只需解壓開就可,這裏我們再解釋一下,好些朋友,在加載這個模塊的時候,會報一些很莫名其妙的錯,這個本人在編譯的時候也是親身體會,百思不得其解,後來經過點播才發現,版本不匹配,這裏fastdfs官網給有詳細說明,請看模塊解壓目錄下的HISTORY、INSTALL問件,這裏面很詳細的安裝和版本匹配說明(吃一塹一定要長一智)
安裝nginx之前需要解決很多依賴關係的,這裏不做說明,我這裏是安裝過得了,就不貼出來了,請大家按照網上的教程,解決依賴關係!
[root@web2 ~]# tar xf nginx-1.4.1.tar.gz [root@web2 ~]# cd nginx-1.4.1 [root@web2 nginx-1.4.1]# ./configure \ > --prefix=/usr \ > --sbin-path=/usr/sbin/nginx \ > --conf-path=/etc/nginx/nginx.conf \ > --error-log-path=/var/log/nginx/error.log \ > --http-log-path=/var/log/nginx/access.log \ > --pid-path=/var/run/nginx/nginx.pid \ > --lock-path=/var/lock/nginx.lock \ > --user=nginx \ > --group=nginx \ > --with-http_ssl_module \ > --with-http_flv_module \ > --with-http_stub_status_module \ > --with-http_gzip_static_module \ > --http-client-body-temp-path=/var/tmp/nginx/client/ \ > --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ > --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ > --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ > --http-scgi-temp-path=/var/tmp/nginx/scgi \ > --with-pcre \ > --add-module=/root/fastdfs-nginx-module/src [root@web2 nginx-1.4.1]# make [root@web2 nginx-1.4.1]# make install
[root@web2 ~]# cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ [root@web2 ~]# vim /etc/fdfs/mod_fastdfs.conf base_path=/tmp 改爲 base_path=/data/fastdfs tracker_server=tracker:22122 改爲 tracker_server=192.168.25.204:22122 store_path0=/home/yuqing/fastdfs 改爲 store_path0=/data/fastdfs
[root@web2 ~]# ln -s /data/fastdfs/data /data/fastdfs/data/M00
修改nginx的配置文件
[root@web2 ~]# vim /etc/nginx/nginx.conf 在server段添加如下內容: location /group1/M00{ alias /data/fastdfs/data; ngx_fastdfs_module; } [root@web2 ~]# /usr/sbin/nginx -t ngx_http_fastdfs_set pid=28145 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@web2 ~]# /usr/sbin/nginx ngx_http_fastdfs_set pid=28148
然後我們在瀏覽器中輸入上邊上傳的url,訪問一下:
我們可以很清楚的看到400,Bad Request,那麼我們換種訪問方式試試
修改nginx的配置文件 [root@web2 ~]# vim /etc/nginx/nginx.conf location /M00{ alias /data/fastdfs/data; ngx_fastdfs_module; }
之後重啓服務 [root@web2 ~]# /usr/sbin/nginx -s stop ngx_http_fastdfs_set pid=28947 [root@web2 ~]# /usr/sbin/nginx ngx_http_fastdfs_set pid=28948
然後我們把url中的group1手動去掉,訪問一下:
很明顯可以訪問,我在配置的時候也是百思不得其解,網上也有此類問題,無意間打開了一個相關的帖子,終於讓我找到了答案。
我們把nginx的配置文件修改回來 location /group1/M00{ alias /data/fastdfs/data; ngx_fastdfs_module; }
修改fastdfs的模塊配置文件
[root@web2 ~]# vim /etc/fdfs/mod_fastdfs.conf url_have_group_name = false 改爲 true #關於啥意思,配置文件中有解釋
然後我們再來訪問一下:
如上圖所示,ok了,加上組名可以訪問,到這裏基本上已經配置完成了
但是我在網上搜解決上述解決方法時,看到了一篇博文,結合了php,我覺得有必要分享一下,那好繼續我們苦逼的配置吧!
三、PHP客戶端配置
因爲php的客戶端安裝也會依賴fastdfs本身的一些庫文件,所以請保證已經安裝了fastdfs
安裝過程和上邊一樣,這裏參考上邊安裝過程!
這個php客戶端所在的測試機本來我就在上邊搭建好了LNMP,所以只需參考上述過程安裝fastdfs即可!
[root@web1 ~]# cd /root/FastDFS/php_client [root@web1 php_client]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 [root@web1 php_client]# ./configure --with-php-config=/usr/local/php/bin/php-config [root@web1 php_client]# make && make install [root@web1 php_client]# cat fastdfs_client.ini >> /usr/local/php/etc/p pear.conf php-fpm.conf php-fpm.conf.default [root@web1 php_client]# cat fastdfs_client.ini >> /etc/php.ini
驗證模塊是否被正常加載
[root@web1 php_client]# /usr/local/php/bin/php -m | grep fastdfs_client fastdfs_client #說明模塊已加載
[root@web1 php_client]# cp ../conf/client.conf /etc/fdfs/ [root@web1 php_client]# vim /etc/fdfs/client.conf
修改爲如下配置:
tracker_server=192.168.25.204:22122 http.tracker_server_port=80
重新加載php [root@web1 php_client]# service php-fpm reload
然後我們寫個小頁面,寫個php腳本上傳
[root@web1 ~]# echo "php client is here." > /opt/upload.txt [root@web1 ~]# vim test.php <?php var_dump(function_exists('fastdfs_storage_upload_by_filename')); $ret = fastdfs_storage_upload_by_filename('/opt/upload.txt'); var_dump($ret); ?>
執行php腳本
[root@web1 ~]# /usr/local/php/bin/php test.php
結果如下圖所示:
我們來訪問下試試;
到此爲止我們關於fastdfs的完整應用就介紹到此了,希望大家都動手做一下!還有關於fastdfs php插件的使用方法和函數調用方法,可以看/root/FastDFS/php_client/README,裏面有詳細介紹!此篇博文過程中如果有什麼不對的地方,還請朋友們們指正,大家一起進步!