Nginx+FastDFS

如果要想單獨使用Nginx程序你直接進行nginx源代碼上傳即可,但是這樣的源代碼是無法在實際的開發之中使用的,如果要想使用nginx還需要準備出一些模塊組件。

1.將nginx的源代碼以及組件模塊源代碼進行上傳,隨後進行解壓縮:

解壓nginx-1.11.3.tar.gztar xzvf /srv/ftp/nginx-1.11.3.tar.gz -C /usr/local/src/
解壓echo-nginx-module-0.59.tar.gztar xzvf /srv/ftp/echo-nginx-module-0.59.tar.gz -C /usr/local/src/
解壓nginx-upstream-fair-a18b409.tar.gztar xzvf /srv/ftp/nginx-upstream-fair-a18b409.tar.gz -C /usr/local/src/
解壓ngx_cache_purge-2.3.tar.gztar xzvf /srv/ftp/ngx_cache_purge-2.3.tar.gz -C /usr/local/src/

2.爲了方便進行統一的管理,nginx最終編譯後的保存目錄設置在/usr/local目錄之中:

mkdir -p /usr/local/nginx/{logs,conf,fastcgi_temp,sbin,client_body_temp,proxy_temp,uwsgi_temp,scgi_temp}

3.進入到nginx源代碼的目錄:cd /usr/local/src/nginx-1.11.3/

4.進行編譯的配置

./configure --prefix=/usr/local/nginx/ \
--sbin-path=/usr/local/nginx/sbin/  \
--with-http_ssl_module \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp \
--http-client-body-temp-path=/usr/local/nginx/client_body_temp \
--http-proxy-temp-path=/usr/local/nginx/proxy_temp \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp \
--http-scgi-temp-path=/usr/local/nginx/scgi_temp \
--add-module=/usr/local/src/echo-nginx-module-0.59 \
--add-module=/usr/local/src/gnosek-nginx-upstream-fair-a18b409 \
--add-module=/usr/local/src/ngx_cache_purge-2.3

5.進行nginx源代碼的編譯與安裝:make && make install

6.當編譯完成之後就可以通過安裝目錄查看到執行程序:/usr/local/nginx/sbin/nginx

  1. 啓動nginx服務:/usr/local/nginx/sbin/nginx

  2. 通過瀏覽器訪問:http://192.168.125.167

FastDFS安裝與配置

首先FastDFS給出的開發包依然是源代碼開發包,本次使用的開發包版本爲FastDFS_v5.08.tar.gz。但是如果要想編譯此源代碼,則需要首先獲得一些額外的開發包的支持:libfastcommon

配置libfastcommon組件包

1.要通過github上去下載libfastcommon組件包的源代碼:
下載地址:https://github.com/mldn/libfastcommon.git

2.將libfastcommon源代碼下載到/usr/local/src目錄之中;

  • 首先進入到此目錄:cd /usr/local/src/
  • 使用git克隆源代碼:git clone https://github.com/mldn/libfastcommon.git

3.進入到libfastcommon所在的目錄之中:cd /usr/local/src/libfastcommon/

4.進行項目的編譯與安裝處理:

  • 在libfastcommon組件裏面提供有make指令,使用本地的:./make.sh
  • 隨後進行安裝:./make.sh install
  • 安裝完成之後會發現一些重要的信息:
mkdir -p /usr/lib64 
mkdir -p /usr/lib 
install -m 755 libfastcommon.so /usr/lib64 
install -m 755 libfastcommon.so /usr/lib

5.此時發現存在有一些重要的文件存儲路徑,如果要想正常進行編譯處理,需要做一個軟連接。

ln -sv /usr/include/fastcommon/ /usr/local/include/fastcommon 
ln -sv /usr/lib/libfastcommon.so /usr/local/lib/libfastcommon.so

這種情況下你纔可以進行FastDFS的編譯處理。

編譯FastDFS源代碼

1.將FastDFS的源代碼的文件上傳到Linux系統之中,隨後將其解壓縮到/usr/local/src目錄之中;

tar xzvf /srv/ftp/FastDFS_v5.08.tar.gz -C /usr/local/src/

2.進入到FastDFS源代碼目錄:cd /usr/local/src/FastDFS/

3.進行項目的編譯處理:./make.sh

進行安裝:./make.sh install

4.如果要想確認當前的配置是否已經真正安裝成功,最好的檢測方法是查看/etc/fdfs目錄,如果可以在目錄中發現有如下的文件信息,則表示FastDFS安裝成功:

  • tracker.conf.sample:tracker的配置文件;
  • storage.conf.sample:storage的配置文件;
  • client.conf.sample:客戶端配置文件。

配置FastDFS

現在成功的實現了FastDFS編譯處理,那麼隨後就需要對其進行配置,如果要按照標準配置來講,現在肯定需要有一個tracker,隨後還需要提供有storage,但是FastDFS如果要想使用,則必須與Nginx進行有效結合。本次使用的主機列表如下:

主機名稱 IP地址 描述
fastdfs-tracker 192.168.125.165 FastDFS-Tracker、FastDFS-Client
fastdfs-storage-a 192.168.125.166 FastDFS-Storage

1.【fastdfs-tracker】通過給定的模版做一個複製:

cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

2.【fastdfs-tracker】進行模版的配置:

  • 所有的服務進程一定要有一個數據的保存目錄,建立目錄:mkdir -p /usr/data/fdfs/tracker
  • 修改tracker.conf的配置文件:vim /etc/fdfs/tracker.conf
base_path=/usr/data/fdfs/tracker

3.【fastdfs-storage】複製一份配置的模版文件:cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

  • storage負責存儲,也一定需要有一個存儲目錄:mkdir -p /usr/data/fdfs/storage
  • 編輯storage.conf配置文件:vim /etc/fdfs/storage.conf

數據目錄:base_path=/usr/data/fdfs/storage
備份目錄:store_path0=/usr/data/fdfs/storage
設置tracker路徑:tracker_server=192.168.68.180:22122

4.**【fastdfs-tracker】**FastDFS專門提供了測試的命令工具,需要進行一些配置:

  • 複製出一份配置文件:cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
  • 建立一個客戶端的數據目錄:mkdir -p /usr/data/fdfs/client
  • 編輯客戶端配置文件:vim /etc/fdfs/client.conf

數據保存路徑:base_path=/usr/data/fdfs/client
Tracker連接地址:tracker_server=192.168.68.180:22122

5.【fastdfs-tracker】啓動tracker服務:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

6.【fastdfs-storage-a】啓動storage服務:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

7.【fastdfs-tracker】啓動客戶端進行測試:

首先需要上傳一個文件:/usr/bin/fdfs_test /etc/fdfs/client.conf upload /srv/ftp/a.jpg上傳完成之後會返回如下的路徑信息:

http://192.168.125.166/group1/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg

8.【fastdfs-tracker】進行狀態監控:/usr/bin/fdfs_monitor /etc/fdfs/client.conf

9.【fastdfs-tracker】取得文件信息:/usr/bin/fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg

root@fastdfs-tracker:/srv/ftp# /usr/bin/fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347.jpg
source storage id: 0
source ip address: 192.168.125.166
file create timestamp: 2017-06-09 22:57:35
file size: 21483
file crc32: 1505696701 (0x59BF1BBD)

10.【fastdfs-tracker】下載文件:/usr/bin/fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg

11.【fastdfs-tracker】刪除文件:
/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg
它適合於做專門的圖像文件的存儲服務器。

在storage上配置nginx

如果要想顯示FDFS中的文件內容,則一定需要通過WEB服務器完成,那麼現在最簡單的做法就是直接使用nginx進行處理。
1、【fastdfs-storage-a】**現在如果要想讓fdfs可以在nginx上顯示有一點非常麻煩,就是需要配置一系列的組件模塊,將這些模塊上傳到Linux系統之中,而後進行解壓縮:

解壓縮nginx-1.11.3.tar.gztar xzvf /srv/ftp/nginx-1.11.3.tar.gz -C /usr/local/src/
解壓縮echo-nginx-module-0.59.tar.gztar xzvf /srv/ftp/echo-nginx-module-0.59.tar.gz -C /usr/local/src/
解壓縮ngx_cache_purge-2.3.tar.gztar xzvf /srv/ftp/ngx_cache_purge-2.3.tar.gz -C /usr/local/src/
解壓縮nginx-upstream-fair-a18b409.tar.gztar xzvf /srv/ftp/nginx-upstream-fair-a18b409.tar.gz -C /usr/local/src/
解壓縮fastdfs-nginx-module_v1.16.tar.gztar xzvf /srv/ftp/fastdfs-nginx-module_v1.16.tar.gz -C /usr/local/src/
解壓縮pcre-8.36.tar.gztar xzvf /srv/ftp/pcre-8.36.tar.gz -C /usr/local/src/
解壓縮zlib-1.2.8.tar.gztar xvf /srv/ftp/zlib-1.2.8.tar.gz -C /usr/local/src/

2.【fastdfs-storage-a】建立nginx編譯後的保存目錄:

mkdir -p /usr/local/nginx/{logs,conf,fastcgi_temp,sbin,client_body_temp,proxy_temp,uwsgi_temp,scgi_temp}

3.【fastdfs-storage-a】進入到nginx源代碼所在的目錄之中:cd /usr/local/src/nginx-1.11.3/

4.【fastdfs-storage-a】進行編譯處理:

./configure --prefix=/usr/local/nginx/ \
--sbin-path=/usr/local/nginx/sbin/ \
--with-http_ssl_module \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp \
--http-client-body-temp-path=/usr/local/nginx/client_body_temp \
--http-proxy-temp-path=/usr/local/nginx/proxy_temp \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp \
--http-scgi-temp-path=/usr/local/nginx/scgi_temp \
--add-module=/usr/local/src/echo-nginx-module-0.59 \
--add-module=/usr/local/src/gnosek-nginx-upstream-fair-a18b409 \
--add-module=/usr/local/src/ngx_cache_purge-2.3 \
--add-module=/usr/local/src/fastdfs-nginx-module/src \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-pcre=/usr/local/src/pcre-8.36

5.【fastdfs-storage-a】編譯並安裝nginx:make && make install

6.【fastdfs-storage-a】如果要想將nginx與fastdfs整合,則需要有一個配置文件。

  • 拷貝配置文件:cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
  • 編輯mod_fastdfs.conf配置文件:vim /etc/fdfs/mod_fastdfs.conf

配置存儲的路徑:base_path=/usr/data/fdfs/storage
設置tracker路徑:tracker_server=192.168.125.166:22122
設置組名稱:group_name=group1
URL路徑上是否需要編寫組名稱:url_have_group_name=true
設置存儲節點:store_path0=/usr/data/fdfs/storage

7.【fastdfs-storage-a】複製兩個重要的與http訪問有關的配置文件:

  • 複製http.conf配置文件:cp /usr/local/src/FastDFS/conf/http.conf /etc/fdfs/
  • 拷貝mime.types配置文件:cp /usr/local/src/FastDFS/conf/mime.types /etc/fdfs/

8.【fastdfs-storage-a】爲了可以讓nginx找到所需要的圖像內容,還需要設置一個軟連接:

ln -s /usr/data/fdfs/storage/data/ /usr/data/fdfs/storage/M00

9.【fastdfs-storage-a】修改nginx配置文件:vim /usr/local/nginx/conf/nginx.conf

修改監聽端口:listen 9999;
進行storage訪問:

location ~/group[1-3]/M00 { 
    root /usr/data/fdfs/storage/ ; 
    ngx_fastdfs_module ; 
}

10.【fastdfs-storage-a】測試一下配置文件:/usr/local/nginx/sbin/nginx -t

  • 啓動nginx服務:/usr/local/nginx/sbin/nginx
  • 打開瀏覽器測試:http://192.168.125.166:9999/group1/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg

配置第二臺storage主機

現在已經成功的實現了一個單節點配置,那麼隨後還需要準備出第二臺節點,考慮到整體的編譯的複雜度以及nginx的配置的複雜度,所以將之前的虛擬機做了一個複製。
1.【fastdfs-storage-b】修改storage.conf配置文件:vim /etc/fdfs/storage.conf
設置新主機爲第二組:group_name=group2

2.【fastdfs-storage-b】修改mod_fastdfs配置文件:vim /etc/fdfs/mod_fastdfs.conf
設置新主機爲第二組:group_name=group2

3.【fastdfs-storage-b】啓動nginx服務:/usr/local/nginx/sbin/nginx

4.【fastdfs-storage-b】啓動storage服務:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

5.【fastdfs-tracker】檢測一下所有從節點:/usr/bin/fdfs_monitor /etc/fdfs/client.conf
只要你的storage主機配置好了tracker地址,那麼一定可以自動找到;

在Tracker上配置Nginx

現在所有的storage節點都已經被tracker所管理,而每一個storage主機上都存在有一個自己的nginx,但是如果要想訪問肯定要通過tracker訪問比較合適,那麼下面就需要在tracker主機上進行nginx的配置處理。

1.【fastdfs-tracker】將所需要的nginx開發包上傳到系統之中:

解壓縮nginx-1.11.3.tar.gztar xzvf /srv/ftp/nginx-1.11.3.tar.gz -C /usr/local/src/
解壓縮echo-nginx-module-0.59.tar.gztar xzvf /srv/ftp/echo-nginx-module-0.59.tar.gz -C /usr/local/src/
解壓縮ngx_cache_purge-2.3.tar.gztar xzvf /srv/ftp/ngx_cache_purge-2.3.tar.gz -C /usr/local/src/
解壓縮nginx-upstream-fair-a18b409.tar.gztar xzvf /srv/ftp/nginx-upstream-fair-a18b409.tar.gz -C /usr/local/src/
解壓縮pcre-8.36.tar.gztar xzvf /srv/ftp/pcre-8.36.tar.gz -C /usr/local/src/
解壓縮zlib-1.2.8.tar.gztar xvf /srv/ftp/zlib-1.2.8.tar.gz -C /usr/local/src/

2.【fastdfs-tracker】建立nginx保存的目錄:

mkdir -p /usr/local/nginx/{logs,conf,fastcgi_temp,sbin,client_body_temp,proxy_temp,uwsgi_temp,scgi_temp}

3.【fastdfs-tracker】進入到nginx源代碼目錄:cd /usr/local/src/nginx-1.11.3/

  • 進行編譯配置:
./configure --prefix=/usr/local/nginx/ \
--sbin-path=/usr/local/nginx/sbin/ \
--with-http_ssl_module \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp \
--http-client-body-temp-path=/usr/local/nginx/client_body_temp \
--http-proxy-temp-path=/usr/local/nginx/proxy_temp \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp \
--http-scgi-temp-path=/usr/local/nginx/scgi_temp \
--add-module=/usr/local/src/echo-nginx-module-0.59 \
--add-module=/usr/local/src/gnosek-nginx-upstream-fair-a18b409 \
--add-module=/usr/local/src/ngx_cache_purge-2.3 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-pcre=/usr/local/src/pcre-8.36
  • 編譯與安裝:make && make install

4.**【fastdfs-tracker】**nginx本身帶有緩存功能, 所以爲了保證讀取速度快,追加緩存配置所在目錄:

mkdir -p /usr/data/nginx/{cache,tmp}

5.【fastdfs-tracker】配置nginx文件:vim /usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  65536;
    use epoll;
}


http {
    include mime.types; 
    default_type application/octet-stream; 
    server_names_hash_bucket_size 128; 
    client_header_buffer_size 32k; 
    large_client_header_buffers 4 32k; 
    client_max_body_size 300m; 
    proxy_redirect off; 
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_connect_timeout 90; 
    proxy_send_timeout 90; 
    proxy_read_timeout 90; 
    proxy_buffer_size 16k; 
    proxy_buffers 4 64k; 
    proxy_busy_buffers_size 128k; 
    proxy_temp_file_write_size 128k; 
    proxy_cache_path /usr/data/nginx/cache levels=1:2 keys_zone=http-cache:500m max_size=10g inactive=30d; proxy_temp_path /usr/data/nginx/tmp;

    upstream fdfs_group1 { 
        server 192.168.125.166:9999 weight=1 max_fails=2 fail_timeout=30s; 
    } 
    upstream fdfs_group2 { 
        server 192.168.125.170:9999 weight=1 max_fails=2 fail_timeout=30s; 
    }

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
    # '$status $body_bytes_sent "$http_referer" ' 
    # '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log logs/access.log main;

    sendfile on; 
    #tcp_nopush on; 

    #keepalive_timeout 0; 
    keepalive_timeout 65; 

    #gzip on;

    server { 
        listen 80; 
        server_name localhost; 

        #charset koi8-r; 

        #access_log logs/host.access.log main; 
        location /group1/M00 {
            proxy_next_upstream http_502 http_504 error timeout invalid_header; 
            proxy_cache http-cache; 
            proxy_cache_valid 200 304 12h; 
            proxy_cache_key $uri$is_args$args; 
            proxy_pass http://fdfs_group1; 
            expires 30d; 
        }
        location /group2/M00 { 
            proxy_next_upstream http_502 http_504 error timeout invalid_header; 
            proxy_cache http-cache; 
            proxy_cache_valid 200 304 12h; 
            proxy_cache_key $uri$is_args$args; 
            proxy_pass http://fdfs_group2; 
            expires 30d; 
        } 
        location ~ /purge(/.*) { 
            allow 127.0.0.1; 
            allow 192.168.125.0/24; 
            deny all; 
            proxy_cache_purge http-cache $1$is_args$args; 
        }

        location / { 
            root html; 
            index index.html index.htm; 
        }


        #error_page 404 /404.html; 
        # redirect server error pages to the static page /50x.html 
        # error_page 500 502 503 504 /50x.html;

        location = /50x.html { 
            root html; 
        }


        # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
        # 
        #location ~ \.php$ { 
        #   proxy_pass http://127.0.0.1; 
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
        # 
        #location ~ \.php$ { 
        #   root html; 
        #   fastcgi_pass 127.0.0.1:9000; 
        #   fastcgi_index index.php; 
        #   fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
        # include fastcgi_params; 
        #} 
        # deny access to .htaccess files, if Apache's document root 
        # concurs with nginx's one 
        # 
        #location ~ /\.ht { 
        #   deny all; 
        #} 
    }

    # another virtual host using mix of IP-, name-, and port-based configuration 
    # 
    #server { 
    #   listen 8000; 
    #   listen somename:8080; 
    #   server_name somename alias another.alias; 
    #   location / { 
    #       root html; 
    #       index index.html index.htm; 
    #   } 
    #}

    # HTTPS server 
    # #server { 
    #   listen 443 ssl; 
    #   server_name localhost; 
    #   ssl_certificate cert.pem; 
    #   ssl_certificate_key cert.key; 
    #   ssl_session_cache shared:SSL:1m; 
    #   ssl_session_timeout 5m;
    #   ssl_ciphers HIGH:!aNULL:!MD5; 
    #   ssl_prefer_server_ciphers on; 
    #   location / { 
    #       root html; 
    #       index index.html index.htm; 
    #   } 
    #} 

}

6.【fastdfs-tracker】檢測nginx配置文件:`/usr/local/nginx/sbin/nginx -t

http://192.168.125.170/group2/M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg

使用Java操作FastDFS

Java操作FastDFS只需要一個開發包即可,但是這個開發包很忐忑,這個FastDFS開發包不知道爲什麼總是在變。

1.建立一個新的Maven項目,隨後修改pom.xml配置文件:

<dependency> 
    <groupId>com.github.kischang</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>0.1</version>
</dependency>

2.建立一個資源文件:fastdfs_client.conf:

# 配置上你tracker的連接地址
tracker_server=192.168.125.165:22122

3.編寫文件上傳:

package cn.mldn.fastdfs;

import java.io.File;
import java.util.Arrays;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;

public class FastDFSUploadFile {

    public static void main(String[] args) throws Exception {
        File imgFile = new File("D:" + File.separator + "my.jpg"); // 要上傳的文件
        // 如果要想進行上傳則一定需要獲取到文件的擴展名稱
        String fileExtName = imgFile.getName()
                .substring(imgFile.getName().lastIndexOf(".") + 1);
        // 通過ClassPath路徑獲取要使用的配置文件
        ClassPathResource classPathResource = new ClassPathResource(
                "fastdfs_client.conf");
        // 進行客戶端訪問的整體配置,需要知道配置文件的完整路徑
        ClientGlobal.init(classPathResource.getClassLoader()
                .getResource("fastdfs_client.conf").getPath());
        // FastDFS的核心操作在於tracker處理上,所以此時需要定義Tracker客戶端
        TrackerClient trackerClient = new TrackerClient();
        // 定義TrackerServer的配置信息
        TrackerServer trackerServer = trackerClient.getConnection();
        // 在整個FastDFS之中真正負責幹活的就是Storage
        StorageServer storageServer = null;
        StorageClient storageClient = new StorageClient(trackerServer,
                storageServer);
        // 定義上傳文件的元數據
        NameValuePair[] metaList = new NameValuePair[3];
        metaList[0] = new NameValuePair("fileName", imgFile.getName());
        metaList[1] = new NameValuePair("fileExtName", fileExtName);
        metaList[2] = new NameValuePair("fileLength",
                String.valueOf(imgFile.length()));

        // 如果要上傳則使用trackerClient對象完成
        String[] upload_file = storageClient.upload_file(imgFile.getPath(), fileExtName, metaList) ;
        System.out.println(Arrays.toString(upload_file));
        trackerServer.close();
    }

}

現在上傳完成後會給出兩個內容:組名稱、文件路徑名稱,如果現在只想獲得完整名稱,則更換一個類:

StorageClient1 storageClient = new StorageClient1(trackerServer,storageServer);
String upload_file = storageClient.upload_file1(imgFile.getPath(), fileExtName, metaList) ;

4.刪除文件:

package cn.mldn.fastdfs;

import java.io.File;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;

public class FastDFSDeleteFile {

    public static void main(String[] args) throws Exception {
        File imgFile = new File("D:" + File.separator + "my.jpg"); // 要上傳的文件
        // 如果要想進行上傳則一定需要獲取到文件的擴展名稱
        String fileExtName = imgFile.getName()
                .substring(imgFile.getName().lastIndexOf(".") + 1);
        // 通過ClassPath路徑獲取要使用的配置文件
        ClassPathResource classPathResource = new ClassPathResource(
                "fastdfs_client.conf");
        // 進行客戶端訪問的整體配置,需要知道配置文件的完整路徑
        ClientGlobal.init(classPathResource.getClassLoader()
                .getResource("fastdfs_client.conf").getPath());
        // FastDFS的核心操作在於tracker處理上,所以此時需要定義Tracker客戶端
        TrackerClient trackerClient = new TrackerClient();
        // 定義TrackerServer的配置信息
        TrackerServer trackerServer = trackerClient.getConnection();
        // 在整個FastDFS之中真正負責幹活的就是Storage
        StorageServer storageServer = null;
        StorageClient storageClient = new StorageClient(trackerServer,
                storageServer);
        int delete_file = storageClient.delete_file("group2", "M00/00/00/wKh9plk6t1-AYS1VAABT61m_G70347_big.jpg") ;
        System.out.println(delete_file);
        trackerServer.close();
    }

}

刪除成功返回的內容是0。

FastDFS安全配置

訪問列表

FastDFS圖片服務器的安全主要通過兩個層面來解決:iptables做一個過濾列表,在tracker裏面可以設置黑白名單。

1.【fastdfs-tracker】打開tracker配置文件:vim /etc/fdfs/tracker.conf

allow_hosts=192.168.125.[165,164-168]

重新啓動tracker服務:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
測試圖片上傳:

/usr/bin/fdfs_test /etc/fdfs/client.conf upload /srv/ftp/b.jpg

上傳成功:

http://192.168.125.166/group1/M00/00/00/wKh9plk8CeWATsUTAABT61m_G70589_big.jpg

以上的配置沒有問題,但是很多的時候有可能有各種原因導致程序出現無法使用,最穩妥的做法還是使用iptables控制。

盜鏈防範

現在圖片服務器雖然搭建完成了,但是整個的圖片服務器會有一個問題存在,用戶只需要知道你的訪問地址,就可以進行圖片的展示,也就是說有可能會有大量的人員直接利用你自己服務器的資源來爲自己服務,這樣的設計明顯不復合於實際的要求,所以現在需要開啓盜鏈防範。

1.【fastdfs-storage-*】修改http.conf配置文件:vim /etc/fdfs/http.conf

  • 將盜鏈顯示錯誤圖片上傳,並且將盜鏈圖片保存到/etc/fdfs目錄下:mv /srv/ftp/noauth.gif /etc/fdfs/
  • 爲了讓圖片可以使用,還需要設置一個權限:chmod 777 /etc/fdfs/noauth.gif

開啓token驗證:http.anti_steal.check_token=true
設置連接的密鑰:http.anti_steal.secret_key=FastDFS1234567890
出現盜鏈後的顯示圖片:http.anti_steal.token_check_fail=/etc/fdfs/noauth.gif

重新啓動storage服務:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

2.【fastdfs-storage-*】隨後要修改程序,因爲token只有程序可以生成,修改一下fastdfs_client.conf文件:

// 配置上你tracker的連接地址 
tracker_server=192.168.125.165:22122 
//表示現在要進行token檢測 
http.anti_steal_token=true 
//進行認證的密碼處理 
http.secret_key=FastDFS1234567890

3.【fastdfs-storage-*】重新啓動nginx服務:/usr/local/nginx/sbin/nginx -s reload

4.編寫一個生成token信息的操作;

package cn.mldn.fastdfs;

import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.ProtoCommon;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;

public class FastDFSToken {

    public static void main(String[] args) throws Exception {
        // 通過ClassPath路徑獲取要使用的配置文件
        ClassPathResource classPathResource = new ClassPathResource(
                "fastdfs_client.conf");
        // 進行客戶端訪問的整體配置,需要知道配置文件的完整路徑
        ClientGlobal.init(classPathResource.getClassLoader()
                .getResource("fastdfs_client.conf").getPath());
        // FastDFS的核心操作在於tracker處理上,所以此時需要定義Tracker客戶端
        TrackerClient trackerClient = new TrackerClient();
        // 定義TrackerServer的配置信息
        TrackerServer trackerServer = trackerClient.getConnection();
        String fileId = "M00/00/00/wKh9plk8CeWATsUTAABT61m_G70589_big.jpg" ;
        int ts = (int) (System.currentTimeMillis() / 1000) ;// 時間參考
        StringBuffer fileUrl = new StringBuffer() ;
        fileUrl.append("http://") ;
        fileUrl.append(trackerServer.getInetSocketAddress().getHostString()) ;
        fileUrl.append("/group2/").append(fileId) ;
        fileUrl.append("?token=").append(ProtoCommon.getToken(fileId, ts, ClientGlobal.g_secret_key)) ;
        fileUrl.append("&ts=").append(ts) ;
        System.out.println(fileUrl);
        trackerServer.close();
    }

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