前一段时间有一个问题让我担忧,就是Linux服务器磁盘快满了,然后开始删文件啊,精简网站啊,然而服务器没过几天磁盘又爆红了,

...

于是打开我的浏览器,搜索,经过苦苦搜寻,终于找到了一个叫ossfs的东西,

https://help.aliyun.com/document_detail/153892.html

它或许能帮到我,正好我买了同地域的OSS,如果用它来辅助网站的存储,那就可以免得苦逼地去买扩展数据盘了。之前我用过宝塔的

七牛云存储对象多点挂载工具兼容阿里云、京东云

工具,但是这个bug太多了,然后我又不小心因为我的操作失误把我的OSS的重要文件给删了,于是我一气之下就删除了它。

于是在同我朋友的推荐下一起使用了ossfs,然而实际操作并不是那么轻松。

首先得拷贝一份安装包(全文以我的Ubuntu 18.04 (x64)为例,我使用了curl (可能需要另外安装curl),请忽略开头的语言类型错误)

#!/bin/bash
curl -O https://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_ubuntu18.04_amd64.deb?spm=a2c4g.11186623.2.6.7f852315Omm03Q&file=ossfs_1.80.6_ubuntu18.04_amd64.deb

然后安装

#!/bin/bash
sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi ossfs_1.80.6_ubuntu16.04_amd64.deb

配置账号访问信息,注意权限只能是640或600,你也可以使用vi等工具编辑配置文件

#!/bin/bash
echo BucketName:yourAccessKeyId:yourAccessKeySecret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs

/etc/passwd-ossfs文件结构:(用:分隔)

BucketName:yourAccessKeyId:yourAccessKeySecret

更多可以查看阿里云的教程:https://help.aliyun.com/document_detail/153893.html

挂载目录

#!/bin/bash
chmod 640 /etc/passwd-ossfs

#设置权限(仅一次)
mkdir /mnt/ossfs

#创建空白目录(仅一次)
ossfs BucketName mountfolder -ourl=Endpoint
#填写信息

完整示例看上面的教程

注意 如果您使用从阿里云购买的云服务器(ECS)来提供ossfs服务,您可以使用内网域名,这样可以节省流量费用。OSS的内网域名请参见阿里云的访问域名和数据中心

取消挂载(如果要)

#!/bin/bash
fusermount -u /mnt/ossfs

然后没有失误就可以了,之后你会发现挂载后的文件夹权限是700,这样用户组和公共用户都不能访问这个文件夹,并且直接强行更改权限是无效的,然后需要更改权限(完整示例看上面的教程,完整复制粘贴别的地方的东西过来没意思)

允许所有用户访问,即权限为777

#!/bin/bash
ossfs bucket_name mount_point -ourl=endpoint -oallow_other

用户组权限为770

#!/bin/bash
ossfs bucket_name mount_point -ourl=endpoint -oallow_other -omp_umask=007

这样就好了。

如果需要开机自动挂载,你可以借助Supervisor等工具实现。

如果你的服务器的网站设置了防跨站攻击(open_basedir),你还需要链接这个目录

可以使用ln命令创建软链接实现,-s参数代表创建软链接,ln命令默认创建硬链接,需要提前在要链接到的目录创建空文件夹

#!/bin/bash
ln -s 原目录 链接到的目录

例:

#!/bin/bash
ln -s /mnt/xiwangly2 /www/wwwroot/xiwangly.top

如果没有出错,现在可以通过/www/wwwroot/xiwangly.top/xiwangly2访问/mnt/xiwangly2的文件(夹)了

取消链接直接删除这个链接到的目录即可

然后你随着各种应用的需要你可能又会出现新的问题了,

比如我用软链接创建的目录里的内容在FTP中无法读取,

这时候就要考虑mount命令了,mount与ln命令的区别请看mount和ln的区别和使用 - 懵懵懂懂的小白 - 博客园

示例:

#!/bin/bash
mount --bind /mnt/xiwangly2/ /www/wwwroot/xiwangly.top/xiwangly

bind参数从Linux内核2.4.0中开始支持,用于类似软链接的功能

取消挂载

#!/bin/bash
umount -l /www/wwwroot/xiwangly.top/xiwangly

l参数用于强制取消挂载。

使用mount而不是ln的好处,

ln链接的OSS文件夹里的文件仅支持静态的MIME,意味着动态的脚本保存在OSS中通过网站链接访问只能下载它或出于服务器安全设定的403,而不能解析并执行它,而mount则是挂载一个目录,这就有点像Windows中的磁盘装入NTFS文件夹中的操作了,这样就可以使得OSS里的文件可以通过网站链接并解析处理(如PHP文件),并且你还可以套上宝塔等工具建的网站实现默认文件。

缺点是mount的挂载在服务器重启后需要重新挂载,而ln相当于一个永久的快捷方式则服务器重启后链接还在。mount还需要额外的空文件夹。宝塔备份的时候mount挂载的内容也会算进去,需要加排除规则,而ln的链接会备份这个像"快捷方式"的东西,因而可以减小存储容量开销。

我偷懒借助宝塔的定时任务写了个检测ossfs运行状态的shell,其实就是判断这个目录的start.txt文件是否存在,这个还相当简陋...

#!/bin/bash
if [ -f "/mnt/bucket_name/start.txt" ];then
  echo "ossfs已在运行中"
else
  echo "ossfs正在启动"
  #的仅需执行一次
  #fusermount -u /mnt/bucket_name
  #umount -l /www/wwwroot/xiwangly.top/bucket_name
  #chmod 640 /etc/passwd-ossfs
  ossfs bucket_name/mnt/bucket_name-ourl=bucket_name -ourl=endpoint_url
  #ln -s /mnt/bucket_name/www/wwwroot/xiwangly.top
  mount --bind /mnt/bucket_name/ /www/wwwroot/xiwangly.top/bucket_name
fi

另外,内网访问OSS(需要与服务器同地域,通常URL中带有internal字眼)并加上OSS资源包可以省下一大笔费用,强烈不建议使用开放公网地址的OSS挂载到自己的站点,不要暴露你的OSS信息!


本当の声を響かせてよ