赞
踩
技术论坛: http://bbs.chinaunix.net/forum-240-1.html
FAQ:http://bbs.chinaunix.net/thread-1920470-1-1.html
资源地址: https://sourceforge.net/projects/fastdfs/
源码资源: https://github.com/happyfish100
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
tracker Server:
主节点,跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。
记录storage server的状态,是连接Client和Storage server的枢纽。
FastDFS集群中的Tracker server可以有多台,Trackerserver之间是相互平等关系同时提供服务
Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
Storage Server:
存储服务器,文件和meta data都保存到存储服务器上
storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。
一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系
不同组的Storageserver之间不会相互通信,同组内的Storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。
一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
group:组,也称为卷。同组内服务器上的文件是完全相同的
文件标识:包括两部分:组名和文件名(包含路径)
meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768
client询问tracker上传到的storage,不需要附加参数;
tracker返回一台可用的storage;
client直接和storage通讯完成文件上传
注:不能让用户直接访问Storage Server,不安全,没有公网IP
内部机制如下:
1、选择tracker server
当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:
1、Round robin,所有的group间轮询
2、Specified group,指定某一个确定的group
3、Load balance,剩余存储空间多多group优先
2、选择storage server
当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:
1、Round robin,在group内的所有storage间轮询
2、First server ordered by ip,按ip排序
3、First server ordered by priority,按优先级排序(优先级在storage上配置)
3、选择storage path
当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:
1、Round robin,多个存储目录间轮询
2、剩余存储空间最多的优先
4、生成Fileid
选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。
5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
首先文件不是由浏览器上传的,而是由FastDFS内置的客户端client上传的
浏览器没办法直接向Storage中传文件,同时不允许它直接访问Tracker Server
节点是由group的概念,group是一组,这里面可以放服务器,一组服务器里的数据做冗余备份,一组服务器中的数据是一模一样的
一组服务器如果不够用,可以再开一组,在上传的时候,client这一端可以选组,如小于1M的放在group1中
client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
tracker返回一台可用的storage;
client直接和storage通讯完成文件下载。
高可用:一台机器宕机了,数据不会丢
负载均衡:这个集群的负载均衡是由Tracker主节点来决定的,我们在选择具体上传的服务器的时候,你可以选择往哪个Storage中传,但默认的是第一次第一台,第二次第二台
但是刚传过来的时候,会有一个异步复制的动作,不会占用主线程,这个异步复制会复制到其他的Storage上,别的Storage上就有这个数据了,这是上传
在下载的时候,也是通过Tracker来定位数据在具体那一台Storage上,如果发现多台Storage上都有这个数据,可以通过多种策略来决定从那一台读取
注:每个group能存储的最大数据量,取决于Storage中可用空间最小的那台机器
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
指标 | FastDFS | NFS | 集中存储设备 如NetApp**、NAS** |
---|---|---|---|
线性扩容性 | 高 | 差 | 差 |
文件高并发访问性能 | 高 | 差 | 一般 |
文件访问方式 | 专有API | POSIX | 支持POSIX |
硬件成本 | 较低 | 中等 | 高 |
相同内容文件只保存一份 | 支持 | 不支持 | 不支持 |
指标 | FastDFS | mogileFS |
---|---|---|
系统简洁性 | 简洁 只有两个角色:tracker和storage | 一般 有三个角色:tracker、storage和存储文件信息的mysql db |
系统性能 | 很高(没有使用数据库,文件同步直接点对点,不经过tracker中转) | 高(使用mysql来存储文件索引等信息,文件同步通过tracker调度和中转) |
系统稳定性 | 高(C语言开发,可以支持高并发和高负载) | 一般(Perl语言开发,高并发和高负载支持一般) |
软RAID方式 | 分组(组内冗余),灵活性较大 | 动态冗余,灵活性一般 |
通信协议 | 专有协议 下载文件支持HTTP | HTTP |
技术文档 | 较详细 | 较少 |
文件附加属性(meta data) | 支持 | 不支持 |
相同内容文件只保存一份 | 支持 | 不支持 |
下载文件时支持文件偏移量 | 支持 | 不支持 |
准备linux服务器或虚拟机
Tracker 和 Storage 安装在一台机器上
FastDFS 5.08版本
FastDFS是C语言开发的应用。安装必须使用make、cmake和gcc编译器。
yum install -y make cmake gcc gcc-c++
libfastcommon是从FastDFS 和FastDHT 中提取出来的公共C函数库
上传文件后解压缩
unzip libfastcommon-master.zip -d /usr/local/fastdfs
编译安装
libfastmon没有提供make命令安装文件。使用的是shell脚本执行编译和安装。
shell脚本为make.sh
编译
./make.sh
安装
./make.sh install
有固定的默认安装位置。在/usr/lib64和/usr/include/fastcommon两个目录中。
创建软连接
因为 FastDFS 主程序设置的 lib 目录是/usr/local/lib,所以需要创建软链接
- ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
-
- ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
-
- ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
-
- ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
上传并解压缩
tar -zxf FastDFS_v5.08.tar.gz -C /usr/local/fastdfs
编译安装
- ./make.sh
- ./make.sh install
安装后,FastDFS主程序所在位置:
- /usr/bin - 可执行文件所在位置。
- /etc/fdfs - 配置文件所在位置。
- /usr/lib64 - 主程序代码所在位置
- /usr/include/fastdfs - 包含的一些插件组所在位置
程序脚本
在/etc/init.d/目录中,脚本文件是 fdfs-storaged和fdfs-trackerd
配置文件
配置文件在/etc/fdfs/
目录中
tracker.conf.sample - 跟踪器服务配置文件模板
storage.conf.sample - 存储服务器配置文件模板
client.conf.sample - FastDFS提供的命令行客户端配置文件模板。可以通过命令行测试FastDFS有效性。
修改配置文件
复制一份模板配置文件
- cd /etc/fdfs
-
- cp tracker.conf.sample tracker.conf
打开 tracker.conf
修改 base_path 路径,base_path FastDFSTracker启动后使用的根目录,用来存放Tracker data和logs。
base_path=/home/yuqing/fastdfs -> base_path=/var/data/fastdfs-tracker(自定义目录)
配置中的路径需要先创建好才能启动服务
mkdir -p /var/data/fastdfs-tracker
启动Tracker
/etc/init.d/fdfs_trackerd start
启动成功后,配置文件中base_path指向的目录中出现FastDFS服务相关数据目录(data目录、logs目录)
查看服务状态
ps -ef | grep fdfs
停止服务
/etc/init.d/fdfs_trackerd stop
重启服务
/etc/init.d/fdfs_trackerd restart
配置文件
- cd /etc/fdfs
- cp storage.conf.sample storage.conf
- mkdir -p /var/data/fastdfs-storage/base
- mkdir -p /var/data/fastdfs-storage/store
base_path=/home/yuqing/fastdfs -> base_path=/var/data/fastdfs-storage/base(自定义目录)
store_path0=/home/yuqing/fastdfs -> store_path0=/var/data/fastdfs-storage/store(自定义目录)
tracker_server=192.168.150.11:22122 -> tracker_server=tracker服务IP:22122
base_path - 基础路径。用于保存storage server基础数据内容和日志内容的目录。
store_path0 - 存储路径。是用于保存FastDFS中存储文件的目录,就是要创建256*256个子目录的位置。base_path和store_path0可以使用同一个目录。
tracker_server - 跟踪服务器位置。就是跟踪服务器的ip和端口。
启动服务
要求tracker服务必须已启动
/etc/init.d/fdfs_storaged start
启动成功后,配置文件中base_path指向的目录中出现FastDFS服务相关数据目录(data目录、logs目录)
配置文件中的store_path0指向的目录中同样出现FastDFS存储相关数据录(data目录)
其中$store_path0/data/目录中默认创建若干子孙目录(两级目录层级总计256*256个目录),是用于存储具体文件数据的。
Storage服务器启动比较慢,因为第一次启动的时候,需要创建256*256个目录。
查看服务状态
/etc/init.d/fdfs_storaged status
停止服务
/etc/init.d/fdfs_storaged stop
重启服务
/etc/init.d/fdfs_storaged restart
修改配置文件
- cd /etc/fdfs
- cp client.conf.sample client.conf
client.conf配置文件中主要描述客户端的行为,需要进行下述修改:
- vi /etc/fdfs/client.conf
-
- base_path=/home/yuqing/fastdfs -> base_path=/fastdfs/client (自定义目录)
-
- tracker_server=192.168.150.11:22122 -> tracker_server=tracker服务IP:22122
base_path - 就是客户端命令行执行过程时临时数据存储位置。
创建自定义目录
mkdir -p /fastdfs/client
上传文件
/usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf /要上传的文件
- [root@node03 data]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/install.log
- group1/M00/00/00/wKiWDV0xfqWAFe1OAAAib-i5DLU637.log
上传结束后,返回group1/M00/00/00/xxxxxxxxxx.xxx,检查storage服务结点中的$store_path0/data/00/00/目录中是否有上传的文件(一般情况上传的文件按顺序保存在$store_path0/data/00/00/目录中,不能完全保证)。
上传文件结果:group1/M00/00/00/wKiWDV0xfqWAFe1OAAAib-i5DLU637.log
组名:group1文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:M00 storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:/00/00 storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:wKiWDV0xfqWAFe1OAAAib-i5DLU637.log
删除文件
- /usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiWDV0xfqWAFe1OAAAi
- b-i5DLU637.log
如果FastDFS中保存的是图片信息。希望在WEB应用中可以直接访问FastDFS中的图片进行显示。如果操作?
安装Nginx是为了WEB应用中可以使用HTTP协议直接访问Storage服务中存储的文件。在storage结点所在服务器安装Nginx组件。
需要安装两部分内容。
Nginx应用,在安装nginx应用的时候,同时要在nginx中增加一个FastDFS的组件。
fastdfs-nginx-module模块
上传并解压
tar -zxf fastdfs-nginx-module_v1.16.tar.gz
修改配置
vi /usr/local/fastdfs/fastdfs-nginx-module/src/config
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
编译安装Nginx
- #prefix指明要安装到哪里
- ./configure --prefix=/usr/local/tengine
- #添加FastDFS的依赖
- --add-module=/usr/local/fastdfs-nginx-module/src/
make && make install
配置fastdfs-nginx-module
拷贝配置文件
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
修改配置文件 mod_fastdfs.conf
- tracker_server=192.168.2.109:22122
- url_have_group_name = true
- store_path0=/var/data/fastdfs-storage/store
拷贝http服务需要的配置
复制FastDFS安装包中的两个配置文件(http.conf和mime.types)到/etc/fdfs目录中
- cp /usr/local/fastdfs/FastDFS/conf/http.conf /etc/fdfs/
- cp /usr/local/fastdfs/FastDFS/conf/mime.types /etc/fdfs/
创建网络访问存储服务的软连接
在上传文件到FastDFS后,FastDFS会返回group1/M00/00/00/xxxxxxxxxx.xxx。其中group1是卷名,在mod_fastdfs.conf配置文件中已配置了url_have_group_name,以保证URL解析正确。
而其中的M00是FastDFS保存数据时使用的虚拟目录,需要将这个虚拟目录定位到真实数据目录上。
ln -s /var/data/fastdfs-storage/store/data/ /var/data/fastdfs-storage/store/data/M00
修改nginx配置文件
- location ~ /group([0-9])/M00 {
- ngx_fastdfs_module;
- }
-
- http://192.168.150.11/group1/M00/00/00/wKiWC10xxc6AfHCKAAAib-i5DLU543_big.log
文件名
add_header Content-Disposition "attachment;filename=$arg_attname";
上传文件
fdfs_test /etc/fdfs/client.conf upload www.png
查看文件
打开对应IP地址进行查看即可,如
http://192.168.1.8/group1/M00/00/00/wKgBCGAQXCOAKfa_AAHtitOkWtY781.png
更改名字,在路径后天极爱attname=名称
https://github.com/tobato/FastDFS_Client
RAID
配置
- fdfs:
- so-timeout: 1500
- connect-timeout: 600
- tracker-list:
- - 192.168.150.13:22122
- // 元数据
- Set<MetaData> metaDataSet = new HashSet<MetaData>();
- metaDataSet.add(new MetaData("Author", "yimingge"));
- metaDataSet.add(new MetaData("CreateDate", "2016-01-05"));
-
-
- try {
- StorePath uploadFile = null;
- uploadFile = fc.uploadFile(filename.getInputStream(), filename.getSize(), getFileExtName(filename.getOriginalFilename()), metaDataSet);
-
- account.setPassword(password);
- account.setLocation(uploadFile.getPath());
-
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
获取文件后缀
- private String getFileExtName(String name) {
- // TODO Auto-generated method stub
- return (name.substring(name.lastIndexOf(".")+1));
- }
-
或
FilenameUtils.getExtension
返回结果带group
uploadFile.getFullPath() : group1/M00/00/00/wKiWDV0u7ZKALKtNAAADP9sEx2w432.sql
不带group
uploadFile.getPath() : M00/00/00/wKiWDV0u7ZKALKtNAAADP9sEx2w432.sql
配置
- thumb-image:
- width: 150
- height: 150
- uploadFile = fc.uploadImageAndCrtThumbImage(filename.getInputStream(), filename.getSize(), FilenameUtils.getExtension(filename.getOriginalFilename()), metaDataSet);
-
- //下载文件
- @RequestMapping("/down")
- @ResponseBody
- public ResponseEntity<byte[]> down() {
- DownloadByteArray cb = new DownloadByteArray();
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
- headers.setContentDispositionFormData("attachment", "ypf.png");
- byte[] bs = fc.downloadFile("group1", "M00/00/00/wKgBCGAQXCOAKfa_AAHtitOkWtY781.png", cb);
- return new ResponseEntity<>(bs, headers, HttpStatus.OK);
- }
VMware修改mac
修改 ip地址
rm -f /etc/udev/rules.d/70-persistent-net.rules
reboot
克隆出来之前已经装好的两台虚拟机做Tracker节点
tarcker 节点 ip 131、132
启动两个Tracker节点
/etc/init.d/fdfs_trackerd start
查看端口
netstat -unltp |grep fdfs
启动日志
tail -100f trackerd.log
复制4台虚拟机
第一组 ip: 181、182 对应 group1
第二组 ip: 191、192 对应 group2
修改配置文件/etc/fdfs/storage.conf
修改tracker_server 的ip地址,多个 tracker 直接添加多条配置
- tracker_server=192.168.150.131:22122
- tracker_server=192.168.150.132:22122
启动Storage服务
/etc/init.d/fdfs_storaged start
fdfsMonitor
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
查看端口:netstat -unltp | grep fdfs
使用FastDFS中的Monitor查看:在所有的Storage启动成功后执行下述命令
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
测试文件上传
fdfs_upload_file /etc/fdfs/client.conf tmp.sh
修改tracker.conf文件中group的负载策略
修改配置文件中的store_lookup,这个属性的可选值有0,1,2。分别代表:
- # 0: 轮询
-
- # 1: 指定卷,通过卷名指定访问某一个卷
-
- # 2: 访问空闲磁盘空间较大的。是默认的负载策略。
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 S1,上传成功后文件 ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 S2,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 S2 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件连接到源服务器(S1)取文件,避免客户端由于复制延迟导致的文件无法访问错误。
在每个Storage节点安装配置Nginx
修改配置文件mod_fastdfs.conf
connect_timeout=10 #181、182 对应 group 1 #191、192 对应 group 2 group_name= tracker_server=192.168.150.131:22122 tracker_server=192.168.150.132:22122 group_count = 2 # group settings for group #1 # since v1.14 # when support multi-group, uncomment following section [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/var/data/fastdfs-storage/store #store_path1=/home/yuqing/fastdfs1 # group settings for group #2 # since v1.14 # when support multi-group, uncomment following section as neccessary [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/var/data/fastdfs-storage/store
检查Nginx配置文件
端口80必须和Storage服务器中的/etc/fdfs/storage.conf配置文件中的http.server_port=80一致。
- listen 80;
-
- location ~ /group([0-9])/M00 {
- # add_header Content-Disposition "attachment;filename=$arg_attname";
- ngx_fastdfs_module;
- }
-
测试访问文件
报错
- ERROR - file: /root/fastdfs-nginx-module/src//common.c, line: 709, expect parameter token or ts in url, uri: /
- group1/M00/00/00/wKiWtV1H4eKAKE4YAAABAE3E6HQ3627.gif
检查防盗链系统
vi /etc/fdfs/http.conf
http.anti_steal.check_token=
在每个Tracker节点安装配置Nginx
在 tracker 上安装的 nginx 主要为了提供 http 访问的反向代理、负载均衡以及缓存服务。
传并解压ngx_cache_purge-2.3.tar.gz
- cd /root
- tar -zxf ngx_cache_purge-2.3.tar.gz
编译安装nginx
- ./configure --prefix=/usr/local/tengine --add-module=/root/ngx_cache_purge-2.3
- make
- make install
-
配置nginx
ngx_cache_purge模块的作用:用于清除指定url的缓存
下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
Nginx.conf
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; #access_log "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G" main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #设置缓存 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; #设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限 #levels=1:2 表示缓存文件有两级目录 1表示第一级目录名为1位数,2表示第二级目录名为2位数 proxy_cache_path /var/data/cache/nginx/proxy_cache levels=1:2 #keys_zone 缓存区域名字,分配200m空间,最大缓存1g,有效期30天 keys_zone=http-cache:200m max_size=1g inactive=30d; proxy_temp_path /var/data/cache/nginx/proxy_cache/tmp; #设置 group1 的服务器 upstream fdfs_group1 { server 192.168.150.181:80 weight=1 max_fails=2 fail_timeout=30s; server 192.168.150.18:80 weight=1 max_fails=2 fail_timeout=30s; } #设置 group2 的服务器 upstream fdfs_group2 { server 192.168.150.191:80 weight=1 max_fails=2 fail_timeout=30s; server 192.168.150.192:80 weight=1 max_fails=2 fail_timeout=30s; } #gzip on; listen 80; #charset koi8-r; #access_log logs/host.access.log main; #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; server_name localhost; 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.2.0/24; deny all; proxy_cache_purge http-cache $1$is_args$args; }
purge命令清除静态缓存
http://域名+purge+静态资源相对路径 来清除静态资源缓存
查看nginx编译安装时的命令,安装了哪些模块
--prefix=/usr/local/tengine --add-module=/root/fastdfs-nginx-module/src
命令 /usr/local/nginx/sbin/nginx -V
编译
- ./configure --prefix=/usr/local/tengine --add-module=/root/ngx_c --以前的模块
- ache_purge-2.3
- make
注意make完 不要make install
拷贝obj下的 Nginx文件到 已安装好的sbin目录下 覆盖即可
cp ./nginx /usr/local/tengine/sbin/
上传并解压keepalived-1.2.18.tar.gz
- cd /root/
-
- tar -zxf keepalived-1.2.18.tar.gz
-
编译并安装Keepalived
- cd /root/keepalived-1.2.18
- ./configure --prefix=/usr/local/keepalived
- make && make install
-
- mkdir /etc/keepalived
- cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
- cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
- cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
- ln -s /usr/local/sbin/keepalived /usr/sbin/
- ln -s /usr/local/keepalived/sbin/keepalived /sbin/
-
设置开机启动
chkconfig keepalived on
ts1
! Configuration File for keepalived global_defs { ## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP router_id TS1 ## 标识本节点的字条串,通常为 hostname } ## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径 interval 2 ## 检测时间间隔 weight -20 ## 如果条件成立,权重-20 } ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称 vrrp_instance VI_1 { state MASTER ## 主节点为 MASTER,对应的备份节点为 BACKUP interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth1 virtual_router_id 51 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址 mcast_src_ip 192.168.150.132 ## 本机 IP 地址 priority 100 ## 节点优先级,值范围 0-254,MASTER 要比BACKUP 高 nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s ## 设置验证信息,两个节点必须一致 ## 将 track_script 块加入instance 配置块 track_script { chk_nginx ## 执行 Nginx 监控的服务 } ## 虚拟 IP 池, 两个节点设置必须一样 virtual_ipaddress { 192.168.150.138/24 dev eth0 label eth0:2 } }
ts2
! Configuration File for keepalived global_defs { # notification_email { # acassen@firewall.loc # failover@firewall.loc # sysadmin@firewall.loc # } # notification_email_from Alexandre.Cassen@firewall.loc # smtp_server 192.168.200.1 # smtp_connect_timeout 30 router_id ts2 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径 interval 2 ## 检测时间间隔 weight -20 ## 如果条件成立,权重-20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径 router_id ts2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 mcast_src_ip 192.168.150.132 track_script { chk_nginx } authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.150.138/24 dev eth0 label eth0:2 } }
编写nginx状态检查脚本/etc/keepalived/nginx_check.sh
在Keepalived配置中已用。脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。
vi /etc/keepalived/nginx_check.sh
内容
- #!/bin/bash
- A=`ps -C nginx –no-header |wc -l`
- if [ $A -eq 0 ];then
- /usr/local/nginx/sbin/nginx
- sleep 2
- if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
- killall keepalived
- fi
- fi
-
权限
chmod +x /etc/keepalived/nginx_check.sh
启动
service keepalived start
- @RequestMapping("/down")
- @ResponseBody
- public ResponseEntity<byte[]> down(HttpServletResponse resp) {
-
- DownloadByteArray cb = new DownloadByteArray();
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
- headers.setContentDispositionFormData("attachment", "aaa.xx");
- byte[] bs = fc.downloadFile("group1", "M00/00/00/wKiWDV0vAb-AcOaYABf1Yhcsfws9181.xx", cb);
-
- return new ResponseEntity<>(bs,headers,HttpStatus.OK);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。