農民進城之初嘗FastDFS搭建圖片分佈式系統

於前不久,公司論壇的圖片終於將服務器給擠爆了,已經達到了恐怖的34G,服務器總容量才40G。若是直接加硬盤的話,那麼discuz中的邏輯幾乎就要全改,因此不行。若是將全部圖片扔到對象存儲的話,那麼這會是一大筆支出(雖然錢不是我出),因此仍是不行。沒辦法,只能本身來弄個圖片服務器。
附件容量php

爲何選擇 FastDFS

FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。html

最重要的是:當存儲空間不足或即將耗盡時,能夠動態添加捲。只須要增長一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。這樣的話,若是服務器上掛的硬盤滿了,只須要添加硬盤,再修改一下配置便可繼續使用。nginx

安裝 FastDFS

  1. 下載並安裝 FastDFS 依賴包 libfastcommon
    下載能夠到 這裏 直接下載再 scp 複製到服務器上。git

    root@ubuntu:/home/leung# unzip libfastcommon-master.zip
    root@ubuntu:/home/leung# cd libfastcommon-master
    root@ubuntu:/home/leung# ./make.sh
    root@ubuntu:/home/leung# ./make.sh install

    安裝完成以下圖:
    安裝依賴完成github

  2. 下載並安裝FastDFS
    下載能夠到 這裏 直接下載再 scp 複製到服務器上。ubuntu

    root@ubuntu:/home/leung# tar -xf FastDFS_v5.08.tar_2.gz
    root@ubuntu:/home/leung# cd FastDFS
    root@ubuntu:/home/leung# ./make.sh
    root@ubuntu:/home/leung# ./make.sh install

    查看是否有 fdfs 的命令可用:
    查看全部 fdfs 的命令vim

  3. 配置跟蹤服務器(tracker server)
    先將 fdfs 的默認配置複製到 fdfs 的配置路徑中: /etc/fdfs
    配置文件c#

    root@ubuntu:/home/leung/FastDFS# cp -r conf/* /etc/fdfs/
    root@ubuntu:/home/leung/FastDFS# ls /etc/fdfs/
    anti-steal.jpg  http.conf   storage.conf      tracker.conf
    client.conf     mime.types  storage_ids.conf

    修改 tracker 的配置文件, tracker.conf.其中最基本的修改配置爲:安全

    bind_addr: 修改成 YOUR_SERVER_IP ,我這裏設置爲虛擬機的IP: 192.168.0.144bash

    base_path: 修改成自定義的存儲路徑,我這裏爲 /data/fastdfs/tracker

    保存退出。

    新建 tracker 文件夾: mkdir -p /data/fastdfs/tracker

    嘗試啓動 tracker : (22122 爲tracker默認監聽端口)

    root@ubuntu:/etc/fdfs# fdfs_trackerd /etc/fdfs/tracker.conf
    root@ubuntu:/etc/fdfs# ss -lntup | grep 22122
    tcp    LISTEN     0      128    192.168.0.144:22122                 *:*                   users:(("fdfs_trackerd",pid=82767,fd=5))

    看到tracker已經在監聽22122端口,說明啓動成功。

  4. 配置存儲服務器(storage server)
    修改 storage 的配置文件storage.conf。其中最基本的修改配置爲:

    bind_addr: 修改成 YOUR_SERVER_IP ,我這裏設置爲虛擬機的IP: 192.168.0.144

    base_path: 修改成自定義的存儲路徑,我這裏爲 /data/fastdfs/storage

    storage_path0: 修改成自定義的存儲路徑,我這裏爲 /data/fastdfs/storage

    tracker_server: 修改成你的 tracker 監聽的ip和端口號,我這裏爲 192.168.0.144:22122

    http.server_port: 修改成你的 Nginx 監聽的端口號,我這裏是80端口

    保存退出。

    新建 storage 文件夾: mkdir -p /data/fastdfs/storage

    嘗試啓動 storage : (23000 爲tracker默認監聽端口)

    root@ubuntu:/etc/fdfs# fdfs_storaged /etc/fdfs/storage.conf
    root@ubuntu:/etc/fdfs# ss -lntup | grep 23000
    tcp    LISTEN     0      128    192.168.0.144:23000                 *:*                   users:(("fdfs_storaged",pid=82800,fd=5))

    看到storage已經在監聽23000端口,說明啓動成功。

  5. 文件上傳測試
    基本配置完成以後,須要上傳個文件測試看是否真的可用。

    修改 client.conf :

    base_path: 修改成tracker的路徑,我這裏爲 /data/fastdfs/tracker

    tracker_server: 修改成你的 tracker 監聽的ip和端口號,我這裏爲 192.168.0.144:22122

    保存退出。

    使用 fdfs_upload_file 測試上傳是否成功:

    root@ubuntu:/home/leung# fdfs_upload_file /etc/fdfs/client.conf /home/leung/gal_gadot.jpg
    group1/M00/00/00/wKgAkFk3zbeANnOvAAODyc0cLwA944.jpg
    root@ubuntu:/home/leung#

    看到返回來了一個 file_id (看上去像是文件路徑,在 fdfs系統中稱之爲 file_id )代表上傳圖片成功,該 tracker 和 storage 均是可用的。

在 Nginx 上使用 FastDFS

如今圖片是傳上去了,可是怎麼能查看到呢?

這時候須要配置 Nginx 了。(Apache沒試過)

先下載 Nginx 的 fdfs 模塊,並修改模塊配置文件(這裏有個坑,不修改的話,可能在安裝的時候報錯)

root@ubuntu:/home/leung/# wget https://nchc.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
root@ubuntu:/home/leung/# tar xf fastdfs-nginx-module_v1.16.tar.gz
root@ubuntu:/home/leung/# cd fastdfs-nginx-module/src/
root@ubuntu:/home/leung/fastdfs-nginx-module/src/# vim config
// 進入編輯後,直接輸入 `:%s+/usr/local/+/usr/+g` 包括 `:` ,替換全文的 `/usr/local` 配置路徑,保存退出

拷貝fastdfs-nginx-module模塊中配置文件到/etc/fdfs目錄中並編輯:

root@ubuntu:/home/leung/fastdfs-nginx-module/src# cp mod_fastdfs.conf /etc/fdfs/
root@ubuntu:/home/leung/fastdfs-nginx-module/src# cd /etc/fdfs/
root@ubuntu:/etc/fdfs# vi mod_fastdfs.conf

修改配置項:

connect_timeout: 鏈接超時時間,我這裏設置爲 10 秒

base_path: 路徑,我這裏沒動,默認爲/tmp

tracker_server:服務器tracker 的監聽ip和端口,我這裏設置爲 192.168.0.144:22122

storage_server_port:storage 監聽端口,我這裏是默認的 23000

url_have_group_name:url是否帶上 group_name,這裏最好設置爲true,要不待會 Nginx 會報400的錯誤

store_path0:修改成storage的存儲路徑,我這裏爲 /data/fastdfs/storage

group_name:設置爲默認group1便可。

編輯完畢,保存退出。

安裝 Nginx 依賴庫:

For Ubuntu: apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev -y

For CentOS: yum install -y pcre-devel zlib-devel

由於虛擬機剛剛安裝,因此先安裝 Nginx。

root@ubuntu:/home/leung# wget https://nginx.org/download/nginx-1.13.1.tar.gz
root@ubuntu:/home/leung# ls
FastDFS  FastDFS_v5.08.tar_2.gz  gal_gadot.jpg  libfastcommon-master  libfastcommon-master.zip  nginx-1.13.1.tar.gz
root@ubuntu:/home/leung# tar -xf nginx-1.13.1.tar.gz
root@ubuntu:/home/leung# cd nginx-1.13.1
root@ubuntu:/home/leung/nginx-1.13.1# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
root@ubuntu:/home/leung/nginx-1.13.1# ./configure --prefix=/usr/local/nginx/  --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --add-module=/home/leung/fastdfs-nginx-module/src/
root@ubuntu:/home/leung/nginx-1.13.1# make && make install

注意,若是不是新安裝的 nginx,請先執行 nginx -V 查看當前nginx已安裝的模塊,再加上 fdfs 的模塊。而且,覆蓋安裝的話請不要 make install ,具體看下面的操做

若是已經安裝過Nginx的話,只須要加上新模塊從新編譯便可。

先執行 nginx -V 查看當前nginx已安裝的模塊,以下圖,個人服務器以前使用 apt 安裝的,因此安裝的模塊有點多:
Nginx配置

configure arguments: 後的參數拷貝下載,放在 ./configure 後面,再加上 --add-module=/home/leung/fastdfs-nginx-module/src/ 便可,add-module後的路徑請根據實際狀況進行替換.

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --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.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed' --add-module=/home/leung/fdfs/fastdfs-nginx-module/src/

完畢後只執行 make,不要執行 make install
先將原來的nginx 執行文件備份:我這裏的執行路徑爲上述的 /usr/sbin/nginx ,你們替換成真實的路徑。

root@localhost:~# mv /usr/sbin/nginx /usr/sbin/nginx-bak
root@localhost:/home/leung/fdfs/nginx-1.13.1# cp objs/nginx /usr/sbin/nginx
root@localhost:/home/leung/fdfs/nginx-1.13.1# nginx -v
nginx version: nginx/1.13.1
root@localhost:/home/leung/fdfs/nginx-1.13.1# nginx -V

能夠看到已經加上 fdfs 的模塊了,這時候就能夠平滑升級 nginx:
新版nginx配置

root@localhost:/home/leung/fdfs/nginx-1.13.1# make upgrade
/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
kill -USR2 `cat /var/run/nginx.pid`
sleep 1
test -f /var/run/nginx.pid.oldbin
kill -QUIT `cat /var/run/nginx.pid.oldbin`
root@localhost:/home/leung/fdfs/nginx-1.13.1#

Nginx 的升級/安裝到這裏就完成了。

在 Nginx 配置文件中加入一句:

location /group[0-9]/ {
    ngx_fastdfs_module;
}

重啓 Nginx ,訪問你的網站,就能夠看到圖片了。
訪問圖片

PHP與FDFS的交集

一個簡易的服務器終於跑起來了,能正常上傳和下載。可是,總不可能每次上傳圖片都要用命令行吧,這樣既不安全,又麻煩。仍是PHP大法好。

PHP要支持fdfs的話,就須要安裝 php 的 fdfs 拓展。

root@localhost:~# cd /home/leung/fdfs/FastDFS/php_client
root@localhost:/home/leung/fdfs/FastDFS/php_client# phpize
root@localhost:/home/leung/fdfs/FastDFS/php_client# ./configure --with-php-config=/usr/local/php5/bin/php-config
root@localhost:/home/leung/fdfs/FastDFS/php_client# make && make install
root@localhost:/home/leung/fdfs/FastDFS/php_client# cat fastdfs_client.ini >> /usr/local/php5/etc/php.ini

其中, --with-php-config 後面接的是你的 php-config 的路徑,不知道的直接 ./configure 試試(個人是 apt 安裝的直接 configure 就能夠了)

運行 php -m | grep fastdfs 查看是否安裝模塊成功
安裝模塊成功
重啓 php-fpm : service php-fpm restart

root@localhost:/etc/php/7.0/fpm# cat /run/php/php7.0-fpm.pid
17904
root@localhost:/etc/php/7.0/fpm# kill -USR2 17904

測試PHP上傳圖片

新建php文件:

<?php
$fileId = fastdfs_storage_upload_by_filename1('/home/leung/test.jpg', 'jpg');
echo $fileId;

運行php文件:

root@localhost:/home/leung# php fdfs.php
group1/M00/00/02/eBmZrlk6cU-AY-cLAAQ9NyZsxTs546.jpg
root@localhost:/home/leung#

可見,該函數直接返回了一個 fileId 。即爲上傳圖片成功:
成功上傳圖片

相關文章
相關標籤/搜索