轻论坛系统默认使用本地存储,含有第三方文件存储功能的版本可以配置接入使用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
2、下载对应当前系统版本的安装包,64位Linux适合linux_amd64.tar.gz
输入命令 wget https://github.com/chrislusf/seaweedfs/releases/download/2.05/windows_amd64.zip3、创建目录
输入命令 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/mdatamaster参数 | ||
---|---|---|
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端口为-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
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/seaweedfs3.配置开机启动主服务(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安装教程在《CentOS服务器环境配置演示》中已有介绍,这里就不再赘述。请按实际情况更改下面的IP地址。
输入命令 vim /etc/redis.conf仅允许内网IP访问指定端口
#(1)允许172.26.188.0 IP段访问6379端口移除策略
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="IP地址" port protocol="tcp" port="端口号" accept'下载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/seaweedfs3.配置开机启动卷服务(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 | 刷新 |
1.生成文件管理(filer)服务配置文件
A.进入/usr/local/seaweedfs/目录,生成filer.toml文件
[leveldb2]
enabled = false
[redis2]
enabled = true
address = "172.26.188.177:6379"
password = "asdbgt123456"
修改完成后要更改文件权限
输入命令 chown -R seaweedfs:seaweedfs /usr/local/seaweedfs2.配置开机启动文件服务(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 | 刷新 |
1.生成S3网关服务配置文件
A.进入/usr/local/seaweedfs/目录,创建config.json文件
{
"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将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 --remove-rich-rule='rule family="ipv4" source address="IP地址" port protocol="tcp" port="端口号" accept'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,最大可设置为262.配置开机启动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将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;
}
}
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,最大可设置为262.配置开机启动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将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;
}
}
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,最大可设置为262.配置开机启动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将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’
1、打开‘系统设置’--‘维护数据’,选择‘SeaweedFS文件同步到本地’或‘本地文件同步到SeaweedFS’