成功最有效的方法就是向有经验的人学习!

自建文件对象存储

为何要自建,花钱不好吗?
这也是历史遗留原因了,项目多,代码不规范,还有一些已外发,没有升级的可能。因此我们需要不区分URL中的大小写。

之前也了解了主流的对象存储,均不现实,但是可以使其回源到windows服务器,让不存在的文件自动拉到oss这也行,但是文件管理起来较乱了。

想来想去,自建一个,准备一个大空间的服务器,简单的说磁盘够大,网络够好即可。

另外还需要自已布署一个站点需要有上传文件的能力,别的项目通过HTTP接口进行操作。

我们都知道linux是严格区分大小写的,因此我们将原来的文件全部搬到linux并进行批量命名到小写(大写也行),本人喜欢小写。

批量修改文件名脚本实现:

function mvfiles(){
        for file in `ls $1`;
        do
                if [ `echo $1/$file | grep '[A-Z]'` ]; then
                newfilename=`echo $1/$file|sed 's/[A-Z]/\l&/g'`;
                mv $1/$file $newfilename;
                fi;
                file=`echo $file|sed 's/[A-Z]/\l&/g'`
                echo $file
                if [ -d $1/$file ]; then
                        mvfiles $1/$file;

                fi;

        done
}
mvfiles $1

以上脚本适用于文件名中没有空格的情况

我这个就比较麻烦,我这个文件名中可能有空格,可能的中文,可能有符号总之啥都有
因此,先用find输出所有路径
在输出的结果中查出带有双字节的文件名

awk  '/[^\x00-\xff]/' /tmp/fileall.txt >>rename.txt

此时已经找到所有目录路径和文件的路径中含有双字节的字符
这种我们都是要修改的,首先把目录名修改了。
由于我就一个目录所有手动改了,否则就需要用for循环递归修改,在语句中使用[ -d filename ]进行判断是否为目录

接下来生成需要修改的文件新旧路径对应,并生成文件名对应的随机字符。

awk 'BEGIN{srand();}{print $0"===="int(rand()*456568)int(rand()*456568)int(rand()*23445)int(rand()*78965)int(rand()*123545)}' rename.txt>>6.txt

此时文件中有原始路径和新的文件名随机字符串,接下来生成新旧路径对应文件并直接改名

sed -e 's#\(.*\)\/\(.*\)\.\(.*\)====\(.*\)#mv "\1\/\2\.\3"  \1\/\4\.\3#g' 6.txt|bash
sed -e 's#\(.*\)\/\(.*\)\.\(.*\)====\(.*\)#\1\/\2\.\3  \1\/\4\.\3#g' 6.txt>>/tmp/donefile.txt

此时文件名已全部修改完

解决nginx中区分大小写问题
我使用了ngx_http_lower_upper_case模块。

#将uri转换为小写
lower $uris $request_uri;
rewrite ^(.*)$ $uris last;

至此,对象存储的基本环境就运行起来了,此时需要开发一套上传文件的API接口,并保证文件写入时不能有大写字母。
其他应用中需要上传的地方调用该接口即可。
代码略。。。

升级nginx

./configure --user=www --group=www --prefix=/usr/local/nginx  --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_sub_module --add-module=../ngx_http_lower_upper_case

make  #只编译不安装

备份旧文件

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx12.old
#复制新的程序
cp objs/nginx /usr/local/nginx/sbin/

向旧的进程发送关闭信号,此时会生成pid.oldbin

kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

关闭旧进程

kill -QUIT `cat nginx.pid.oldbin`
赞(2) 打赏
未经允许不得转载:竹影清风阁 » 自建文件对象存储
分享到

大佬们的评论 抢沙发

全新“一站式”建站,高质量、高售后的一条龙服务

微信 抖音 支付宝 百度 头条 快手全平台打通信息流

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册