Laravel+Minio分布式文件系统
搭建Minio
注意:192.168.118.35是我的虚拟机ip,使用的时候记得改成自己的
拉取minio镜像
docker pull minio/minio
系统环境基本配置
cat >> /etc/sysctl.conf <<-'EOF'
net.ipv4.ip_forward=1
vm.max_map_count=655360
EOF
# 配置完成后要重新加载
sysctl -p
构建出macvlan的网络模式
docker network create -d macvlan \
--subnet=192.168.118.0/24 \
--ip-range=192.168.118.0/24 \
--gateway=192.168.118.1 \
-o parent=ens33 \
macvlan31
创建容器
第一个节点
docker run -d --name minio-240 \
--restart=always \
--network macvlan31 --ip=192.168.118.240 \
-v /data/n240/export1:/export1 \
-v /data/n240/export2:/export2 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=a1b2c3d4" \
minio/minio server http://192.168.118.24{0...2}/export{1...2}
第二个节点
docker run -d --name minio-241 \
--restart=always \
--network macvlan31 --ip=192.168.118.241 \
-v /data/n241/export1:/export1 \
-v /data/n241/export2:/export2 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=a1b2c3d4" \
minio/minio server http://192.168.118.24{0...2}/export{1...2}
第三个节点
docker run -d --name minio-242 \
--restart=always \
--network macvlan31 --ip=192.168.118.242 \
-v /data/n242/export1:/export1 \
-v /data/n242/export2:/export2 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=a1b2c3d4" \
minio/minio server http://192.168.118.24{0...2}/export{1...2}
启动Minio
# 使用docker logs minio-240 查看面板 ip:端口
[root@localhost ~]# docker logs minio-240
Waiting for all MinIO sub-systems to be initialized.. lock acquired
Verifying if 1 bucket is consistent across drives...
Automatically configured API requests per node based on available memory on the system: 5
All MinIO sub-systems initialized successfully
Waiting for all MinIO IAM sub-system to be initialized.. lock acquired
Status: 6 Online, 0 Offline.
API: http://192.168.118.240:9000 http://127.0.0.1:9000
Console: http://192.168.118.240:46091 http://127.0.0.1:46091
Documentation: https://docs.min.io
WARNING: Console endpoint is listening on a dynamic port (46091), please use --console-address ":PORT" to choose a static port.
# http://192.168.118.240:9000在浏览器打开就可以看到面板了
# http://192.168.118.240:46091也可以
用户名密码在创建节点的时候指定了
Laravel上传文件到minio
安装aws-sdk-php-laravel三方库
composer.json 添加
{
"require": {
"aws/aws-sdk-php-laravel": "~3.0"
}
}
php composer.phar update
或者
composer update
配置config/app.php 和 AWS Facade
'providers' => array(
// ...
Aws\Laravel\AwsServiceProvider::class,
)
'aliases' => array(
// ...
'AWS' => Aws\Laravel\AwsFacade::class,
)
生成configuration文件
php artisan vendor:publish --provider="Aws\Laravel\AwsServiceProvider"
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 就是minio web客户端登录时使用的 Access Key和Secret Key
config/aws.php的配置
'credentials' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
],
'region' => env('AWS_DEFAULT_REGION'),
'version' => 'latest',
'endpoint'=>env('AWS_URL'),
'ua_append' => [
'L5MOD/' . AwsServiceProvider::VERSION,
],
config/filesystems.php
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'endpoint' => env('AWS_URL'),
'use_path_style_endpoint' => true,
]
.env
AWS_ACCESS_KEY_ID=登录的用户名(Access Key)
AWS_SECRET_ACCESS_KEY=登录的密码(Secret Key)
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=桶
AWS_URL=minio的地址
例如:
AWS_ACCESS_KEY_ID=12345678
AWS_SECRET_ACCESS_KEY=12345678
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=test
AWS_URL=http://192.168.118.240:9000
注意事项
文件上传有个错误是时区问题,我的minio跑在虚拟机centos7的docker上,laravel在本机上,所以需要将centos7的时区修改到上海时区:
查看centos7所在时区时间:timedatectl status
修改为中国上海时区:timedatectl set-timezone "Asia/Shanghai"
但是修改后还有问题时间不同步:
yum -y install ntp
ntpdate time.nist.gov
可以设置定时任务来定期同步时间
crontab -e # 进入crontab编辑状态,追加如下定时任务文本
*/10 * * * * ntpdate time.nist.gov #域名或IP
laravel:
打开laravel框架目录下app/config/app.php文件
'timezone' => 'UTC'
将其改成
'timezone' => 'Asia/Shanghai',
使用Laravel操作minio:
aws-sdk-php-laravel中有官方demo,下面是我自己编写的
视图:
<form action="/fileUp" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">上传</button>
<button type="reset" >取消</button>
</form>
控制器:
//上传文件
public function fileUp(Request $request){
//判断是否上传了文件,没有上传文件就返回null,有文件就继续执行
$bool = $request->hasFile('file');
if (!$bool){
return null;
}
//获取文件
$file = $request->file('file');
//获取文件后缀
$ext = $file->getClientOriginalExtension();
//生成一个根据当前时间的文件名
$fileName = time().'-'.uniqid().'.'.$ext;
//执行文件上传
//$s3 = App::make('aws')->createClient('s3');
$s3 = AwsFacade::createClient('s3');
$s3_ret = $s3->putObject(array(
'Bucket' => 'test',
'Key' => $fileName,
'SourceFile' => $file,
));
//对文件上传是否成功进行判断
if ($s3_ret['@metadata']['statusCode'] == 200) {
return "文件上传成功!";
} else {
return "图片上传失败!";
}
}
//删除文件
public function fileDelete($name){
$s3 = AwsFacade::createClient('s3');
$s3->deleteObject([
'Bucket' => 'test', //存储桶名称
'Key' => "$name", //文件名需要携带文件后缀
]);
}
//视图
public function index(){
return view('index');
}
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现