问题
线下主机只能使用内网,并且无法只能使用NFS和FTP共享资源,因为这台主机要共享的目录也是挂载的其他主机的nfs服务,也就是说需要这台主机共享自己挂载的NFS目录,这样做好像是不可以的,因为使用exportfs -arv命令时一时提示此目录不支持NFS。所以就部署了FTP服务,阿里云主机通过专线访问FTP服务,并使用工具挂载FTP服务。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 歌华分享vsftpd服务,阿里挂载 线下 yum install vsftpd useradd xorupload echo 'HELPbjcloud20190729!'|passwd --stdin xorupload vim /etc/vsftpd/vsftpd.conf 关闭匿名访问 关闭使用本地用户 local_root=/vod # 只需要改变这个默认的目录即可。这和用户的家目录没有关系,但还要用本地用户登录 systemctl start vsftpd systemctl enable vsftpd
阿里 yum install curlftpfs curlftpfs -o codepage=utf8 ftp://xorupload:'HELPbjcloud20190729!'@172.16.201.44 /media # 挂载 fusermount -u /media # 卸载
|
这样做是可以实现功能的,但速度非常慢,阿里主机起的作用就是将线下的资源上传到阿里的OSS服务上,从本地上传或从本地使用lftp连接FTP服务下载的速度都没有问题,但要实现直接从FTP挂载点上传到阿里OSS上时,速度就马上降了下来。之后还考虑使用sshfs命令挂载文件系统,但线下不开放SSH服务给非内网主机,所以无法实现。最后想到使用阿里主机做代理,线下主机直接使用阿里的ossutil工具,通过代理上传资源到阿里OSS上,最后成功实现,方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| ------------ 阿里ECS ------------ vim /etc/nginx/conf.d/ossreverse-internal.conf server { listen 80; server_name oss-cn-beijing-internal.aliyuncs.com; access_log /var/log/nginx/endpoint.log; location / { proxy_pass http://oss-cn-beijing-internal.aliyuncs.com; } } server { listen 80; server_name bjy-edu.oss-cn-beijing-internal.aliyuncs.com; access_log /var/log/nginx/endpoint.log; location / { proxy_pass http://bjy-edu.oss-cn-beijing-internal.aliyuncs.com; } } # 这里设置的nginx主机域名和实际的OSS的endpoint和域名是一样的
------------ 线下主机 ------------ 下载ossutil64工具 chmod +x ossutil64 cp ossutil64 /sbin ossutil64 config # 初始化,一直回车 vim .ossutilconfig [Credentials] language=EN endpoint=http://oss-cn-beijing-internal.aliyuncs.com accessKeyID=LTAI4FnMoMFemG6j3KFbj accessKeySecret=AC8W0CB3AQ181oW9AF9aYzfXA # 配置ossutile工具,注意,endpoint要使用内网,这样才能保证网速。另外要配置对bucket有权限控制的accesskey vim /etc/hosts 172.16.211.110 oss-cn-beijing-internal.aliyuncs.com bjy-edu.oss-cn-beijing-internal.aliyuncs.com # 把两个域名都解析到代理服务器上 ossutil64 ls # 测试是否可以使用了 下面创建一个目录,这个目录保存了导出的节目清单,我们要从清单中取得节目的路径并上传到OSS上。这里设置保存 的目录为/xor/data2/bjos vim /root/aliupload/filecheck.sh #!/bin/bash # ls /xor/data2/bjos/target*.txt if [ $? -eq 0 ];then for i in `ls /xor/data2/bjos/target*`;do if [ -f $i ] ;then awk -F '?' '{print $1}' $i | awk -F '/' '{print "/"$4"/"$5"/"$6"/"$7"/"$8}' >> /xor/data2/bjos/current_upload/upload_`basename $i|awk -F . '{print $1}'`_`date +%Y%m%d`.txt fi mv $i /xor/data2/bjos/old_upload # 在这里处理过target文件后,就直接移走。这比在最后一起移走的逻辑要严谨。因为可能在脚本执行中, # 会有新的target文件生成,但并没有在这处理,但最后会被脚本一起移走,这样就会出现没处理过的target文件。 done if [ $? -eq 0 ];then for j in `ls /xor/data2/bjos/current_upload/*`;do if [ `grep -c '.m3u8' $j` -gt 0 ];then # grep的-c选项只统计匹配到的行数,这里如果大于0说明找到了内容 cp $j ${j}_ts sed -i -e '[email protected]@@g' -e 's@_@/@g' ${j}_ts # 匹配替换多个值 fi done for w in `ls /xor/data2/bjos/current_upload/*`;do while read line;do /root/aliupload/ossutil64 cp -rfu -j 5 --loglevel info $line oss://bjy-edu$line # 直接使用ossutil64会有找不到命令的报错,但使用上并没有问题。也许是环境变量的问题,所以使用了绝对路径 done < $w done fi # for l in `ls /xor/data2/bjos/*`;do # if [ -f $l ];then # mv $l /xor/data2/bjos/old_upload # fi # done for m in `ls /xor/data2/bjos/current_upload/*`;do mv $m /xor/data2/bjos/old_upload done #kill -9 `lsof /xor/data2/bjos|awk '{print $2}'|tail -1` # 开始以为是有别的程序在操作/xor/data2/bjos这个目录,所以最后使用lsof查看哪个程序在使用这个目录,并 # 把它杀死。之后发现是定时任务有问题。 exit 0 else exit 1 fi
crontab -e 1 */2 * * * /bin/bash /root/aliupload/filecheck.sh >> /root/aliupload/upload.log 2&>1 # 测试发现,在设置执行时间时如果不指定第一个值,似乎会每两小时的每分钟执行一次,所以/xor/data2/bjos目录中的文件一直有问题,放在这个目录下的.txt文件总会被移动到old_upload目录中。错误方法如下: # * */2 * * * /bin/bash /root/aliupload/filecheck.sh >> /root/aliupload/upload.log 2&>1
|