首页 > 系统相关 >使用NGINX + MINIO + IMAGEPROXY 搭建私有图床

使用NGINX + MINIO + IMAGEPROXY 搭建私有图床

时间:2024-07-22 14:07:23浏览次数:18  
标签:minio nginx -- 代码 javascript NGINX 图床 复制 MINIO

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

图床的基础是Minio, 但minio并不提供图片缩略和裁剪功能,所以还需要用到Imageproxy和Nginx。

基于Docker安装更方便,但是不是很想用Docker,所以采用了编译安装。

编译安装nginx

安装第三方依赖:

代码语言:javascript 复制
yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel

创建nginx用户:

代码语言:javascript 复制
groupadd nginx
useradd nginx -g nginx -s /sbin/nologin -M

从官方下载nginx源码包并解压:

代码语言:javascript 复制
wget https://nginx.org/download/nginx-1.17.0.tar.gz
tar -zxvf nginx-1.17.0.tar.gz
cd nginx-1.17.0

配置nginx

代码语言:javascript 复制
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --modules-path=/usr/lib64/nginx/modules --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio --with-http_gzip_static_module

安装

代码语言:javascript 复制
make && make install

配置管理,这里是centos7:

代码语言:javascript 复制
vim /usr/lib/systemd/system/nginx.service

输入以下

代码语言:javascript 复制
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启用nginx服务并设置为开机启动:

代码语言:javascript 复制
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service

安装minio

直接下载minio的二进制包就可以直接使用:

代码语言:javascript 复制
cd /usr/local/bin
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio

为minio创建本地存储位置:

代码语言:javascript 复制
mkdir -p /storage

编辑minio服务器配置,其中9159是服务端口,MINIO_ACCESS_KEY是访问秘钥,MINIO_SECRET_KEY是加密秘钥:

代码语言:javascript 复制
cat <<EOT >> /etc/default/minio
\# miinio存储名
MINIO_REGION_NAME=xman
\# minio存储卷.
MINIO_VOLUMES=/storage
\# 自定义MinIo管理.
MINIO_OPTS="--address :9159"
\# 服务器Access Key.
MINIO_ACCESS_KEY=admin
\# 服务器Secret key.
MINIO_SECRET_KEY=123456789
EOT

创建minio管理:

代码语言:javascript 复制
cd /etc/systemd/system/
curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/distributed/minio.service

注意修改其中的用户及群组

启用minio服务并设置开机启动

代码语言:javascript 复制
systemctl daemon-reload
systemctl start minio.service
systemctl enable minio.service

安装imageproxy

安装go

imageproxy是go编写的一款图片缩放裁剪代理程序,所以要先安装golang环境:

下载go并解压

代码语言:javascript 复制
wget https://golang.google.cn/dl/go1.15.6.linux-amd64.tar.gz
tar -zxvf go1.15.6.linux-amd64.tar.gz

将go加入系统环境:

代码语言:javascript 复制
vim /etc/profile

在文件尾部输入:

代码语言:javascript 复制
#golang env config
export GO111MODULE=on
export GOROOT=/usr/local/go 
export GOPATH=/home/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

执行:

代码语言:javascript 复制
source /etc/profile

立即启用go

安装Aws cli

imageproxy需要 aws s3的支持,所以需要安装 aws cli

使用pip安装最新版本

代码语言:javascript 复制
yum -y install epel-release
yum -y install python-pip
pip install awscli

安装完成需要进行配置

代码语言:javascript 复制
aws configure

按照提示输入

代码语言:javascript 复制
AWS Access Key ID [None]: Q3AM3UQ867SPQQA43P2F  # 输入刚才设置的MINIO_ACCESS_KEY
AWS Secret Access Key [None]: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG # 输入刚才设置的MINIO_SECRET_KEY
Default region name [None]: us-east-1  #输入这个就可以
Default output format [None]: 回车默认就介意
aws configure set default.s3.signature_version s3v4

配置成功后,使用aws创建存储桶以验证配置是否正确,也未下一步做准备: 创建存储桶:

代码语言:javascript 复制
aws --endpoint-url http://127.0.0.1:9159 s3 mb s3:/imageproxy

安装imageproxy

直接通过go安装:

代码语言:javascript 复制
go get willnorris.com/go/imageproxy/cmd/imageproxy

安装完成后配置管理

代码语言:javascript 复制
vim /etc/systemd/system/imageproxy.service

输入以下内容:

代码语言:javascript 复制
[Unit]
Description=ImageProxy
Documentation=https://github.com/willnorris/imageproxy
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=root
Group=root

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_ACCESS_KEY}\" ]; then echo \"Variable MINIO_ACCESS_KEY not set in /etc/default/minio\"; exit 1; fi"
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_SECRET_KEY}\" ]; then echo \"Variable MINIO_SECRET_KEY not set in /etc/default/minio\"; exit 1; fi"

ExecStart=/home/gopath/imageproxy  -cache "s3://us-east-1/imageproxy/thumbnail?endpoint=127.0.0.1:9159&disableSSL=1&s3ForcePathStyle=1" -addr 0.0.0.0:8001

# 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

# Built for ${project.name}-${project.version} (${project.name})

启用imageproxy并设置开机启动:

代码语言:javascript 复制
systemctl daemon-reload
systemctl start imageproxy.service
systemctl enable imageproxy.service

配置nginx反代

imageproxy和minio都提供对外的web服务,但要将二者结合就最好使用nginx反代。

服务器配置如下

代码语言:javascript 复制
server {
    listen 80;

    server_name youdomian.com;

    location ~ /thumb/ {
        rewrite ^/(?i)thumb(.*) $1 break;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001;
    }

    location ~ /ImageView/ {
        rewrite ^(.*)/(?i)ImageView/(.*) /$2/http://127.0.0.1:9159$1 break;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8001;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:9159;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-1-15,如有侵权请联系 [email protected] 删除

标签:minio,nginx,--,代码,javascript,NGINX,图床,复制,MINIO
From: https://www.cnblogs.com/gaoyanbing/p/18315880

相关文章

  • 使用nginx proxy_pass从s3存储桶中读取sitemap.xml文件
    使用nginxproxy_pass从s3存储桶中读取sitemap.xml文件 nginx是一款高性能的开源Web服务器软件,也可以作为反向代理服务器使用。proxy_pass是nginx的一个指令,用于将客户端的请求转发到其他服务器上。在使用nginx的proxy_pass指令从S3存储桶中读取sitemap.xml文件时,可以按......
  • Nginx 中如何实现请求的排队机制?
    Nginx中如何实现请求的排队机制?在当今数字化的时代,网站和应用的流量就如同潮水一般,时涨时落,时急时缓。想象一下,当流量如洪水猛兽般汹涌而来,服务器就像是那抗洪的堤坝,如果没有有效的管理和调度,很容易就会被冲垮。而Nginx就像是一位聪明的水利工程师,能够通过其强大的功能,......
  • Nginx 中怎样实现请求的断路机制?
    ......
  • Nginx 如何处理请求的限速?
    ......
  • CentOS 7.6安装nginx
    1、安装EPEL仓库[root@ecs-lanxinmeichennginx]#sudoyuminstallepel-releaseLoadedplugins:fastestmirror,versionlockLoadingmirrorspeedsfromcachedhostfile *epel:mirrors.aliyun.com *remi:mirrors.tuna.tsinghua.edu.cn *remi-safe:mirrors.tuna.tsi......
  • docker安装nginx
    下载镜像dockerpullnginx 启动nginx容器dockerrun--restart=always--name=nginx-p80:80-dnginx启动后访问一下试试: 宿主机创建挂载目录我们就在home文件夹下创建bianen/nginx:mkdir-p/home/bianen/nginx复制配置文件到宿主机的挂载目录dockercp......
  • FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
    《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 FFmpeg向网络推流”介绍了轻量级流媒体服务器MediaMTX,虽然MediaMTX使用很简单,可是不能满足复杂的业务需求,故而实际应用中需要引入专业的流媒体服务器。nginx-rtmp是开源WEB服务器Nginx可增强的第三方rtmp模块,该模块封装......
  • nginx日志切割定时任务
    目录nginx进行日志切割的好处:实现步骤:1.给access.log日志文件重命名,并备份2.编写定时日志脚本     3.运行日志切割脚本4.将日志切割脚本加入crontab定时任务crontab定时任务配置讲解nginx进行日志切割的好处:便于管理和查询:随着时间的推移,Nginx日志文......
  • nginx 部署vue http、https
    nignx配置文件server{listen80;server_nameyour_domain.com;return301https://$server_name$request_uri;}server{listen443ssl;server_nameyour_domain.com;ssl_certificate/path/to/your/ssl/certificate;ssl_certificate_k......
  • Nginx系列-3 servername优先级和location优先级和常用正则表达式
    1.正则表达式和分组由于Nginx配置文件中经常出现正则表达式,因此本章节专门对常见的正则表达式进行简单介绍。[1]开始与结束^表示匹配输入字符串的开始$表示匹配输入字符串的结束[2]匹配次数?表示匹配0次或者1次+表示匹配1次或多次*表示匹配0从或多次{n}匹配n......