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也可以

1678880007752

用户名密码在创建节点的时候指定了

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');
    }
posted @   摇摆啊~  阅读(290)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示