基于Git和Nginx构建自己的私有镜像床 告别镜像404

  备案注销     |      2023-09-03
基于Git和Nginx构建自己的私有镜像床 告别镜像404

图床?

有些人可能对图床不了解。所谓图床的英文名称应该是:ImageHost,是存储图片的中心。可以理解为:用户存储图片后,系统提供该图片的直接链接,用来通过网络访问显示该图片

使用图床可以更好的管理图片,方便图片打包和备份;与CDN合作,更好地优化网站加载。

(其实很多网站都提供图床服务,但毕竟数据不在你手里,如果网站跑路或者开启了防盗链,基本图片就会开始404 Not Found。)

使用场景?

Markdown和HTML都是很好的图床使用场景:Markdown和HTML插入图片,并使用标记显示图片:

# Markdown![图片描述](图片地址)# HTMLimg src='图片地址'/复制一下,图片地址可以使用图片的绝对路径或相对路径,例如:

/img/Mintimate_Logo.png:进入网站根目录的img文件夹,找到Mintimate_Logo.png图片进行显示。/Mintimate_logo.png:在父目录中找到Mintimate_Logo.png图像进行显示。然而,在某些网站上操作时,当没有明确的绝对路径和相对路径时,就需要使用网络地址图片了。这时,你可以使用图床提供的直接链接,如:评论回复

当然更多的是用于文字创作。比如我在写这篇文章的时候,使用的是腾讯云的镜像床:

实现思路?

图床的实现非常简单。归根结底,上次图片发送到服务器时,服务器提供了图片的链接地址。一般来说,它会使用:

OSS(对象存储):存储图片并提供公共图片地址。可选内容:

CDN(内容分发网络):加速镜像床域名的绑定,使OSS中镜像的加载更快、更安全。但考虑到成本和后期管理的方便性,我们采用:

云服务器:存储图像的服务器。与OSS存储相比,服务器存储可以存储文件地址结构(如:IMG/banner/Logo.png)。 CDN(内容分发网络):(可选内容)加速图床域名的绑定,同时防止Lighthouse真实地址暴露,避免受到DDOS攻击。因此,我们构建的图床流程就围绕着这个大主题:

云服务器上的具体实现:

部署Git:在服务器上部署Git,用于快速上传本地图片到服务器;同时避免操作失误时,可以回滚操作,图片数据丢失。部署Nginx:在服务器用于使服务器变为Web网站,提供图片的直链上部署Nginx。

辅助视频

嘿嘿,我特意为你制作了一个教程视频:

10分钟学会基于Git和Nginx搭建自己的私有镜像床,告别镜像404!https://www.bilibili.com/video/BV1Pd4y1k7jU

准备工作?

云服务器/VPS

首先,我们需要一台服务器,

如果您没有服务器设备并需要购买/租用,强烈建议学生用户:

腾讯云轻量级应用服务器学生优惠另外,我们还会为大家赢取优惠*(ˊˋ),独家优惠~~(可能比学生优惠还优惠哦)

一个月免费试用服务器专用链接:https://curl.mintimate.cn/1tQT69ipuTK 腾讯云秒杀链接(可以低价购买轻量级应用服务器):https://curl.mintimate.cn/1tQTFul7G7N 香港、新加坡等地区,您可以另外购买Lighthouse香港、新加坡的服务器性价比高,适合国际服务器搭建的需求。

腾讯云轻量级应用服务器推荐使用Linux系统服务器。这次我使用Linux的Debian发行版来演示:

本教程中,为了照顾小白;同时演示常规法和宝塔法;小白或者正在使用宝塔的用户可以使用宝塔方法。

宝塔官网:https://www.bt.cn

内容分发网络/CDN(可选)

CDN,需要备案域名。如果您还没有域名或者域名尚未备案,您可以参考:

域名注册域名备案域名备案很简单,大概7-14天可以备案完成。详情请参考备案文档

后期需要内容分发:腾讯云内容分发网络

SSH连接服务器

本章内容,所有操作均在本地电脑上进行,特此提醒

首先我们需要SSH连接服务器,本地和远程SSH连接服务器,这些在之前的很多文章和视频中已经介绍过,这里不再赘述。

如果您不知道如何操作,可以参考图文教程:

有关如何使用SSH 远程登录自己的Linux 服务器的详细视频教程:

10分钟教你如何使用密钥/账户通过SSH远程登录Linux服务器(Windows/macOS)。连接成功的效果:

宝塔面板(可选)

本章内容,所有操作均在Linux服务器(例如本地远程SSH后的窗口)中进行,而非本地Windows或macOS,特此提醒

宝塔面板的使用非常简单。首先我们进入宝塔官网注册一个账号:

https://www.bt.cn后,SSH连接服务器:

将安装命令复制到Linux控制台:

面板安装完成后,该端口在载体上被允许:

您可以在浏览器上访问它:

对于首页推荐,建议点击不再推荐:

更多宝塔操作可以参考视频:Linux宝塔面板详解,助力零基础使用Linux服务器

搭建Nginx

本章内容,所有操作均在Linux服务器(例如本地远程SSH后的窗口)中进行,而非本地Windows或macOS,特此提醒

常规方法(推荐非小白)

不要使用宝塔面板,建议创建专门的网站用户来管理我们的网站资源:

# 创建www用户sudo useradd www# 创建www用户组sudo groupadd www# www用户属于www用户组sudo usermod -a -G www www copy

之后,我们安装编译依赖(如果你使用的是Debian发行版本的Linux,可以使用以下命令通过包管理器安装;对于CentOS,需要自己替换依赖名称并使用yum安装) :

apt install build-essential pkg-config libxml2-dev libpcre2-dev openssl libssl-dev libsqlite3-dev zlib1g-dev libcurl4-openssl-dev libpng-dev libjpeg-dev libonig-dev libzip-dev -y 复制为了稳定性,我们使用wget下载并解压稳定版Nginx源码,并使用cd命令进入其目录:

这里我们配置:

./configure \--prefix=/usr/local/nginx \--user=www \--group=www \--sbin-path=/usr/local/nginx/sbin/nginx \--conf-path=/usr/local/nginx/nginx.conf \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \- -pid-path=/var/run/nginx.pid \--lock-path=/var/run/nginx.lock \--http-client-body-temp-path=/var/cache/nginx/client_temp\ --http-proxy-temp-path=/var/cache/nginx/proxy_temp \--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \--http-uwsgi-temp-path=/var /cache/nginx/uwsgi_temp \--http-scgi-temp-path=/var/cache/nginx/scgi_temp \--with-file-aio \--with-threads \--with-http_addition_module \--with- http_auth_request_module \--with-http_dav_module \--with-http_flv_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_mp4_module \--with-http_random_index_module \--with-http_realip_module \--with-http_sec ure_link_module \ --with-http_slice_module \--with-http_ssl_module \--with-http_stub_status_module \--with-http_sub_module \--with-http_v2_module \--with-mail \--with-mail_ssl_module \--with-stream \- - with-stream_realip_module \--with-stream_ssl_module \--with-stream_ssl_preread_module 复制配置完成,也没有显示错误,所以我们编译:

因为我的服务器是4核,所以使用-j4参数进行多线程编译。

最后我们就可以安装它了:

因为我编译安装的时候选择了Nginx的缓存地址为/var/cache/nginx,但是这个地址在Linux上不存在,需要我们手动创建:

sudo mkdir /var/cache/nginx copy 最后,创建守护进程:

sudo vim /usr/lib/systemd/system/nginx.service 复制附加内容:

[Unit]Description=nginxAfter=network.target [Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin /nginx -s quitPrivateTmp=true [Install]WantedBy=multi-user.target 复制重载systemctl进程:

sudo systemctl daemon-reload 复制到这里,我们就可以启动Nginx进程并将其设置为开机自动启动:

# 设置开机自启动sudo systemctl enable nginx# 启动Nginx进程sudo systemctl start nginx copy

宝塔方法(推荐小白)

如果上面我们安装了宝塔面板,那么这里我们需要使用宝塔面板来安装Ngin。

注意:只能选择常规方法宝塔方法之一。

进入宝塔面板,去软件商店下载:

安装后:

这样Nginx就已经安装好了。

设置图床网站?

本章内容,所有操作均在Linux服务器中进行(例如本地远程SSH后的窗口、本地登录宝塔页面),而非本地Windows或macOS,特此提醒

我们刚刚编译安装了Nginx,接下来我们要配置Nginx,然后设置一个网站目录,以便我们以后可以将本地图片上传到里面作为图床。

上面根据你的选择,也分为常规方法宝塔方法,两种方式你可以选择其一。

常规方法(推荐非小白)

我们进入我们的Nginx安装目录并备份我们的nginx.conf:

# 进入Nginx安装后的目录cd /usr/local/nginx/# 将nginx.conf重命名为nginx.conf.bakmv nginx.conf 复制nginx.conf.bak后,创建自己的Web配置文件(nginx.conf)。配置方式有很多种,这里举个例子,简单说一下:

#当前在Nginx安装后的目录vim nginx.conf中,复制附加内容:

用户www;worker_processes 1;事件{worker_connections 1024;}http {包括mime.types; gzip 打开;服务器{听80;服务器名称本地主机;根/www/wwwroot/test.flyinbug.cn;位置/{ 索引index.php 索引.html 索引.htm; } error_page 500 502 503 504 /50x.html;位置=/50x.html { 根html;复制其中:

设置好网站根目录:/www/wwwroot/test.flyinbug.cn后,我们保留并退出。现在让我们创建/www/wwwroot/test.flyinbug.cn 目录并属于www 用户:

# 创建网站根目录mkdir /www/wwwroot/test.flyinbug.cn -p# www目录属于www用户chown -R www:www /www 复制现在先放上。首先配置Git。

宝塔方法(推荐小白)

我们需要通过Nginx建立一个网站来显示我们的图片,因为我们刚刚通过宝塔安装了Nginx,所以这里再建立一个网站:

我们这里设置的图床的网址是:/www/wwwroot/test.flyinbug.cn:

现在,让我们把它放在一边。首先配置Git。

配置Git

因为我们使用本地文件同步到服务器的Git仓库来上传图片,所以在本地安装Git的情况下,Linux服务器也需要安装Git

本地安装Git

这里配置本地Git有两种方式:

配置Git命令行工具包:下载Git命令行工具包并将其配置为环境变量。配置GitHub Desktop:下载GitHub Desktop工具包进行可视化操作。实际开发中,就看个人喜好了。我使用这两种方法。不过考虑到本文仅使用Git作为服务器间文件工具,这里对配置GitHub Desktop的方法,更易于小白操作。进行解释

我们先安装一下GitHub Desktop,方便我们后续可视化选择图片上传:

GitHub Desktop下载地址:https://desktop.github.com 下载完成后,打开的界面是这样的:

这样本地Git就安装完成了。我们先讨论其他操作,稍后再回到这个工具。

服务器安装Git

回到我们的Linux服务器,我们要安装Git,在SSH中输入:

# Ubuntu/Debiansudo apt install git# Centossudo yum install git copy 因为,我是Debian发行版Linux。因此使用sudo apt install git 来安装Git:

我之前安装过,所以详细日志不多,小伙伴们第一次安装Git,输出的日志应该会比我多

创建Git用户

首先我们看看我们是否提前创建了Git用户,输入命令:

cat /etc/passwd|grep -v nologin|grep -vhalt|grep -v shutdown|awk -F':' '{ print $1'|'$3'|'$4 }'|more 复制我们创建一个git 用户:

sudo adduser git copy 按照提示设置密码和信息即可完成创建:

之后我们可以在/home目录下看到新添加的git用户:

最后,我们将网站根目录的所有权交给git用户。使用git工具推送图片后,有权限重定向到网站目录进行读写:

chown -R git:git /www/wwwroot/test.flyinbug.cn 复制宝塔面板可能存在权限问题,可以忽略:

至此,Git的配置已经完成。有兴趣的伙伴还可以:

设置git用户不允许Shell登录:为了安全,不允许git进行远程登录或者shell操作设置authorized_keys:方便我们避免秘密的git操作(SSL验证):

创建图床仓库

本章内容,所有操作均在Linux服务器(如本地远程SSH后的窗口)中进行,而非本地Windows或macOS,特此提醒

切换用户

为了避免权限问题,我们切换到刚刚创建的git用户:

# 切换到git用户sudo su git copy:

创建仓库

进入git用户主目录(/home/git),创建mySource文件夹,用于存放git仓库:

# 将环境切换到/home/git 中cd ~# 创建mySource 文件夹mkdir mySource 复制后进入mySource 文件夹,初始化一个名为imagehost.git 的git 仓库:

cd mySource# 初始化名为imagehost.git 的仓库git init --bare -b main imagehost.git 复制后会多出一个名为imagehost.git的项目文件夹的仓库,输入项目文件夹查看初始化内容:

这时候我们的镜像床仓库就已经创建完成了。接下来,我们设置工作区以将上传的图像重定向到我们的Web 目录。

设置hooks

我们来设置一下hooks,用于每次将本地仓库推送到云端(Linux服务器)时,自动将最新版本的图床覆盖到Nginx网站上。我们刚刚用Nginx创建的镜像床网站地址:/www/wwwroot/imagehost.flyinbug.cn,所以:

# (当前在项目文件夹中)进入hooks文件夹cd hooks# 创建并编辑hook vim post-receive copy并添加内容:

#!/bin/shgit --work-tree=/www/wwwroot/test.flyinbug.cn --git-dir=/home/git/mySource/imagehost.git checkout -f 复制它:

--work-tree:填写Nginx网站地址。 --git-dir:图床仓库地址。解压后,分配执行权

chmod +x post-receive复制到这里,服务器上的内容结束。

本地同步仓库

本章内容,所有操作均在本地电脑上进行,特此提醒

刚才我们已经创建好了镜像床仓库,本地需要安装Git。我这里就不详细说了。安装后,选择以下方法之一:

在powershell或终端同步仓库到本地。中使用GitHub Desktop可视化并同步仓库到本地。本文演示了Github Desktop上的操作:

打开我们的GitHub Desktop 并选择克隆一个新存储库:

之后填写我们服务器的仓库地址,例如:

git@server-IP:/home/git/mySource/imagehost.git 复制它:

server-IP:替换为你服务器的IP或者已经解析到服务器的域名/home/git/mySource/imagehost.git:我们刚刚创建的仓库,在绝对地址上输入我们为git用户设置的密码服务器上的路径:

之后本地就出现这个仓库:

接下来我们看看如何使用它。

使用图床?

本章内容,所有操作均在本地电脑上进行,特此提醒

之后我们将图片添加到本地仓库:

之后我们就可以在GitHub Desktop中进行操作了:

最后我们就可以在服务器网站根目录下看到我们的图片了:

如果使用宝塔面板,可以在宝塔上查看:

如果你的域名直接解析到服务器IP,则可以直接使用域名查看图片:

然而,这存在一些风险:

容易暴露服务器IP加载慢,需要使用CDN加速。

启动CDN加速?

本章内容,所有操作均在本地电脑上进行,特此提醒

我们进入CDN控制台,选择域名管理-添加域名:

之后,填写信息:

即可开启CDN,在CDN控制台可以看到效果:

查看域名对应的IP,可以看到是CDN节点服务器的IP,而不是我们轻量级应用服务器的IP:

笔记:

CDN可能会有延迟,全局缓存刷新最多需要72小时。注意配置图片防盗链,防止流量被恶意脚本消耗。适合个人或小团队。同时使用Git方便备份和回滚。

但一定要注意

点击关注作者并阅读全文