为何要自建,花钱不好吗?
这也是历史遗留原因了,项目多,代码不规范,还有一些已外发,没有升级的可能。因此我们需要不区分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`