轻论坛系统配置SeaweedFS对象存储集群

轻论坛系统默认使用本地存储,含有第三方文件存储功能的版本可以配置接入使用SeaweedFS对象存储,下面演示SeaweedFS集群的配置方法,演示主机操作系统为CentOS 8.2,对象存储SeaweedFS版本为2.05。本次演示使用5台服务器。


实现规划

主机名称 机架 IP地址 安装软件 开放端口 绑定域名
M1 ***.100.93.10(公网)
172.26.188.177(内网)
Redis(端口:6379 密码:asdbgt123456)
SeaweedFS的master服务
6379 (内网开放)
9333 (内网开放)
19333 (内网开放)
V1 rack1 ***.100.100.152(公网)
172.26.188.173(内网)
SeaweedFS的volume服务
SeaweedFS的filer服务
SeaweedFS的s3服务
Nginx
80 (公网开放)
8333 (S3端口,由Nginx将公网请求转发到此端口)
8080 (内网开放)
18080 (内网开放)
8888 (内网开放)
18888 (内网开放)
img1.diyhi.com
V2 rack1 ***.100.241.36(公网)
172.26.188.174(内网)
SeaweedFS的volume服务
SeaweedFS的filer服务
SeaweedFS的s3服务
Nginx
80 (公网开放)
8333 (S3端口,由Nginx将公网请求转发到此端口)
8080 (内网开放)
18080 (内网开放)
8888 (内网开放)
18888 (内网开放)
img2.diyhi.com
V3 rack2 ***.100.159.63(公网)
172.26.188.175(内网)
SeaweedFS的volume服务
SeaweedFS的filer服务
SeaweedFS的s3服务
Nginx
80 (公网开放)
8333 (S3端口,由Nginx将公网请求转发到此端口)
8080 (内网开放)
18080 (内网开放)
8888 (内网开放)
18888 (内网开放)
img3.diyhi.com
V4 rack2 ***.92.127.117(公网)
172.26.188.176(内网)
SeaweedFS的volume服务
SeaweedFS的filer服务
SeaweedFS的s3服务
Nginx
80 (公网开放)
8333 (S3端口,由Nginx将公网请求转发到此端口)
8080 (内网开放)
18080 (内网开放)
8888 (内网开放)
18888 (内网开放)
img4.diyhi.com
S1 ***.100.153.26(公网)
172.26.188.178(内网)
JDK 1.8
Tomcat 8.5
MySQL 5.7
Nginx
80 (公网开放)
bbs.diyhi.com

下载安装

1、打开SeaweedFS下载页面https://github.com/chrislusf/seaweedfs/releases 当前最新版本为2.05

打开SeaweedFS下载页面

2、下载对应当前系统版本的安装包,64位Linux适合linux_amd64.tar.gz

输入命令 wget https://github.com/chrislusf/seaweedfs/releases/download/2.05/windows_amd64.zip

3、创建目录

输入命令 mkdir /usr/local/seaweedfs/

4、解压到/usr/local/seaweedfs/

输入命令 tar zxvf linux_amd64.tar.gz -C /usr/local/seaweedfs/

5、进入目录/usr/local/seaweedfs/

输入命令 cd /usr/local/seaweedfs/

6、建立存储数据用的文件夹,若文件夹不存在启动volume时会出错

输入命令 mkdir /usr/local/seaweedfs/mdata
输入命令 mkdir /usr/local/seaweedfs/data
建立存储数据用的文件夹
master参数
cpuprofile string cpu配置文件输出文件
-defaultReplication string 默认复制类型(如果未指定) (默认 "000")
000: 只存储一份,默认设置
001: 在相同的Rack复制一份
010: 在同一DC的不同rack上复制一次
100: 在不同的DC复制一次
200: 在另外两个不同的DC上复制两次
110: 在不同的rack上复制一次,并在不同的DC上复制一次。
-disableHttp 禁用http请求,只允许gRPC操作。
-garbageThreshold float 清空和回收空间的阈值 (默认 0.3)
-ip string 指定ip地址 (默认 "localhost")
-ip.bind string 要绑定的IP地址 (默认 "0.0.0.0")
-maxCpu int 最大CPU数。 0表示可用所有CPU
-mdir string 用于存储元数据的数据目录
-memprofile string 内存配置文件输出文件
-peers string 以逗号分隔的所有主(master)节点 ip:port 列表, 示例: 127.0.0.1:9093,127.0.0.1:9094
-port int http监听端口 (默认 9333)
-pulseSeconds int 心跳之间的秒数 (默认 5)
-volumePreallocate uint 预分配卷的磁盘空间
-volumeSizeLimitMB uint Master停止指向超大卷的写入 (默认 30000)
-whiteList string 逗号分隔的Ip地址具有写入权限。 空的没有限制。
volume参数
-cpuprofile string 输出cpu配置文件
-dataCenter string 当前卷服务器的数据中心名称
-dir string 用于存储数据文件的目录. dir[,dir]...
-idleTimeout int 空闲连接时间 (默认 30)
-images.fix.orientation 上传时调整jpg方向。
-index string 内存模式[memory|leveldb|boltdb|btree]. (默认 "memory")
-ip string ip或服务器名称
-ip.bind string 要绑定的IP地址 (默认 "0.0.0.0")
-max string 最大卷(volume)个数 (默认 "7")
-maxCpu int 最大cpu使用数,0为使用全部
-memprofile string 输出内存配置文件
-mserver string 逗号分隔的主(master)服务器 (默认 "localhost:9333")
-port int http监听端口 (默认 8080)
-port.public string 可公开访问的端口
-publicUrl string 可公开访问的地址
-pulseSeconds string master与volume的心跳间隔,心跳之间的秒数必须小于或等于主设备的设置(默认 5)
-rack string 当前卷服务器的机架名称
-read.redirect 重定向移动或非本地卷。 (默认 true)
-whiteList string 白名单 逗号分隔的Ip地址具有写入权限。 空的没有限制。(卷服务器上的白名单将在即将发布的版本中弃用。)
filer参数
-collection string 所有数据都将存储在此集合中
-dataCenter string 首选在此数据中心写入volumes
-defaultReplicaPlacement string 默认复制类型(如果未指定) (默认 "000")
000: 只存储一份,默认设置
001: 在相同的Rack复制一份
010: 在同一DC的不同rack上复制一次
100: 在不同的DC复制一次
200: 在另外两个不同的DC上复制两次
110: 在不同的rack上复制一次,并在不同的DC上复制一次。
-dirListLimit int 限制子目录列表大小 (默认 100000)
-disableDirListing 关闭目录列表
-disableHttp 禁用http请求,只允许gRpc操作
-ip string filer服务器http监听ip地址
-master string 逗号分隔的主服务器 (默认 "localhost:9333")
-maxMB int 分割大于限制的文件 (默认 32)
-port int 文件服务器http监听端口 (默认 8888)
-port.grpc int Filer服务器的 grpc监听端口,默认为 http的端口+10000
-port.readonly int 开放的公共只读端口
-redirectOnRead 是否在文件GET请求期间代理或重定向到卷(volume)服务器
s3参数
-filer string 默认值localhost:8888 说明:文件服务器地址
-port int 默认值8333 说明:s3服务器http监听端口
-domainName string 默认值空 说明:通过公网访问存储空间的域名 suffix of the host name, {bucket}.{domainName}
-config string 默认值空 说明:配置文件的路径
-key.file string 默认值空 说明:TLS私钥文件的路径
-cert.file string 默认值空 说明:TLS证书文件的路径

grpc端口

grpc端口为-port +10000 如果您使用“-port = 18081”启动卷(volume)服务器,则grpc端口为10000 + 18081 = 28081
默认的grpc端口:
主服务器(master) -- 默认http为 9333,grpc为 19333
卷服务器(volume) -- 默认http为 8080,grpc为 18080
管理服务器(filer) -- 默认http为 8888,grpc为 18888
S3存储服务 -- 默认http为 8333



主服务(master)配置 主机:M1

1.创建seaweedfs启动用户并授权

输入命令 getent group seaweedfs || groupadd -r seaweedfs

输入命令 getent passwd seaweedfs || useradd -r -d /opt -s /bin/nologin -g seaweedfs seaweedfs

2.更改文件权限

输入命令 chown -R seaweedfs:seaweedfs /usr/local/seaweedfs

3.配置开机启动主服务(master)脚本

A.增加seaweedfs-master.service 在/usr/lib/systemd/system目录下增加seaweedfs-master.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-master.service

B. 将下面的配置内容复制到seaweedfs-master.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS Master
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 master -ip=172.26.188.177 -port=9333 -defaultReplication=000 -mdir=/usr/local/seaweedfs/mdata
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-master
				
				[Install]
				WantedBy=multi-user.target
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

使用配置好的系统服务管理seaweedfs-master
systemctl enable seaweedfs-master 配置开机启动
systemctl start seaweedfs-master 启动
systemctl stop seaweedfs-master 停止
systemctl restart seaweedfs-master 重启
systemctl disable seaweedfs-master 删除开机启动
systemctl daemon-reload 刷新

Redis配置

Redis服务器需预先安装好, Redis安装教程在《CentOS服务器环境配置演示》中已有介绍,这里就不再赘述。请按实际情况更改下面的IP地址。

输入命令 vim /etc/redis.conf
设置IP地址为 bind 172.26.188.177
设置IP地址
将配置文件 #requirepass foobared 去掉行前的注释,并修改密码为所需的密码 requirepass asdbgt123456    asdbgt123456为密码 设置密码

防火墙开放端口配置

仅允许内网IP访问指定端口

#(1)允许172.26.188.0 IP段访问6379端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="6379" accept'
#(2)允许172.26.188.0 IP段访问9333端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="9333" accept'
#(3)允许172.26.188.0 IP段访问19333端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="19333" accept'
#(4)执行完命令要刷新才能生效
输入命令 firewall-cmd --reload
#(5)列出所有的开放端口
输入命令 firewall-cmd --list-all
列出所有的开放端口

移除策略

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="IP地址" port protocol="tcp" port="端口号" accept'
#例如移除9333端口策略
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="9333" accept'
输入命令 firewall-cmd --reload 执行完命令要刷新才能生效


卷服务(volume)配置 主机:V1

下载SeaweedFS并复制到指定目录前面已有教程介绍,这里就不再赘述。

1.创建seaweedfs启动用户并授权

输入命令 getent group seaweedfs || groupadd -r seaweedfs

输入命令 getent passwd seaweedfs || useradd -r -d /opt -s /bin/nologin -g seaweedfs seaweedfs

2.更改文件权限

输入命令 chown -R seaweedfs:seaweedfs /usr/local/seaweedfs

3.配置开机启动卷服务(volume)脚本

A.增加seaweedfs-volume.service 在/usr/lib/systemd/system目录下增加seaweedfs-volume.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-volume.service

B. 将下面的配置内容复制到seaweedfs-volume.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS Volume
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 volume -max=5 -mserver=172.26.188.177:9333 -ip=172.26.188.173 -port=8080 -dir=/usr/local/seaweedfs/data -dataCenter=dc1 -rack=rack1
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-volume
				
				[Install]
				WantedBy=multi-user.target
				
				
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

注意:-max 参数为最大逻辑卷数量。例如硬盘可用空间为800G,则大约800/30 ≈ 26,最大可设置为26
使用配置好的系统服务管理seaweedfs-volume
systemctl enable seaweedfs-volume 配置开机启动
systemctl start seaweedfs-volume 启动
systemctl stop seaweedfs-volume 停止
systemctl restart seaweedfs-volume 重启
systemctl disable seaweedfs-volume 删除开机启动
systemctl daemon-reload 刷新

配置文件管理服务(filer)

1.生成文件管理(filer)服务配置文件

A.进入/usr/local/seaweedfs/目录,生成filer.toml文件
输入命令 cd /usr/local/seaweedfs/
输入命令 ./weed scaffold -config filer -output="/usr/local/seaweedfs/"
生成filer.toml文件
B.配置filer.toml文件。使用Redis存储文件映射关系。请按实际情况更改下面的IP地址和密码。
输入命令 vim filer.toml
				
					[leveldb2]
					enabled = false

					[redis2]
					enabled = true
					address  = "172.26.188.177:6379"
					password = "asdbgt123456"
				
				

修改完成后要更改文件权限

输入命令 chown -R seaweedfs:seaweedfs /usr/local/seaweedfs
更改文件权限

2.配置开机启动文件服务(filer)脚本

A.增加seaweedfs-filer.service 在/usr/lib/systemd/system目录下增加seaweedfs-filer.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-filer.service

B. 将下面的配置内容复制到seaweedfs-filer.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS Filer
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 filer -master=172.26.188.177:9333 -port=8888 -defaultReplicaPlacement=001
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-filer
				
				[Install]
				WantedBy=multi-user.target
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

使用配置好的系统服务管理seaweedfs-filer
systemctl enable seaweedfs-filer 配置开机启动
systemctl start seaweedfs-filer 启动
systemctl stop seaweedfs-filer 停止
systemctl restart seaweedfs-filer 重启
systemctl disable seaweedfs-filer 删除开机启动
systemctl daemon-reload 刷新


配置S3网关

1.生成S3网关服务配置文件

A.进入/usr/local/seaweedfs/目录,创建config.json文件
输入命令 cd /usr/local/seaweedfs/
输入命令 vim config.json
创建config.json文件
B.将下面的配置内容复制到config.json文件中。请按实际情况更改下面的参数。accessKey相当于账号,secretKey相当于密钥
				
					{
					  "identities": [
					  	 {
					      "name": "anonymous",
					      "actions": [
					        "Read"
					      ]
					    },
					    {
					      "name": "some_name",
					      "credentials": [
					        {
					          "accessKey": "test",
					          "secretKey": "diEvRU6eQez123456Dkkpo4srS"
					        }
					      ],
					      "actions": [
					        "Admin",
					        "Read",
					        "Write"
					      ]
					    }
					  ]
					}
				
				

2.配置开机启动S3网关脚本

A.增加seaweedfs-s3.service 在/usr/lib/systemd/system目录下增加seaweedfs-s3.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-s3.service

B. 将下面的配置内容复制到seaweedfs-s3.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS S3
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 s3 -port=8333 -filer=172.26.188.173:8888 -config=config.json
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-s3
				
				[Install]
				WantedBy=multi-user.target
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

使用配置好的系统服务管理seaweedfs-s3
systemctl enable seaweedfs-s3 配置开机启动
systemctl start seaweedfs-s3 启动
systemctl stop seaweedfs-s3 停止
systemctl restart seaweedfs-s3 重启
systemctl disable seaweedfs-s3 删除开机启动
systemctl daemon-reload 刷新


配置Nginx转发请求

配置Nginx将80端口的请求转发到8333端口,并动态生成缩略图

				
					# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
					# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
					# keys_zone 设置缓存名字和共享内存大小
					# inactive 在指定时间内没人访问则被删除 30m/分钟
					# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
					# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
					proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;
					
					server {
					   listen 80;
					   server_name _;
					   return 404;
					}
					
					
					#配置请求转发
					server{
					        listen  80;
					        server_name img1.diyhi.com;
					        location /{
					        	# 跨域
							    if ($request_method = OPTIONS ) {
							      #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							      #add_header "Access-Control-Allow-Origin"  *;
							      add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							      add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							      add_header "Access-Control-Allow-Headers" "*";
							      return 200;
							    }
							    #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							    #add_header "Access-Control-Allow-Origin"  *;
							    add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							    add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							    add_header "Access-Control-Allow-Headers" "*";
					        
					        
					        	proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
					        	proxy_pass http://172.26.188.173:8333;
					        	client_max_body_size 100M; #允许上传文件大小,默认是1M          
							
							} 
					
					
					
							location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
								#只在非DELETE请求时处理
							    if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
									#返回302,让下一步执行内部跳转
									return 302;
									error_page 302 = @process_secure_link;
								}
								proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
								proxy_pass http://172.26.188.173:8333;
							
							}
					
							location @process_secure_link {
									secure_link $arg_md5,$arg_expires;
								    #表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
									secure_link_md5 1234567890123456$uri$arg_expires;
						
						
								    #当匹配成功的时候 secure_link 是非空非0的
						
								    # 没有匹配到返回 ""
								    if ($secure_link = "") {
								        return 403;
								    }
						
								    # 没有匹配到返回0
								    if ($secure_link = "0") {
								        return 410;
								    }
								   	#文件名重命名
								    if ($arg_filename != "") {
								        add_header Content-Disposition 'attachment; filename="$arg_filename"';
								    }
									     
								   	#不设置跨域无法播放ts视频切片      	
								   	add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
									add_header "Access-Control-Allow-Methods" "GET, HEAD";
									add_header "Access-Control-Allow-Headers" "*";     
						
								     				proxy_set_header Host $host;
								                	proxy_set_header X-Real-Ip $remote_addr;
								                	proxy_set_header X-Forwarded-For $remote_addr;
									#proxy_redirect off;
									
									proxy_pass http://172.26.188.173:8333;
							}
					    
					
					
					
							location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
							    proxy_set_header Host $host;
							    proxy_set_header X-Real-Ip $remote_addr;
							    proxy_set_header X-Forwarded-For $remote_addr;
							    proxy_pass http://172.26.188.173:8333;
							    client_max_body_size 100M; #允许上传文件大小,默认是1M
							    
							    #只在GET请求时处理图片
								if ($request_method = GET) {
										#返回302,让下一步执行内部跳转
								    return 302;
								    error_page 302 = @process_image_filter;
								}
						}
					
					
						#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输
							
						# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
						#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
						#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
						location @process_image_filter {
							proxy_pass http://172.26.188.173:8333;
							#标记条件 nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法
							set $flag 0;
							#将参数赋值给宽
							set $width $arg_width;
					
							#是否为原图
							set $originalImage 0;
					
							if ($width != ''){
								 set $flag "${flag}1";
							}
							#预设宽度为240或400,当输入其它宽度时默认改为240
							if ($arg_width !~ ^(240|400)$){
								 set $flag "${flag}1";
							}
							#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
							if ($flag = "011"){
								 set $width '240';
							}
					
					
							#当请求的是原图时(即不带参数),则设置宽高维度为”-”
							if ( $width = '' ) {
								set $width '-';
							}
							
							#如果访问原图
							if ( $width = '-' ) {
								set $originalImage 1;
							}
							
							#原图不缓存		                 
							proxy_no_cache $originalImage;
					
							#默认使用的key就是URL
							proxy_cache_key $host$uri$width;
					
					
					 		# 将缩略图缓存在服务,避免每次请求都重新生成
							proxy_cache img_cache;
							# 有效的文件,在服务器缓存 1 天
							proxy_cache_valid 200 1d;
							#默认值:proxy_cache_lock off;
							#可配置段:http, server, location
							#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存>有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
							proxy_cache_lock on;
							#默认值:proxy_cache_lock_timeout 5s;
							#可配置段:http, server, location
							#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
							proxy_cache_lock_timeout 5s;
							#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
							proxy_cache_revalidate on;
					
							#标记缓存是否命中,在访问文件头Response Headers中查看
							# MISS 未命中,请求被传送到后端
							# HIT 缓存命中
							# EXPIRED 缓存已经过期请求被传送到后端
							# UPDATING 正在更新缓存,将使用旧的应答
							# STALE 后端将得到过期的应答
							add_header  Nginx-Cache "$upstream_cache_status";
							
					
							#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
							image_filter resize $width -;
							#设置读取图像缓冲的最大大小,超过则415错误。
							image_filter_buffer 100M;
							#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。  
							image_filter_jpeg_quality 90;
							#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
						  	image_filter_transparency on;
					
						}
						
					}
				
				


防火墙开放端口配置

仅允许内网IP访问指定端口

#(1)允许172.26.188.0 IP段访问8080端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="8080" accept'
#(2)允许172.26.188.0 IP段访问18080端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="18080" accept'
#(3)允许172.26.188.0 IP段访问8888端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="8888" accept'
#(4)允许172.26.188.0 IP段访问18888端口
输入命令 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="18888" accept'
#(5)允许公网访问80端口
输入命令 firewall-cmd --permanent --zone=public --add-port=80/tcp
#(6)执行完命令要刷新才能生效
输入命令 firewall-cmd --reload
#(7)列出所有的开放端口
输入命令 firewall-cmd --list-all
列出所有的开放端口

移除策略

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="IP地址" port protocol="tcp" port="端口号" accept'
#例如移除8080端口策略
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="172.26.188.0/24" port protocol="tcp" port="8080" accept'
输入命令 firewall-cmd --reload 执行完命令要刷新才能生效


卷服务(volume)配置 主机:V2

...  ...
...  ...
省略的教程和上面的主机V1配置相同
...  ...
...  ...

3.配置开机启动卷服务(volume)脚本

A.增加seaweedfs-volume.service 在/usr/lib/systemd/system目录下增加seaweedfs-volume.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-volume.service

B. 将下面的配置内容复制到seaweedfs-volume.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS Volume
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 volume -max=5 -mserver=172.26.188.177:9333 -ip=172.26.188.174 -port=8080 -dir=/usr/local/seaweedfs/data -dataCenter=dc1 -rack=rack1
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-volume
				
				[Install]
				WantedBy=multi-user.target
				
				
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

注意:-max 参数为最大逻辑卷数量。例如硬盘可用空间为800G,则大约800/30 ≈ 26,最大可设置为26
...  ...
...  ...
...  ...

2.配置开机启动S3网关脚本

A.增加seaweedfs-s3.service 在/usr/lib/systemd/system目录下增加seaweedfs-s3.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-s3.service

B. 将下面的配置内容复制到seaweedfs-s3.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS S3
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 s3 -port=8333 -filer=172.26.188.174:8888 -config=config.json
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-s3
				
				[Install]
				WantedBy=multi-user.target
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload



...  ...
...  ...
...  ...

配置Nginx转发请求

配置Nginx将80端口的请求转发到8333端口,并动态生成缩略图

				
					# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
					# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
					# keys_zone 设置缓存名字和共享内存大小
					# inactive 在指定时间内没人访问则被删除 30m/分钟
					# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
					# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
					proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;
					
					server {
					   listen 80;
					   server_name _;
					   return 404;
					}
					
					
					#配置请求转发
					server{
					        listen  80;
					        server_name img2.diyhi.com;
					        location /{
					        	# 跨域
							    if ($request_method = OPTIONS ) {
							      #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							      #add_header "Access-Control-Allow-Origin"  *;
							      add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							      add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							      add_header "Access-Control-Allow-Headers" "*";
							      return 200;
							    }
							    #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							    #add_header "Access-Control-Allow-Origin"  *;
							    add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							    add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							    add_header "Access-Control-Allow-Headers" "*";
					        
					        
					        	proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
					        	proxy_pass http://172.26.188.174:8333;
					        	client_max_body_size 100M; #允许上传文件大小,默认是1M          
							
							} 
					
					
					
							location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
								#只在非DELETE请求时处理
							    if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
									#返回302,让下一步执行内部跳转
									return 302;
									error_page 302 = @process_secure_link;
								}
								proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
								proxy_pass http://172.26.188.174:8333;
							
							}
					
							location @process_secure_link {
									secure_link $arg_md5,$arg_expires;
								    #表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
									secure_link_md5 1234567890123456$uri$arg_expires;
						
						
								    #当匹配成功的时候 secure_link 是非空非0的
						
								    # 没有匹配到返回 ""
								    if ($secure_link = "") {
								        return 403;
								    }
						
								    # 没有匹配到返回0
								    if ($secure_link = "0") {
								        return 410;
								    }
								    #文件名重命名
								    if ($arg_filename != "") {
								        add_header Content-Disposition 'attachment; filename="$arg_filename"';
								    }
									     
								   	#不设置跨域无法播放ts视频切片      	
								   	add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
									add_header "Access-Control-Allow-Methods" "GET, HEAD";
									add_header "Access-Control-Allow-Headers" "*";     
						
								     				proxy_set_header Host $host;
								                	proxy_set_header X-Real-Ip $remote_addr;
								                	proxy_set_header X-Forwarded-For $remote_addr;
									#proxy_redirect off;
									
									proxy_pass http://172.26.188.174:8333;
							}
					    
					
					
					
							location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
							    proxy_set_header Host $host;
							    proxy_set_header X-Real-Ip $remote_addr;
							    proxy_set_header X-Forwarded-For $remote_addr;
							    proxy_pass http://172.26.188.174:8333;
							    client_max_body_size 100M; #允许上传文件大小,默认是1M
							    
							    #只在GET请求时处理图片
								if ($request_method = GET) {
										#返回302,让下一步执行内部跳转
								    return 302;
								    error_page 302 = @process_image_filter;
								}
						}
					
					
						#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输
							
						# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
						#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
						#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
						location @process_image_filter {
							proxy_pass http://172.26.188.174:8333;
							#标记条件 nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法
							set $flag 0;
							#将参数赋值给宽
							set $width $arg_width;
					
							#是否为原图
							set $originalImage 0;
					
							if ($width != ''){
								 set $flag "${flag}1";
							}
							#预设宽度为240或400,当输入其它宽度时默认改为240
							if ($arg_width !~ ^(240|400)$){
								 set $flag "${flag}1";
							}
							#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
							if ($flag = "011"){
								 set $width '240';
							}
					
					
							#当请求的是原图时(即不带参数),则设置宽高维度为”-”
							if ( $width = '' ) {
								set $width '-';
							}
							
							#如果访问原图
							if ( $width = '-' ) {
								set $originalImage 1;
							}
							
							#原图不缓存		                 
							proxy_no_cache $originalImage;
					
							#默认使用的key就是URL
							proxy_cache_key $host$uri$width;
					
					
					 		# 将缩略图缓存在服务,避免每次请求都重新生成
							proxy_cache img_cache;
							# 有效的文件,在服务器缓存 1 天
							proxy_cache_valid 200 1d;
							#默认值:proxy_cache_lock off;
							#可配置段:http, server, location
							#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存>有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
							proxy_cache_lock on;
							#默认值:proxy_cache_lock_timeout 5s;
							#可配置段:http, server, location
							#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
							proxy_cache_lock_timeout 5s;
							#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
							proxy_cache_revalidate on;
					
							#标记缓存是否命中,在访问文件头Response Headers中查看
							# MISS 未命中,请求被传送到后端
							# HIT 缓存命中
							# EXPIRED 缓存已经过期请求被传送到后端
							# UPDATING 正在更新缓存,将使用旧的应答
							# STALE 后端将得到过期的应答
							add_header  Nginx-Cache "$upstream_cache_status";
							
					
							#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
							image_filter resize $width -;
							#设置读取图像缓冲的最大大小,超过则415错误。
							image_filter_buffer 100M;
							#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。  
							image_filter_jpeg_quality 90;
							#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
						  	image_filter_transparency on;
					
						}
						
					}
				
				


...  ...
...  ...


卷服务(volume)配置 主机:V3

...  ...
...  ...
省略的教程和上面的主机V1配置相同
...  ...
...  ...

3.配置开机启动卷服务(volume)脚本

A.增加seaweedfs-volume.service 在/usr/lib/systemd/system目录下增加seaweedfs-volume.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-volume.service

B. 将下面的配置内容复制到seaweedfs-volume.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS Volume
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 volume -max=5 -mserver=172.26.188.177:9333 -ip=172.26.188.175 -port=8080 -dir=/usr/local/seaweedfs/data -dataCenter=dc1 -rack=rack2
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-volume
				
				[Install]
				WantedBy=multi-user.target
				
				
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

注意:-max 参数为最大逻辑卷数量。例如硬盘可用空间为800G,则大约800/30 ≈ 26,最大可设置为26
...  ...
...  ...
...  ...

2.配置开机启动S3网关脚本

A.增加seaweedfs-s3.service 在/usr/lib/systemd/system目录下增加seaweedfs-s3.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-s3.service

B. 将下面的配置内容复制到seaweedfs-s3.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS S3
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 s3 -port=8333 -filer=172.26.188.175:8888 -config=config.json
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-s3
				
				[Install]
				WantedBy=multi-user.target
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload



...  ...
...  ...
...  ...

配置Nginx转发请求

配置Nginx将80端口的请求转发到8333端口,并动态生成缩略图

				
					# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
					# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
					# keys_zone 设置缓存名字和共享内存大小
					# inactive 在指定时间内没人访问则被删除 30m/分钟
					# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
					# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
					proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;
					
					server {
					   listen 80;
					   server_name _;
					   return 404;
					}
					
					
					#配置请求转发
					server{
					        listen  80;
					        server_name img3.diyhi.com;
					        location /{
					        	# 跨域
							    if ($request_method = OPTIONS ) {
							      #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							      #add_header "Access-Control-Allow-Origin"  *;
							      add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							      add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							      add_header "Access-Control-Allow-Headers" "*";
							      return 200;
							    }
							    #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							    #add_header "Access-Control-Allow-Origin"  *;
							    add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							    add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							    add_header "Access-Control-Allow-Headers" "*";
					        
					        
					        	proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
					        	proxy_pass http://172.26.188.175:8333;
					        	client_max_body_size 100M; #允许上传文件大小,默认是1M          
							
							} 
					
					
					
							location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
								#只在非DELETE请求时处理
							    if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
									#返回302,让下一步执行内部跳转
									return 302;
									error_page 302 = @process_secure_link;
								}
								proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
								proxy_pass http://172.26.188.175:8333;
							
							}
					
							location @process_secure_link {
									secure_link $arg_md5,$arg_expires;
								    #表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
									secure_link_md5 1234567890123456$uri$arg_expires;
						
						
								    #当匹配成功的时候 secure_link 是非空非0的
						
								    # 没有匹配到返回 ""
								    if ($secure_link = "") {
								        return 403;
								    }
						
								    # 没有匹配到返回0
								    if ($secure_link = "0") {
								        return 410;
								    }
								    #文件名重命名
								    if ($arg_filename != "") {
								        add_header Content-Disposition 'attachment; filename="$arg_filename"';
								    }
									     
								   	#不设置跨域无法播放ts视频切片      	
								   	add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
									add_header "Access-Control-Allow-Methods" "GET, HEAD";
									add_header "Access-Control-Allow-Headers" "*";     
						
								     				proxy_set_header Host $host;
								                	proxy_set_header X-Real-Ip $remote_addr;
								                	proxy_set_header X-Forwarded-For $remote_addr;
									#proxy_redirect off;
									
									proxy_pass http://172.26.188.175:8333;
							}
					    
					
					
					
							location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
							    proxy_set_header Host $host;
							    proxy_set_header X-Real-Ip $remote_addr;
							    proxy_set_header X-Forwarded-For $remote_addr;
							    proxy_pass http://172.26.188.175:8333;
							    client_max_body_size 100M; #允许上传文件大小,默认是1M
							    
							    #只在GET请求时处理图片
								if ($request_method = GET) {
										#返回302,让下一步执行内部跳转
								    return 302;
								    error_page 302 = @process_image_filter;
								}
						}
					
					
						#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输
							
						# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
						#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
						#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
						location @process_image_filter {
							proxy_pass http://172.26.188.175:8333;
							#标记条件 nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法
							set $flag 0;
							#将参数赋值给宽
							set $width $arg_width;
					
							#是否为原图
							set $originalImage 0;
					
							if ($width != ''){
								 set $flag "${flag}1";
							}
							#预设宽度为240或400,当输入其它宽度时默认改为240
							if ($arg_width !~ ^(240|400)$){
								 set $flag "${flag}1";
							}
							#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
							if ($flag = "011"){
								 set $width '240';
							}
					
					
							#当请求的是原图时(即不带参数),则设置宽高维度为”-”
							if ( $width = '' ) {
								set $width '-';
							}
							
							#如果访问原图
							if ( $width = '-' ) {
								set $originalImage 1;
							}
							
							#原图不缓存		                 
							proxy_no_cache $originalImage;
					
							#默认使用的key就是URL
							proxy_cache_key $host$uri$width;
					
					
					 		# 将缩略图缓存在服务,避免每次请求都重新生成
							proxy_cache img_cache;
							# 有效的文件,在服务器缓存 1 天
							proxy_cache_valid 200 1d;
							#默认值:proxy_cache_lock off;
							#可配置段:http, server, location
							#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存>有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
							proxy_cache_lock on;
							#默认值:proxy_cache_lock_timeout 5s;
							#可配置段:http, server, location
							#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
							proxy_cache_lock_timeout 5s;
							#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
							proxy_cache_revalidate on;
					
							#标记缓存是否命中,在访问文件头Response Headers中查看
							# MISS 未命中,请求被传送到后端
							# HIT 缓存命中
							# EXPIRED 缓存已经过期请求被传送到后端
							# UPDATING 正在更新缓存,将使用旧的应答
							# STALE 后端将得到过期的应答
							add_header  Nginx-Cache "$upstream_cache_status";
							
					
							#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
							image_filter resize $width -;
							#设置读取图像缓冲的最大大小,超过则415错误。
							image_filter_buffer 100M;
							#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。  
							image_filter_jpeg_quality 90;
							#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
						  	image_filter_transparency on;
					
						}
						
					}
				
				


...  ...
...  ...


卷服务(volume)配置 主机:V4

...  ...
...  ...
省略的教程和上面的主机V1配置相同
...  ...
...  ...

3.配置开机启动卷服务(volume)脚本

A.增加seaweedfs-volume.service 在/usr/lib/systemd/system目录下增加seaweedfs-volume.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-volume.service

B. 将下面的配置内容复制到seaweedfs-volume.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS Volume
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 volume -max=5 -mserver=172.26.188.177:9333 -ip=172.26.188.176 -port=8080 -dir=/usr/local/seaweedfs/data -dataCenter=dc1 -rack=rack2
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-volume
				
				[Install]
				WantedBy=multi-user.target
				
				
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload

注意:-max 参数为最大逻辑卷数量。例如硬盘可用空间为800G,则大约800/30 ≈ 26,最大可设置为26
...  ...
...  ...
...  ...

2.配置开机启动S3网关脚本

A.增加seaweedfs-s3.service 在/usr/lib/systemd/system目录下增加seaweedfs-s3.service,目录必须是绝对目录

输入命令 cd /usr/lib/systemd/system

输入命令 vim seaweedfs-s3.service

B. 将下面的配置内容复制到seaweedfs-s3.service文件中。请按实际情况更改下面的IP地址。

				
				[Unit]
				Description=SeaweedFS S3
				After=network.target
				
				[Service]
				Type=simple
				User=seaweedfs
				Group=seaweedfs
				
				ExecStart=/usr/local/seaweedfs/weed -v=0 s3 -port=8333 -filer=172.26.188.176:8888 -config=config.json
				WorkingDirectory=/usr/local/seaweedfs/
				SyslogIdentifier=seaweedfs-s3
				
				[Install]
				WantedBy=multi-user.target
				
				

保存配置文件后执行systemctl daemon-reload命令刷新

输入命令 systemctl daemon-reload



...  ...
...  ...
...  ...

配置Nginx转发请求

配置Nginx将80端口的请求转发到8333端口,并动态生成缩略图

				
					# proxy_cache_path 缓存文件路径 需要手动建文件夹 mkdir /etc/nginx/cache
					# levels 设置缓存文件目录层次;levels=1:2 表示两级目录
					# keys_zone 设置缓存名字和共享内存大小
					# inactive 在指定时间内没人访问则被删除 30m/分钟
					# inactive 未被访问文件在缓存中保留时间,如果设为30m,则30分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 30m/分钟 7d/7天
					# max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
					proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=img_cache:10m inactive=1d max_size=50G;
					
					server {
					   listen 80;
					   server_name _;
					   return 404;
					}
					
					
					#配置请求转发
					server{
					        listen  80;
					        server_name img4.diyhi.com;
					        location /{
					        	# 跨域
							    if ($request_method = OPTIONS ) {
							      #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							      #add_header "Access-Control-Allow-Origin"  *;
							      add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							      add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							      add_header "Access-Control-Allow-Headers" "*";
							      return 200;
							    }
							    #测试时参数值可以用星号代表任意域名,生产环境请填写具体域名
							    #add_header "Access-Control-Allow-Origin"  *;
							    add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
							    add_header "Access-Control-Allow-Methods" "GET, POST, PUT, OPTIONS, HEAD";
							    add_header "Access-Control-Allow-Headers" "*";
					        
					        
					        	proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
					        	proxy_pass http://172.26.188.176:8333;
					        	client_max_body_size 100M; #允许上传文件大小,默认是1M          
							
							} 
					
					
					
							location ~ /(file/topic|file/help)/.*\.(m3u8|ts|mp4|avi|mkv|wmv|wav|rm|rmvb|mp3|flac|ape|zip|rar|7z|txt|docx|doc|pptx|ppt|xlsx|xls)$ {
								#只在非DELETE请求时处理
							    if ($request_method ~ ^(GET|POST|HEAD|OPTIONS|PUT|TRACE|CONNECT)$ ) {
									#返回302,让下一步执行内部跳转
									return 302;
									error_page 302 = @process_secure_link;
								}
								proxy_set_header Host $host;
					        	proxy_set_header X-Real-Ip $remote_addr;
					        	proxy_set_header X-Forwarded-For $remote_addr;
								proxy_pass http://172.26.188.176:8333;
							
							}
					
							location @process_secure_link {
									secure_link $arg_md5,$arg_expires;
								    #表示 MD5(密钥 + 不包含主机名和请求参数的剩余部分文件路径 + 过期时间) 1234567890123456是密钥,必须是16位字符并且和管理后台的'基本设置'中'文件防盗链密钥'一致
									secure_link_md5 1234567890123456$uri$arg_expires;
						
						
								    #当匹配成功的时候 secure_link 是非空非0的
						
								    # 没有匹配到返回 ""
								    if ($secure_link = "") {
								        return 403;
								    }
						
								    # 没有匹配到返回0
								    if ($secure_link = "0") {
								        return 410;
								    }
								    #文件名重命名
								    if ($arg_filename != "") {
								        add_header Content-Disposition 'attachment; filename="$arg_filename"';
								    }
									     
								   	#不设置跨域无法播放ts视频切片      	
								   	add_header "Access-Control-Allow-Origin"  "http://bbs.diyhi.com";
									add_header "Access-Control-Allow-Methods" "GET, HEAD";
									add_header "Access-Control-Allow-Headers" "*";     
						
								     				proxy_set_header Host $host;
								                	proxy_set_header X-Real-Ip $remote_addr;
								                	proxy_set_header X-Forwarded-For $remote_addr;
									#proxy_redirect off;
									
									proxy_pass http://172.26.188.176:8333;
							}
					    
					
					
					
							location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
							    proxy_set_header Host $host;
							    proxy_set_header X-Real-Ip $remote_addr;
							    proxy_set_header X-Forwarded-For $remote_addr;
							    proxy_pass http://172.26.188.176:8333;
							    client_max_body_size 100M; #允许上传文件大小,默认是1M
							    
							    #只在GET请求时处理图片
								if ($request_method = GET) {
										#返回302,让下一步执行内部跳转
								    return 302;
								    error_page 302 = @process_image_filter;
								}
						}
					
					
						#Nginx 不支持在 if {} 这个 block 里面用 image_filter 函数,image_filter 的第一个参数 resize/crop 也不能用变量的方式传输
							
						# ~ 为区分大小写匹配 ~* 为不区分大小写匹配
						#location ~ .*.(gif|jpg|jpeg|png|bmp)$ {
						#location ~ /(file/topic)/.*\.(jpg|jpeg|gif|png|bmp)$ {
						location @process_image_filter {
							proxy_pass http://172.26.188.176:8333;
							#标记条件 nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法
							set $flag 0;
							#将参数赋值给宽
							set $width $arg_width;
					
							#是否为原图
							set $originalImage 0;
					
							if ($width != ''){
								 set $flag "${flag}1";
							}
							#预设宽度为240或400,当输入其它宽度时默认改为240
							if ($arg_width !~ ^(240|400)$){
								 set $flag "${flag}1";
							}
							#如果URL带宽度参数并且不属于预先指定尺寸,则默认显示宽240
							if ($flag = "011"){
								 set $width '240';
							}
					
					
							#当请求的是原图时(即不带参数),则设置宽高维度为”-”
							if ( $width = '' ) {
								set $width '-';
							}
							
							#如果访问原图
							if ( $width = '-' ) {
								set $originalImage 1;
							}
							
							#原图不缓存		                 
							proxy_no_cache $originalImage;
					
							#默认使用的key就是URL
							proxy_cache_key $host$uri$width;
					
					
					 		# 将缩略图缓存在服务,避免每次请求都重新生成
							proxy_cache img_cache;
							# 有效的文件,在服务器缓存 1 天
							proxy_cache_valid 200 1d;
							#默认值:proxy_cache_lock off;
							#可配置段:http, server, location
							#作用:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存>有数据要么限时等待锁释放。通常在多个客户端请求缓存未命中时,只有第一个请求可以发向原服务器,其他请求要等待第一个响应返回或者超时后,使用缓存响应客户端。该参数可以合并回源请求,减轻峰值流量下的压力。
							proxy_cache_lock on;
							#默认值:proxy_cache_lock_timeout 5s;
							#可配置段:http, server, location
							#作用:等待缓存锁超时之后将直接请求后端,结果不会被缓存。
							proxy_cache_lock_timeout 5s;
							#当缓存过期后,如果开启了 proxy_cache_revalidate,则会发出一次 if-modified-since 或 if-none-match 条件请求,如果后端返回 304,则此时$upstream_cache_status 为 REVALIDATED,我们将得到两个好处,节省带宽和减少写磁盘的次数。
							proxy_cache_revalidate on;
					
							#标记缓存是否命中,在访问文件头Response Headers中查看
							# MISS 未命中,请求被传送到后端
							# HIT 缓存命中
							# EXPIRED 缓存已经过期请求被传送到后端
							# UPDATING 正在更新缓存,将使用旧的应答
							# STALE 后端将得到过期的应答
							add_header  Nginx-Cache "$upstream_cache_status";
							
					
							#按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。
							image_filter resize $width -;
							#设置读取图像缓冲的最大大小,超过则415错误。
							image_filter_buffer 100M;
							#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。  
							image_filter_jpeg_quality 90;
							#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。
						  	image_filter_transparency on;
					
						}
						
					}
				
				


...  ...
...  ...


巡云轻论坛系统管理后台设置

1、打开‘文件存储系统接口列表’--‘添加文件系统接口’,接口产品选择‘SeaweedFS’

文件存储系统接口列表


本地文件存储和SeaweedFS文件存储互相迁移

1、打开‘系统设置’--‘维护数据’,选择‘SeaweedFS文件同步到本地’或‘本地文件同步到SeaweedFS’

SeaweedFS文件同步