FastDFS+nginx+php的完整應用

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,裏面有詳細介紹!此篇博文過程中如果有什麼不對的地方,還請朋友們們指正,大家一起進步!





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章