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

轻论坛系统默认使用本地存储,含有第三方文件存储功能的版本可以配置接入使用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

主机配置:V1

安装配置MinIO

1、创建并进入安装目录

输入命令 mkdir /usr/local/minio
输入命令 cd /usr/local/minio

2、下载对应当前系统版本的安装包

输入命令 wget https://dl.min.io/server/minio/release/linux-amd64/minio

3、创建minio启动用户并授权

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

4、minio文件赋予750权限

输入命令 chmod 750 /usr/local/minio/minio

5、创建存放数据目录

输入命令 mkdir /usr/local/minio/data

6、编辑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/minio

8、设置命令启动服务

输入命令 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 刷新


安装配置Nginx

1.下载并安装nginx

输入命令 yum install nginx

2.启动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
错误日志默认路径 /var/log/nginx/error.log

防火墙开放端口配置

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

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


移除策略

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

主机配置:V2

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

配置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;
					
						}
						
					}
				
				
...  ...
...  ...
...  ...

主机配置:V3

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

配置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;
					
						}
						
					}
				
				
...  ...
...  ...
...  ...

主机配置:V4

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

配置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’




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

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