这是我所编写的插件(包含Wordpress插件、PHPWind8.7插件、Discuz插件)在搜集用户反馈的使用中遇到的各种问题后,所做的一些排查的分享。希望能对大家有用,也希望大家在使用本人或者其它作者编写的插件时遇到问题后,先按帖子所描述的一些常见 问题排查原因,为自己、为开发者节省时间。
通常,OSS插件实现上传的功能需要这几个过程:
上载,
获取object URL(将URL直接写库)或者path(将路径写库,每次访问时拼凑生成一次URL)。
而上传功能,问题也可能发生最多。通常表现为:文件上传不了,OSS的BUCKET中无文件。
遇到这个问题,首先在SSH上排查下OSS的接口域名是否能PING通:
SSH执行
#老接口
ping storage.aliyun.com
#新接口
ping oss.aliyuncs.com
#内网 老接口
ping storage-vm.aliyun-inc.com
#内网 新接口
ping oss-internal.aliyuncs.com
若返回 name resolve faild之类,则是DNS解析不了。 解决办法:vi /etc/hosts将IP与OSS域名映射下即可。
若timeout,则通常是你的服务器与OSS接口服务器连接不通。这个通常是防火墙或者线路抽风导致的,如果有防火墙权限把OSS的接口地址、IP解封即可。如果没有权限 或者并非防火墙原因,就只能换服务器、线路了。
如果完全可以PING通,并且响应时间在200ms内,那么恭喜,你可以进入下一步了:
在SSH上执行:
#老接口
curl http://storage.aliyun.com
#新接口
curl http://oss.aliyuncs.com
#内网 老接口
curl http://storage-vm.aliyun-inc.com
#内网 新接口
curl http://oss-internal.aliyuncs.com
如果返回类似于:
<?xml version="1.0" encoding="UTF-8"?>
这样的数据,那么理论上与OSS的访问是无阻的了。如果能PING通,但获取不了数据,那可以试试OSS接口的8080端口:
<Error>
<Code>AccessDenied</Code>
<Message>Anonymous access is forbidden for this operation.</Message>
<RequestId>506ED3064AA1C34B2960F6E4</RequestId>
<HostId>storage.aliyun.com</HostId>
</Error>
#老接口
curl http://storage.aliyun.com:8080
#新接口
curl http://oss.aliyuncs.com:8080
#内网 老接口
curl http://storage-vm.aliyun-inc.com:8080
#内网 新接口
curl http://oss-internal.aliyuncs.com:8080
如果80不能使用,而8080可以使用,就可以将接口地址替换为8080端口的(造成80不通通常原因是防火墙导致)。
如果OSS能正常访问,并且提供的KEY/SECRET/BUCKET/OBJECT合法,但请求失败(会返回数据),得考虑下以下情况 :
1.WEB服务器与OSS服务器时差过大。
使用PHP代码检测:
<?php
OSS官方文档有介绍:使用OSS签名的时间与OSS服务器时间(标准北京时间)误差不得大于正负15分钟。否则将返回“SignatureExpired”。若检测到WEB服务器时间与北京时间误差超过15分钟,务必修正时间误差。
date_default_timezone_set('Asia/Shanghai');//设置时区为中国时间
$time=date("H:i:s"); //用data()取得时间
echo $time;
?>
同时开发者需要注意,尽量获取北京时间来计算signature,避免因签名冲突导致请求失败。
2.上传的文件过大,超出max_execute_time
通过OSS插件上传文件,通常需要经过两次上传:1是上传到WEB服务器,2是中转到OSS
如果上传的文件过大,可能导致在上传到WEB服务器时,超出PHP的 max_upload_size 而导致上传失败。 此时需要编辑PHP.INI对应参数以避免此问题出现。
如若upload_max_filesize和post_max_size其一小于上传的文件体积,均可造成上传失败。
如果上传文件上传到了WEB服务器,但中转到OSS时失败,通常是因为文件比较大,导致上传时间相比小文件要消耗更久,触发了PHP.ini的max_execute_time参数,导致程序中止。可以通过下面代码来设置超时时间。
@ini_set('max_execution_time', 0);
3.OSS账户欠费
在OSS账户欠费时,将导致所有BUCKET不再可用,并且所有请求将返回UserDisabled的错误。
解决办法:充值,恢复服务。
*在OSS被禁用后,长时间不充值恢复服务,数据将会被抹去。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。