创建fastdfs用户和组(给fastdfs用户sudo权限)
##设置root用户密码为root
sudo passwd root;
##切换到root用户
su - root
## 给fastdfs sudo权限
visudo
##找到root ALL=(ALL) ALL行,在下面添加一行
fastdfs ALL=(ALL) ALL
##退出到fastdfs用户
安装编译工具和必要的库(FastDFS安装包,nginx安装包,fastdfs-nginx-module源码包,)
# nginx 中gzip模块需要 zlib 库,rewrite模块需要 pcre 库,ssl 功能需要openssl库
sudo yum -y install gcc automake autoconf libtool make gcc-c++ pcre* zlib openssl openssl-devel
git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon
./make.sh
sudo ./make.sh install
完成后,libfastcommon:
本步骤在FastDFS服务端tracker或storage均需执行
fastdfs用户执行
tar xvf FastDFS_v5.07.tar.gz
cd FastDFS
./make.sh
sudo ./make.sh install
sudo cp /home/fastdfs/FastDFS/conf/http.conf /etc/fdfs/
sudo cp /home/fastdfs/FastDFS/conf/mime.types /etc/fdfs/
完成后,FastDFS安装位置:
本步骤仅在storage服务器执行
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题。fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。
cd /home/fastdfs
tar xvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure \
--prefix=/home/fastdfs/nginx-1.8.1 \
--sbin-path=/home/fastdfs/nginx-1.8.1/nginx \
--conf-path=/home/fastdfs/nginx-1.8.1/nginx.conf \
--pid-path=/home/fastdfs/nginx-1.8.1/nginx.pid \
--with-http_ssl_module \
--add-module=/home/fastdfs/fastdfs-nginx-module/src
make -j ${NUM_OF_CPU} && make install
请检查fastdfs-nginx-module/src/config
文件中的CORE_INCS路径,不同版本略有不同
执行完上述命令,有可能会报错
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:812: 错误:‘fdfs_send_reply_chunk’ 未声明 (在此函数内第一次使用)
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:813: 错误:‘struct fdfs_http_context’ 没有名为 ‘proxy_handler’ 的成员
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:819: 错误:‘struct fdfs_http_context’ 没有名为 ‘if_modified_since’ 的成员
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:822: 错误:‘struct fdfs_http_context’ 没有名为 ‘if_modified_since’ 的成员
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:852: 错误:‘struct fdfs_http_context’ 没有名为 ‘range’ 的成员
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:858: 错误:‘struct fdfs_http_context’ 没有名为 ‘if_range’ 的成员
/usr/local/src/fastdfs-nginx-module/src/ngx_http_fastdfs_module.c:858: 错误:‘true’ 未声明 (在此函数内第一次使用)
make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] 错误 1
make[1]: Leaving directory `/usr/local/src/nginx-1.4.7'
make: *** [build] 错误 2
cd fastdfs-nginx-module/src
vi config
去掉/local
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
sudo cp /home/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
配置文件说明:
配置项说明:
配置名称 | 值类型 | 默认值 | 必输 | 备注 |
---|---|---|---|---|
base_path | string | Y | 存放数据和日志文件的根目录(必须已存在),数据data和日志logs目录如果不存在会自动创建 | |
disabled | boolean | false | N | 本配置文件是否已被禁用 |
bind_addr | string | N | 绑定的IP地址(常用于服务器有多个IP但只希望一个IP提供服务),为空表示本机所有可用地址 | |
connect_timeout | int | 30(s) | N | 连接超时时间,针对socket套接字函数connect |
network_timeout | int | 30(s) | N | 网络超时时间,发送或接收数据时,如果在超时时间后还不能发送或接收数据,则本次网络通信失败 |
max_connections | int | 256 | N | 最大客户端连接数 |
work_threads | int | 4 | N | 工作线程数,通常设置为CPU数 |
log_level | string | info | N | 日志级别,标准同syslog;可选值为:emerg,alert,crit,error,warn,notice,info,debug (大小写不敏感) |
run_by_group | string | N | 执行程序的用户组,默认为当前用户所在组 | |
run_by_user | string | N | 执行程序的用户,默认为当前用户 | |
allow_hosts | string | * | N | 允许连接的客户端地址,默认为所有,可以使用ip地址范围或CIDR,如:10.0.1.[1-15,20] |
sync_log_buff_interval | int | 10(s) | N | 日志缓存刷新同步间隔 |
thread_stack_size | string | 64K | N | 线程栈内存大小 |
use_connection_pool | boolean | false | N | 是否了使用连接线程池,默认为否 |
配置名称 | 值类型 | 默认值 | 必输 | 备注 |
---|---|---|---|---|
port | int | 22122 | N | tracker服务器监听端口 |
store_lookup | int | 2 | N | 上传文件时的分组选取方式,0-轮询;1-指定组;2-负载均衡(选取剩余空间最大的分组) |
store_group | string | N | 在store_lookup为1时生效,指定上传文件的分组名称 | |
store_server | int | 0 | N | 上传文件时服务器的选取方式,0-轮询;1-ip地址最小的服务器;2-优先级最高(上传优先级由storageserver来设置,参数upload_priority值最小)的服务器 |
store_path | int | 0 | N | 上传文件时目录的选取方式,0-轮询;2-选择剩余空间最大的目录(storageserver可以有多个base_path)来存放文件 |
download_server | int | 0 | N | 下载文件时服务器的选取方式,0-轮询;1-文件上传时指定的服务器 |
reserved_storage_space | string | 1GB | N | 为系统和其他应用保留的硬盘空间(避免耗尽磁盘空间,单位是G M K ) |
storage_ip_changed_auto_adjust | boolean | N | 自动适应存储服务器IP改变 | |
storage_sync_file_max_delay | int | 86400(s) | N | 最大文件同步延迟(默认为1天) |
http.server_port | int | 8080 | N | tracker服务器web端口 |
配置名称 | 值类型 | 默认值 | 必输 | 备注 |
---|---|---|---|---|
group_name | string | Y | 服务器所属分组 | |
tracker_server | string | Y | Tracker服务器地址(服务器地址:端口),可以配置多行指定多个tracker服务器 | |
port | int | 23000 | N | storage服务器监听端口 |
heart_beat_interval | int | 30(s) | N | 心跳检查时间间隔 |
stat_report_interval | int | 300(s) | N | 磁盘使用信息报告时间间隔 |
sync_wait_msec | int | 50(ms) | N | 读取binlog进行同步前的等待时间 |
sync_interval | int | 0(ms) | N | 同步时间间隔 |
sync_start_time | string | 00:00 | N | 同步开始时间 |
sync_end_time | string | 23:59 | N | 同步结束时间 |
store_path_count | int | 1 | N | 存储文件的目录位置 |
store_path0 | string | N | 第一个存储文件目录位置(如果store_path_count!=1,则还需根据值配置store_path1、store_path2等) | |
subdir_count_per_path | int | 256 | N | 子文件夹数目限制 |
check_file_duplicate | boolean | 0(no) | N | 是否检查文件重复,0(no)-不检查,1(yes)-检查 |
key_namespace | string | FastDFS | N | 文件索引的命名空间,如果check_file_duplicate=1则必须设置 |
keep_alive | boolean | 0 | N | 是否使用长连接连接FastDHT服务器,0-不使用;1-允许 |
http.server_port | int | 8888 | N | Stroage服务器WEB服务端口 |
1.tracker服务器:
#创建数据目录和软链接,便于文件管理
mkdir -p /home/fastdfs/fastdfs-root/data
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
sudo vi /etc/fdfs/tracker.conf
tracker.conf 推荐修改配置:
base_path=/home/fastdfs/fastdfs-root
accept_threads=4
store_path=1
download_server=1
thread_stack_size = 1MB
use_connection_pool = true
#创建数据目录和软链接,便于文件管理
mkdir -p /home/fastdfs/fastdfs-root/data
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
sudo vi /etc/fdfs/storage.conf
storage.conf 推荐修改配置:
group_name=group1
base_path=/home/fastdfs/fastdfs-root
store_path0=/home/fastdfs/fastdfs-root
tracker_server=${TRACKER_IP}:22122
#与nginx一致
http.server_port=8080
sudo vi /etc/fdfs/mod_fastdfs.conf
修改配置项:
group_count=1
[group1]
group_name=group1
tracker_server=${TRACKER_IP}:22122
store_path0=/home/fastdfs/fastdfs-root
base_path=/home/fastdfs/fastdfs-root
#url中带有group名称
url_have_group_name = true
#创建数据目录和软链接,便于文件管理
mkdir -p /home/fastdfs/fastdfs-root/data
ln -s /home/fastdfs/fastdfs-root/data/ /home/fastdfs/fastdfs-root/data/M00
vi /home/fastdfs/nginx-1.8.1/nginx.conf
在server配置中修改:
Listen 8080;
location /group1/M00 {
root /home/fastdfs/fastdfs-root/data;
ngx_fastdfs_module;
}
#启动tracker服务
service fdfs_trackerd start
ps -elf | grep fdfs
netstat -an | grep 22122
##启动nginx
/home/fastdfs/nginx-1.8.1/nginx
##启动storage服务
service fdfs_storaged start
ps -elf | grep fdfs
##停止storage服务
service fdfs_storaged stop
fdfs_monitor /etc/fdfs/storage.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 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
upstream fdfs_group1 {
server store服务器1 :8080 weight=1 max_fails=2 fail_timeout=30s;
server store服务器2:8080 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
#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;
# }
#}
}
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
sudo vi /etc/fdfs/client.conf
base_path=/home/fastdfs/fastdfs-root/
tracker_server=${TRACKER_IP}:22122
#创建测试文件,随便输入内容
vim hello.txt
fdfs_test /etc/fdfs/client.conf upload hello.txt
# 获取fileID, 下载
fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/CiADRlhbSaiAAGsOAAAADXj9r-s563_big.txt
删除 storage 服务器
fdfs_monitor /etc/fdfs/client.conf delete 组名 需要删除的IP
资料来源:官方论坛
FastDFS需要的编译和运行环境是怎样的?
FastDFS Server仅支持unix系统,在Linux和FreeBSD测试通过。在Solaris系统下网络通信方面有些问题。
编译需要的其他库文件有pthread,V5.0以前的版本还依赖libevent;V5.0以后,不再依赖libevent。
v5.04开始依赖libfastcommon. github地址
v5版本从v5.05开始才是稳定版本,请使用v5版本的同学尽快升级到v5.05或更新的版本,建议升级到v5.07。
pthread使用系统自带的即可。
对libevent的版本要求为1.4.x,建议使用最新的stable版本,如1.4.14b。
注意,千万不要使用libevent 2.0非stable版本。
在64位系统下,可能需要自己在/usr/lib64下创建libevent.so的符号链接。比如:
ln -s /usr/lib/libevent.so /usr/lib64/libevent.so
启动storage server时,一直处于僵死状态。
A:启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成。
出现这样情况,请检查连接不上tracker server的原因。
友情提示:从V2.03以后,多tracker server在启动时会做时间上的检测,判断是否需要从别的tracker server同步4个系统文件。
触发时机是第一个storage server连接上tracker server后,并发起join请求。
如果集群中有2台tracker server,而其中一台tracker没有启动,可能会导致storage server一直处于僵死状态。
注:这个问题v5.07解决了。
执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2
错误号表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。
如何让server进程退出运行?
直接kill即可让server进程正常退出,可以使用killall命令,例如:
killall fdfs_trackerd
killall fdfs_storaged
也可以使用如下命令:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
千万不要使用-9参数强杀,否则可能会导致binlog数据丢失的问题。
如何重启server进程?
直接使用:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
跨运营商通信异常问题
比如电信和网通机房相互通信,可能会存在异常,有两种表现:
还有人碰到过从一个方向建立连接可以正常通信,但从另外一个方向就不能正常通信的情况。
解决办法:
尝试将服务端口改小,建议将端口修改为1024以下。比如将storage服务端口由23000修改为873等,也可以试试修改为8080; 如果问题还不能解决,请联系你的网络(机房)服务商。
fdfs_test和fdfs_test1是做什么用的?
这两个是FastDFS自带的测试程序,会对一个文件上传两次,分别作为主文件和从文件。返回的文件ID也是两个。
并且会上传文件附加属性,storage server上会生成4个文件。
这两个程序仅用于测试目的,请不要用作实际用途。
什么是主从文件?
主从文件是指文件ID有关联的文件,一个主文件可以对应多个从文件。
主文件ID = 主文件名 + 主文件扩展名 从文件ID = 主文件名 + 从文件后缀名 + 从文件扩展名
使用主从文件的一个典型例子:以图片为例,主文件为原始图片,从文件为该图片的一张或多张缩略图。
FastDFS中的主从文件只是在文件ID上有联系。FastDFS server端没有记录主从文件对应关系,因此删除主文件,FastDFS不会自动删除从文件。
删除主文件后,从文件的级联删除,需要由应用端来实现。
主文件及其从文件均存放到同一个group中。
主从文件的生成顺序:
如何删除无效的storage server?
可以使用fdfs_monitor来删除。命令行如下:
/usr/bin/fdfs_monitor <config_filename> delete <group_name> <storage_id>
例如:
/usr/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
注意:如果被删除的storage server的状态是ACTIVE,也就是该storage server还在线上服务的情况下,是无法删除掉的。
storage_id参数:如果使用默认的ip方式,填写storage server IP地址,否则使用对应的server id。
FastDFS扩展模块升级到V1.06及以上版本的注意事项
apache和nginx扩展模块版本v1.06及以上版本,需要在配置文件/etc/fdfs/fastdfs_mod.conf中设置storage server的存储路径信息。
一个示例如下所示:
store_path_count=1
store_path0=/home/yuqing/fastdfs
store_path_count和store_path#均需要正确设置,必须和storage.conf中的相应配置完全一致,否则将导致文件不能正确下载!
nginx和apache扩展模块与FastDFS server版本对应关系
扩展模块1.05: 针对FastDFs server v2.x,要求server版本大于等于v2.09
扩展模块1.07及以上版本: 针对FastDFs server v3.x
具体的版本匹配情况,参阅扩展模块源码下的HISTORY文件
上传文件失败,返回错误码28,这是怎么回事?
返回错误码28,表示磁盘空间不足。注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,缺省值为4GB,即预留4GB的空间。
请酌情设置reserved_storage_space这个参数,比如可以设置为磁盘总空间的20%左右。
fdfs_trackerd或者fdfs_storaged的日志中出现:malloc task buff failed字样的错误,这是怎么回事?
出现此类信息表示已经达到最大连接数。server端支持的最大连接数可以通过max_connections这个参数来设置。
出现这样的问题,需要排查一下是否客户端使用不当导致的,比如客户端没有及时关闭无用的连接。
FastDFS的文件ID中可以反解出哪些字段?
文件ID中除了包含group name和存储路径外,文件名中可以反解出如下几个字段: 1. 文件创建时间(unix时间戳,32位整数) 2. 文件大小 3. 上传到的源storage server IP地址(32位整数) 4. 文件crc32校验码 5. 随机数(这个字段用来避免文件重名)
为什么生成的token验证无法通过?
出现这样的问题,请进行如下两项检查: