轻论坛系统默认使用本地存储,含有第三方文件存储功能的版本可以配置接入使用MinIO对象存储,下面演示MinIO集群的配置方法,演示主机操作系统为CentOS 8.2,对象存储MinIO版本为2020-08-08T04:50:06Z。本次演示使用4台服务器。
主机名称 | IP地址 | 安装软件 | 开放端口 | 绑定域名 |
---|---|---|---|---|
V1 |
***.100.100.152(公网) 172.26.188.173(内网) |
MinIO Nginx |
80 (公网开放) 9000 (内网开放) |
img1.diyhi.com |
V2 |
***.100.241.36(公网) 172.26.188.174(内网) |
MinIO Nginx |
80 (公网开放) 9000 (内网开放) |
img2.diyhi.com |
V3 |
***.100.159.63(公网) 172.26.188.175(内网) |
MinIO Nginx |
80 (公网开放) 9000 (内网开放) |
img3.diyhi.com |
V4 |
***.92.127.117(公网) 172.26.188.176(内网) |
MinIO Nginx |
80 (公网开放) 9000 (内网开放) |
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、创建并进入安装目录
输入命令 mkdir /usr/local/minio2、下载对应当前系统版本的安装包
输入命令 wget https://dl.min.io/server/minio/release/linux-amd64/minio3、创建minio启动用户并授权
输入命令 getent group minio || groupadd -r minio4、minio文件赋予750权限
输入命令 chmod 750 /usr/local/minio/minio5、创建存放数据目录
输入命令 mkdir /usr/local/minio/data6、编辑minio配置文件
输入命令 vim /usr/local/minio/minio.conf将下面的配置内容复制到minio.conf文件中。请按实际情况更改下面的参数,集群下所有节点的账号密码必须一致。
# 指定数据存储目录(注意这个目录要存在)
MINIO_VOLUMES="http://172.26.188.173/usr/local/minio/data http://172.26.188.174/usr/local/minio/data http://172.26.188.175/usr/local/minio/data http://172.26.188.176/usr/local/minio/data"
#
#指定监听端口(也可以不监听具体ip,只写 :9000即可)
MINIO_OPTS="--address :9000"
#
#Access key,相当于账号
MINIO_ACCESS_KEY="test"
#
#Secret key,相当于密码
MINIO_SECRET_KEY="diEvRU6eQez123456Dkkpo4srS"
#
#区域值,这是完全自己写的,比如你愿意的话写“abcd”也行,但标准格式是“国家-区域-编号”,
#如“中国-华北-1号”就可写成“cn-north-1”,又比如“美国-西部-2号”可写成“us-west-1”
# #MINIO_REGION="cn-south-1"
#
#域名
# #MINIO_DOMAIN=s3.diyhi.com
7、更改文件、目录属主属组
输入命令 chown -R minio:minio /usr/local/minio8、设置命令启动服务
输入命令 vim /usr/lib/systemd/system/minio.service将下面的配置内容复制到minio.service文件中。
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/minio/minio
[Service]
User=minio
Group=minio
EnvironmentFile=/usr/local/minio/minio.conf
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/minio/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
保存配置文件后执行systemctl daemon-reload命令刷新
输入命令 systemctl daemon-reload使用配置好的系统服务管理MinIO | |
---|---|
systemctl enable minio | 配置开机启动 |
systemctl start minio | 启动 |
systemctl stop minio | 停止 |
systemctl restart minio | 重启 |
systemctl disable minio | 删除开机启动 |
systemctl daemon-reload | 刷新 |
1.下载并安装nginx
输入命令 yum install nginx2.启动nginx
输入命令 systemctl start nginx使用配置好的系统服务管理Nginx | |
---|---|
systemctl enable nginx | 配置开机启动 |
systemctl start nginx | 启动nginx |
systemctl stop nginx | 停止nginx |
systemctl restart nginx | 重启nginx |
systemctl disable nginx | 删除开机启动 |
systemctl daemon-reload | 刷新 |
3.配置nginx
默认的配置文件在 /etc/nginx 路径下,使用该配置已经可以正确地运行nginx;如需要自定义,修改其下的 nginx.conf 等文件即可
输入命令 vim /etc/nginx/conf.d/default.conf配置Nginx参数 请按实际情况更改下面的参数。
# 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;
}
#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img1.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
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://127.0.0.1:9000;
}
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"';
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}
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://127.0.0.1:9000;
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://127.0.0.1:9000;
#标记条件 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;
}
}
配置完成保存。 调用nginx -t测试配置文件是否正确
7.日志
访问日志默认路径 /var/log/nginx/access.log仅允许内网IP访问指定端口
#(1)允许172.26.188.0 IP段访问9000端口移除策略
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="IP地址" port protocol="tcp" port="端口号" accept'配置Nginx参数 请按实际情况更改下面的参数。
# 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;
}
#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img2.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
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://127.0.0.1:9000;
}
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"';
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}
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://127.0.0.1:9000;
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://127.0.0.1:9000;
#标记条件 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;
}
}
... ...配置Nginx参数 请按实际情况更改下面的参数。
# 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;
}
#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img3.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
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://127.0.0.1:9000;
}
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"';
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}
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://127.0.0.1:9000;
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://127.0.0.1:9000;
#标记条件 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;
}
}
... ...配置Nginx参数 请按实际情况更改下面的参数。
# 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;
}
#配置请求转发,将网页访问80端口转发到MinIO的9000端口
server{
listen 80;
server_name img4.diyhi.com;
location /{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:9000;
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://127.0.0.1:9000;
}
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"';
}
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_redirect off;
#MinIO
proxy_pass http://127.0.0.1:9000;
}
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://127.0.0.1:9000;
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://127.0.0.1:9000;
#标记条件 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、打开‘文件存储系统接口列表’--‘添加文件系统接口’,接口产品选择‘MinIO’
1、打开‘系统设置’--‘维护数据’,选择‘MinIO文件同步到本地’或‘本地文件同步到MinIO’