总结:通过nginx的代理拦截,不同路径请求到不同的预设路径下
fastdfs结合nginx使用实现访问
环境介绍:
1: 公司目前有5个项目 A B C D E 日后可能会有所增加.
2: 使用fastdfs存储这5各项目的文件,要求各各项目的文件分开存储,也就是每个项目的文件存储到一个固定的位置.
3: 三台机器ip地址分配如下
tracker角色 IP:192.168.1.219
storageA角色 IP: 192.168.1.215
storageB角色 IP:192.168.1.216
4: 这里主要记录下实现思路,具体的配置方法都很简单.
---------tracker这台机器 主要有两个服务 fdfs_tracker 和 nginx---------------
tracker.conf的配置文件很简单这里不贴出来了
nginx的配置文件如下: nginx负责把访问请求转发给后台的两台storage.
[root@trackerB ~]# cat /usr/local/nginx/conf/nginx.conf | grep -v "#" | grep -v "^$"
user www;
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
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;
sendfile on;
tcp_nopush on;
keepalive_timeout 120;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_disable "MSIE[1-6].";
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;
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_addr" "$upstream_response_time" "$host"';
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:500m max_size=10g inactive=30d;
proxy_temp_path /var/cache/nginx/proxy_cache/tmp;
upstream group1 {
server 192.168.1.215:80;
server 192.168.1.216:80;
}
server {
listen 80;
server_name image.ty.com;
location ~* /group1/(M00|M01|M02|M03|M04|M05) { #这里我使用了6个存储路径,每个项目一个
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://group1;
expires 3d;
}
access_log logs/image.access.log access;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include /usr/local/nginx/conf/vhost/*.conf;
}
---------------storage角色的两台机器-------------------
这两天机器的配置完全一样. 都运行了fdfs_storage 和 nginx , 其中nginx添加了fastdfs模块
fdfs_storage的配置文件storage.conf内容如下:
[root@localhost ~]# cat /etc/fdfs/storage.conf | grep -v "^#" | grep -v "^$"
disabled=false
group_name=group1
bind_addr=
client_bind=true
port=23000
connect_timeout=30
network_timeout=60
heart_beat_interval=30
stat_report_interval=60
base_path=/data/
max_connections=256
buff_size = 256KB
accept_threads=1
work_threads=4
disk_rw_separated = true
disk_reader_threads = 1
disk_writer_threads = 1
sync_wait_msec=50
sync_interval=0
sync_start_time=00:00
sync_end_time=23:59
write_mark_file_freq=500
store_path_count=6 一共 store_path0-5 六个存储路径.
store_path0=/data/data1
store_path1=/data/data2
store_path2=/data/data3
store_path3=/data/data4
store_path4=/data/data5
store_path5=/data/data6
subdir_count_per_path=256
tracker_server=192.168.1.219:22122
log_level=info
run_by_group=
run_by_user=
allow_hosts=*
file_distribute_path_mode=0
file_distribute_rotate_count=100
fsync_after_written_bytes=0
sync_log_buff_interval=10
sync_binlog_buff_interval=10
sync_stat_file_interval=300
thread_stack_size=512KB
upload_priority=10
if_alias_prefix=
check_file_duplicate=0
file_signature_method=hash
key_namespace=FastDFS
keep_alive=0
use_access_log = false
rotate_access_log = false
access_log_rotate_time=00:00
rotate_error_log = false
error_log_rotate_time=00:00
rotate_access_log_size = 0
rotate_error_log_size = 0
log_file_keep_days = 0
file_sync_skip_invalid_record=false
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.domain_name=
http.server_port=8888
nginx配置文件如下
[root@localhost ~]# cat /usr/local/nginx/conf/nginx.conf | grep -v "^#" | grep -v "^$"
worker_processes 1;
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;
keepalive_timeout 65;
client_max_body_size 2m;
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log logs/host.access.log main;
location /group1/M00 { #根据请求路径配置对应的存储路径.
root /data/data1;
ngx_fastdfs_module; #使用nginxmodule处理请求
}
location /group1/M01 {
root /data/data2;
ngx_fastdfs_module;
}
location /group1/M02 {
root /data/data3;
ngx_fastdfs_module;
}
location /group1/M03 {
root /data/data4;
ngx_fastdfs_module;
}
location /group1/M04 {
root /data/data5;
ngx_fastdfs_module;
}
location /group1/M05 {
root /data/data6;
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include /usr/local/nginx/conf/vhosts/*.conf;
}
nginx的fastdfs模块的配置文件如下:
[root@localhost ~]# cat /etc/fdfs/mod_fastdfs.conf | grep -v "^#" | grep -v "^$"
connect_timeout=2
network_timeout=30
base_path=/tmp
load_fdfs_parameters_from_tracker=true
storage_sync_file_max_delay = 86400
use_storage_id = false
storage_ids_filename = storage_ids.conf
tracker_server=192.168.1.219:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path_count=6
store_path0=/data/data1
store_path1=/data/data2
store_path2=/data/data3
store_path3=/data/data4
store_path4=/data/data5
store_path5=/data/data6
log_level=info
log_filename=/var/log/mod_fastdfs.log
response_mode=proxy
if_alias_prefix=
flv_support = true
flv_extension = flv
group_count = 0
-----------------以上就是用到的所有配置文件----------------------------
想实现按照不通的项目存储到不同的路径,主要通过代码来实现 以java为例
首先: 我们可以通过tracker获取一个可以使用的storage的ip, -------java代码如下---------
/**
* 获得可用的storage IP
*
* @param trackerClient
* @param trackerServer
* @return 返回storage IP
*/
private static String getStorageServerIp(TrackerClient trackerClient, TrackerServer trackerServer) {
String storageIp = null;
if (trackerClient != null && trackerServer != null) {
try {
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer, STORAGE_SERVER_GROUP);
storageIp = storageServer.getSocket().getInetAddress().getHostAddress();
} catch (IOException e) {
e.printStackTrace();
}
}
log.info("——获取组中可用的storage IP——" + storageIp);
return storageIp;
}
其次:可以根据获取的ip把需要上传的文件指定到要上传到的路径里面
/**
* 得到Storage服务
*
* @param storageIp
* @return 返回Storage服务
*/
private static StorageServer getStorageServer(String storageIp) {
StorageServer storageServer = null;
if (storageIp != null && !("").equals(storageIp)) {
try {
storageServer = new StorageServer(storageIp, Integer.parseInt(STORAGE_SERVER_PORT), Integer.parseInt(STORAGE_SERVER_M00));
} catch (IOException e) {
e.printStackTrace();
}
}
log.info("——storage server生成");
return storageServer;
}
这样就通过fastdfs支持多路径这个功能实现了不同项目分开存储的需求.
Linux下也有对应的命令:[root@localhost ~]# fdfs_upload_file -h
Usage: fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
[root@localhost ~]# fdfs_upload_file /etc/fdfs/storage.conf anni.jpg 192.168.1.215:23000 5
group1/M05/00/D4/wKgB11W4SQGASXcFAAFAB2RsPpA542.jpg
参考:
相关推荐
在文件上传过程中,如果使用 Java API 且未指定分组,文件可能会被随机分配到不同的组,因此建议在代码中明确指定分组,以保证文件被存放到期望的组内。 删除分组的流程包括: 1. 停止 Storage 服务:使用 `/usr/...
- 修改`storage.conf`,启用配置,设置服务端口(如`port=23000`)、组名(如`group_name=group1`)、存储路径(如`store_path0=/fastdfs/storage`)和Tracker服务器IP及端口。 - 创建数据存储目录。 - 打开...
FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要设计用于互联网场景下的大容量文件存储,尤其适合图片和视频等二进制大文件的存储。它具有高可用、高性能、轻量级、易于扩展等特点,能有效地解决大数据量...
在文件上传过程中,FastDFS会将文件切分为多个块(Block),并分别存储在不同的Storage服务器上,以实现负载均衡和提高数据可靠性。文件下载时,FastDFS可以根据客户端请求的文件ID,快速定位到存储文件的Storage...
当文件被成功写入一个存储服务器后,后台线程会将该文件同步到同一个组内的其他存储服务器上。 - **同步机制**:通过binlog记录文件的元信息而非实际数据来进行同步,binlog中包含文件名等关键信息。 - **进度记录*...
在IT行业中,FastDFS是一个轻量级的分布式文件系统,主要针对海量小文件存储而设计。它具有高可用性、高性能、低耦合性、易扩展等特性,广泛应用于图片、文档等类型的小文件存储场景。Java操作FastDFS文件上传是Java...
文件会被切分成块,并在同一个Group的不同Storage Server间进行冗余备份。 - 文件下载:客户端通过Tracker获取文件所在的Storage Server信息,然后直接与该Server通信,下载文件。 - 文件操作:FastDFS支持文件的...
SpringBoot集成FastDFS实现文件服务是一种常见的文件存储解决方案,它结合了SpringBoot的便捷性和FastDFS的高效文件管理系统。在现代Web应用中,文件上传和下载功能是必不可少的,而FastDFS作为一个轻量级的分布式...
Group是FastDFS的逻辑分组,同一组内的Storage服务器之间进行数据同步,不同组间相互独立,可以动态添加或删除。 3.4 File ID FastDFS为每个文件分配一个唯一的File ID,由Group Name、Volume ID和Local File ID三...
三、数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。 四、文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、...
FastDFS是一款开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载等),解决了大容量存储和负载均衡的问题。FastDFS能够为文件提供一个统一的访问接口,其...
FastDFS支持多组(Group)配置,每组内有多台Storage Server,可以设置副本数量,实现数据冗余,提高数据安全性。当某台Server出现故障,Tracker Server会自动切换到其他可用的Server,保证服务的连续性。同时,...
3. Group:存储组是FastDFS的基本存储单元,一个Group内可以包含多个Storage服务器,数据在Group内部进行冗余备份。 4. Volume:Volume是FastDFS中的逻辑存储单位,它是由一个或多个Group组成,Volume的大小可动态...
FastDFS是一个开源的高性能、轻量级的分布式文件系统,它对文件进行管理,包括文件存储、文件同步、文件访问(文件上传、文件下载)等功能,解决了大容量存储和负载均衡的问题。FastDFS特别适合以文件为载体的在线...
【FastDFS资源包合集】是一个专为Linux CentOS 6.x系统设计的压缩包,用于帮助用户快速搭建FastDFS分布式文件系统集群。FastDFS是一种轻量级、高性能的开源文件存储系统,它主要解决了大容量存储和负载均衡的问题,...
在这个场景中,我们将深入探讨如何使用Java和Spring Boot来配置并实现FastDFS的文件上传功能,包括将字符串生成文件上传、生成图片缩略图上传以及删除文件等操作。 首先,我们需要理解FastDFS的基本架构。FastDFS由...
FastDFS是一个开源的高性能、轻量级的分布式文件系统,由C语言编写,主要解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如图片存储、视频存储等。在这个系统中,FastDFS将文件存储和文件访问...
在电商项目中,商品图片、用户头像等大量小文件的存储和访问是常见的需求,Fastdfs通过将文件分散存储在不同的服务器上,实现文件的分布式管理,提高系统的稳定性和可扩展性。 Fastdfs的工作原理主要包括以下部分:...