
暂无个人介绍
能力说明:
掌握计算机基础知识,初步了解Linux系统特性、安装步骤以及基本命令和操作;具备计算机基础网络知识与数据通信基础知识。
阿里云技能认证
详细说明背景阿里云对象存储OSS(Object Storage Service)侧重点在存储的功能上,但是没有单独的配置去设置访问的流量限制或者QPS的限制。本文通过结合网络分发加速CDN的方式去讲述如何通过CDN结合OSS,实现限制流量的访问或者请求的qps。基本原理对象存储OSS作为存储的功能,往往被盗刷或攻击是因为bucket的读写权限ACL是公共读或公共读写的权限,容易给我们使用者造成大量的金钱损失。所以对于对象存储OSS的读写权限,务必要使用私有的ACL。1.在对象存储OSS没有限制访问流量和QPS的前提下,考虑结合CDN一起使用。链路如下:客户端-->CDN-->OSS;在CDN-->OSS之间可以直接使用私有bucket回源的功能,使得客户端请求CDN的域名时,也无需使用签名的方式,避免403。2.CDN上有带宽封顶的功能,可以实现客户端请求域名时,根据实际的业务需要去设置带宽阈值。3.CDN上有频次控制的功能,可以实现客户端请求域名时,根据实际的业务需要去限制的QPS值。参阅文献对象存储OSS概述,https://help.aliyun.com/document_detail/31817.html对象存储OSS存储空间读写权限ACL,https://help.aliyun.com/document_detail/31843.html内容分发网络CDN概述,https://help.aliyun.com/document_detail/27101.htmlOSS私有bucket回源功能配置,https://help.aliyun.com/document_detail/57653.htmlCDN频次控制功能,https://help.aliyun.com/document_detail/146280.htmlCDN带宽封顶功能,https://help.aliyun.com/document_detail/54954.html
首先我们需要下载官网的demo 需要开发工具Visual Studio 3.demo引入最便捷的是直接把文件夹aliyun-oss-csharp-sdk-master/ 拖拽进Visual Studio即可4.运行sample项目4.1 Config.cs是配置文件,主要配置AccessKeyId、AccessKeySecret以及Endpoint等之类的信息4.2 Program.cs是执行的项目,里面可以指定某一个接口,例如CreateBucket,需要执行哪一个,就把其他的注释掉即可4.3以PutObjectSample.PutObject(bucketName);这个方法作为例子,注意:FileToUpload需要是绝对路径,填写完config.cs之后,直接run即可4.4当然,这里也可以按照demo的来4.5控制台上就可以看到指定的文件了
node参考demo来源:https://github.com/aliyunvideo/AliRtcAppServer/tree/master/nodejs 将demo cp到服务器上后,在node的目录下执行:npm install &&echo "module.exports = {" > config.js &&echo " listen: 8866," >> config.js &&echo " appId: 'os**cx'," >> config.js &&echo " appKey: 'fe2b7b*34014d4a'," >> config.js &&echo " gslb: 'https://rgslb.rtc.aliyuncs.com'" >> config.js &&echo "};" >> config.js &&node index.js &运行成功后直接请求:http://120...34:8866/app/v1/login?room=5555&user=uukug&passwd=1234同时在服务器侧也会显示login的内容⚠️注意:如果有端口占用等情况,kill掉使得端口空闲出来即可。查看端口:netstat -tln | grep 8083lsof -Pnl +M -i4kill端口:kill -9 进程ID PHPdemo参考:https://github.com/aliyunvideo/AliRtcAppServer/tree/master/php 创建并配置Config.php文件echo "<?php" > Config.phpecho "&dollar;listen = 8080;" >> Config.phpecho "&dollar;app_id = 'xxxxxxxx'; " >> Config.phpecho "&dollar;app_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; " >> Config.phpecho "&dollar;gslb = 'https://rgslb.rtc.aliyuncs.com'; " >> Config.phpecho "?>" >> Config.php(建议可以直接写成文本,去掉echo 以及>> Config.php首尾部分) 配置完之后,直接运行http://dc.**.cn/AliRtcAppServer-master/php/app/v1/login.php?room=5555&user=uukug2s 就可以直接得到token信息了 3.pythondemo来源:https://github.com/aliyunvideo/AliRtcAppServer/tree/master/python解压CherryPy-3.2.2,然后执行python setup.py install --user, 然后返回python的目录下,启动服务 python server.py --listen=8866 --appid=ox --appkey=fe2b7*014d4a --gslb=https://rgslb.rtc.aliyuncs.com 访问链接, http://120...4:8866/app/v1/login?room=5555&user=uukug&passwd=12345 在服务器上可以查看对应的请求
关于视频直播的推流/播放地址不知道如何生成的问题,这里详细说一下带鉴权的域名如何生成推流/播放地址。【视频直播地址的组成】1、域名,以live.aliyun.com作为例子;2、鉴权key值(PrivateKey),这个可以直接在控制台上进行创建,如下图3、appname以及streamname,一组appname以及streamname就表示1个直播流。【直播地址】以推流地址为例子,组成方式是:rtmp://推流域名/appname/streamname?auth_key=unix时间戳-rand随机数-uid-md5hash最重要的地方是生成md5hash,rand随机数以及uid都可以设置成0即可,根据自身实际的需求而定。 md5hash的生成,实际上是一个md5的算法,所以在视频直播服务侧是不会封装这类的sdk或者API接口的,拼接如下:echo -n "/AppName/StreamName-Timestamp-rand-uid-PrivateKey" | md5sum如下的一个测试
从官网的链接里可以看,长文本合成实际上是分为两个步骤:1)给NLS服务端发出post请求获取到taskID以及requestID信息;2)根据第一步获取到的taskID以及requestID信息向nls服务端发出get请求获取到长文本合成得到的URL地址。(实际上我也是使用官网的demo测试后,抓包看到的) 抓包如下:(第一步是post请求)(第二步把第一步获取到的内容发送一个get请求) URI的部分:/rest/v1/tts/async?appkey=cA5dJib&task_id=985f508bbae211eaa5a94fb3146eb8c2&token=92dba**4b321f59d0bd8&request_id=6bfdcc0e3ba241ee93ef11643d16f3cchost部分:nls-gateway.cn-shanghai.aliyuncs.com(这里是否上海,根据自己的区域而定了) 【postman模拟】1、post请求(content-type一定要是application/json)body的信息按照官网给的例子就可以这里也贴下:{ "payload":{ "tts_request":{ "voice":"xiaoyun", "sample_rate":16000, "format":"wav", "text":"今天天气好晴朗" }, "enable_notify":false }, "context":{ "device_id":"my_device_id" }, "header":{ "appkey":"cA5O*******Jib", "token":"92dba2********59d0bd8" } } 剩下的一步是进行GET(查询参数里加即可),最终得到合成的音频URL链接。
今天从OSS控制台上下载一个excel表格 打开之后提示乱码,如下附件: 经排查,OSS控制台上下载的文本上UTF-8的编码格式,默认excel表格是ASCII的,所以导致乱码的显示 【解决方法】1、通过excel导入文本的方式去选择UTF-8的编码1)选择数据导入2)文本格式选择unicode(UTF-8)3)分隔符选择“逗号”即可输出结果,如下:
【接口】AssumeRole官网链接:https://help.aliyun.com/document_detail/28763.html【原理】该接口的主要场景是避免主账号/子账号的accessKeyId和accessKeySecret被暴露。所以通过调用接口:AssumeRole生成一个临时的权限,从而可以调用阿里云服务的其他接口,例如:ECS、OSS、直播、RDS等等。【流程图】【关键事项】1、必须使用子账号的accessKeyId以及accessKeySecret,主账号会报错;2、角色arnrole必须是用户角色,不能是服务角色;3、使用的子账号,需要授权AliyunSTSAssumeRoleAccess的权限
针对HLS实时在线人数统计的步骤,首先需要区分一下,HLS在线人数的统计是需要通过UUID进行区分的,UUID是一个唯一的数,最终调用接口得到的数量,是根据uuid统计出的结果。 【第一步】需要提交工单申请将直播域名(播放域名)配置HLS实时在线统计的功能,默认是没有开启的。【第二步】自己业务端的代码生成uuid,如下是python的参考下:(python2.x环境) import uuidname = 'test_name'namespace = uuid.NAMESPACE_URLprint uuid.uuid1() 执行后可以获取到如下的一个uuid:$ python2.7 get_uuid.py e38920a3-9501-11ea-adb0-88e9fe702f3a【第三步】播放URL拼接,正常的hls播放地址:http://播流域名/appname/streamname.m3u8拼接后的URL地址:http://播流域名/appname/streamname.m3u8?aliyun_uuid=xxx 【第四步】调用接口:DescribeHlsLiveStreamRealTimeBpsData privateParams.put("Action", "DescribeHlsLiveStreamRealTimeBpsData"); privateParams.put("DomainName", "***.xxx.cn"); privateParams.put("Time", "2020-05-13T10:30:00Z"); 返回在线信息: {"UsageData":[{"DomainName":"***.xxx.cn","StreamInfos":[{"StreamName":"/AppName11/StreamName11.m3u8","Infos":[{"DownFlow":3262.306666666667,"Rate":"origin","Online":1}]}]}],"RequestId":"86AB3D50-4235-4BF7-AD84-F89F2E305C47","Time":"2020-05-13T10:49:00Z"}
针对HLS标准加密的场景,通常是需要结合MtsHlsUriToken自定义校验的场景。绝大部分情况下,是直接使用Source的方式去播放的。例如:https://dianbo.xxx.com/123.m3u8?MtsHlsUriToken=xxx 作为播放地址 如果通过Vid的方式播放,也是可以通过播放器的接口去配置添加MtsHlsUriToken参数的,以Web作为例子。需要加上:"playConfig":{"MtsHlsUriToken": "123456"}的属性 测试结果:
业务场景1、客户端通过SDK/API接口上传文件给OSS,需要携带callback参数。接口参考:https://help.aliyun.com/document_detail/31989.html注意:目前支持 Callback 的 API 接口有:PutObject、PostObject、CompleteMultipartUpload。2、文件上传成功后,OSS 向callbackurl 发送回调请求。3、callbackurl 需要响应 HTTP/1.1 200 OK,body 必须为 JSON 格式,响应头 Content-Length 必须为合法的值,且不超过 3 MB。4、OSS将返回信息呈现给客户端。 问题:搭建callback回调服务器的时候,上传成功,但是却返回:callbackfailed,提示:Response body is not valid json format类的报错 解决方法:这个报错通常与callback服务器返回的回调body有关系。OSS侧要求callback必须要返回200的状态码以及标准json格式的response body。可以自行通过curl命令模拟post请求进行验证callbackURL的返回内容即可。curl 模拟postcurl -voa -d 'rrr:fff' + callbackURL抓包可看出是否返回的json是否标准。需要相应出类似{"Status":"OK"} 这样的JSON信息出来即可。如下是错误的示例
业务场景 当前阿里云视频点播服务有两种加密方式:1、阿里云私有加密;(目前移动端H5兼容性不好,H5仅支持Android的Chrome浏览器)2、HLS标准加密;(支持H5)移动端以及PC兼容情况:解决方案1、阿里云私有加密1)加密文件生成,转码模板处勾选“HLS加密”即可。生成之后的加密文件是下面的样式:同样也可以通过curl去查看您的视频是否是阿里云私有加密,curl出来的结果是URI=xxx则为阿里云私有加密视频 2)阿里云私有加密视频播放,私有加密的播放需要满足两个条件:1、使用阿里云提供的播放器;(当前有web、Android以及iOS)2、使用videoID+STS或者videoID+playauth方式播放。web demo:https://player.alicdn.com/aliplayer/setting/setting.htmlandroid以及iOS demo:https://help.aliyun.com/document_detail/51992.html2、HLS标准加密1)生成HLS标准加密视频,目前生成HLS标准加密的视频只能通过API接口或者SDK进行处理。(也就是只能代码生成,无法直接使用控制台)逻辑主要是:1、创建加密转码模板2、RAM授权使用RAM服务给视频点播授权访问业务方秘钥管理服务(KMS)的权限3、创建Service Key(KMS控制台创建即可)4、提交加密转码:1)通过接口:GenerateDataKey生成明文秘钥和密文秘钥之后,再提交转码作业;(EncryptConfig里写HLS标准加密信息)GenerateDataKey:https://help.aliyun.com/document_detail/28948.html提交转码作业接口:https://help.aliyun.com/document_detail/68570.html2)直接使用提交转码作业是SDK demo(推荐使用)以Java为例子:https://help.aliyun.com/document_detail/98672.html只需要确认AK、SK、Service Key以及DecryptKeyUri正确即可最终生成的HLS标准加密的视频:通过curl进行验证,得到的URI是http://解密服务地址/xxx?Ciphertext=xxx 这样的连接,则表示加密成功了。5、解密HLS标准加密视频1、谈到解密,大家会比较关心一个令牌HlsMtsToken,这个其实是一个附件的选项。(可有可无)举个例子:我生成的加密地址是:https://vod.xxxx.cn/8e1f0d9295cf41989a837f4aaab7a813/87ba78922d59fe6cba843e48b5ccb659-hd-encrypt-stream.m3u8如果我的服务器需要需要有个校验值的话,就可以写成:https://vod.xxxx.cn/8e1f0d9295cf41989a837f4aaab7a813/87ba78922d59fe6cba843e48b5ccb659-hd-encrypt-stream.m3u8?MtsHlsUriToken=xxxx注意:MtsHlsUriToken=xxxx这个是解密服务器自己判断进行校验的,但是需要提交工单给阿里云的工程师,配置,请求解密URI的时候,带上这个参数。2、解密服务器搭建以Java为例子,如果是其他语言的话,按照下述的步骤写就好。import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.exceptions.ClientException;import com.aliyuncs.http.ProtocolType;import com.aliyuncs.kms.model.v20160120.DecryptRequest;import com.aliyuncs.kms.model.v20160120.DecryptResponse;import com.aliyuncs.profile.DefaultProfile;import com.sun.net.httpserver.Headers;import com.sun.net.httpserver.HttpExchange;import com.sun.net.httpserver.HttpHandler;import com.sun.net.httpserver.HttpServer;import com.sun.net.httpserver.spi.HttpServerProvider;import org.apache.commons.codec.binary.Base64;import java.io.IOException;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.InetSocketAddress;import java.net.URI;import java.util.regex.Matcher;import java.util.regex.Pattern;public class HlsDecryptServer { private static DefaultAcsClient client; static { //KMS的区域,必须与视频对应区域 String region = "<视频对应区域>"; //访问KMS的授权AK信息 String accessKeyId = "<您使用的AccessKeyId>"; String accessKeySecret = "<您使用的AccessKeySecrect>"; client = new DefaultAcsClient(DefaultProfile.getProfile(region, accessKeyId, accessKeySecret)); } /** * 说明: * 1、接收解密请求,获取密文秘钥和令牌Token * 2、调用KMS decrypt接口获取明文秘钥 * 3、将明文秘钥base64decode返回 */ public class HlsDecryptHandler implements HttpHandler { /** * 处理解密请求 * @param httpExchange * @throws IOException */ public void handle(HttpExchange httpExchange) throws IOException { String requestMethod = httpExchange.getRequestMethod(); if ("GET".equalsIgnoreCase(requestMethod)) { //校验token的有效性 String token = getMtsHlsUriToken(httpExchange); boolean validRe = validateToken(token); if (!validRe) { return; } //从URL中取得密文密钥 String ciphertext = getCiphertext(httpExchange); if (null == ciphertext) return; //从KMS中解密出来,并Base64 decode byte[] key = decrypt(ciphertext); //设置header setHeader(httpExchange, key); //返回base64decode之后的密钥 OutputStream responseBody = httpExchange.getResponseBody(); responseBody.write(key); responseBody.close(); } } private void setHeader(HttpExchange httpExchange, byte[] key) throws IOException { Headers responseHeaders = httpExchange.getResponseHeaders(); responseHeaders.set("Access-Control-Allow-Origin", "*"); httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, key.length); } /** * 调用KMS decrypt接口解密,并将明文base64decode * @param ciphertext * @return */ private byte[] decrypt(String ciphertext) { DecryptRequest request = new DecryptRequest(); request.setCiphertextBlob(ciphertext); request.setProtocol(ProtocolType.HTTPS); try { DecryptResponse response = client.getAcsResponse(request); String plaintext = response.getPlaintext(); //注意:需要base64 decode return Base64.decodeBase64(plaintext); } catch (ClientException e) { e.printStackTrace(); return null; } } /** * 校验令牌有效性 * @param token * @return */ private boolean validateToken(String token) { if (null == token || "".equals(token)) { return false; } //TODO 业务方实现令牌有效性校验 return true; } /** * 从URL中获取密文秘钥参数 * @param httpExchange * @return */ private String getCiphertext(HttpExchange httpExchange) { URI uri = httpExchange.getRequestURI(); String queryString = uri.getQuery(); String pattern = "Ciphertext=(\\w*)"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(queryString); if (m.find()) return m.group(1); else { System.out.println("Not Found Ciphertext Param"); return null; } } /** * 获取Token参数 * * @param httpExchange * @return */ private String getMtsHlsUriToken(HttpExchange httpExchange) { URI uri = httpExchange.getRequestURI(); String queryString = uri.getQuery(); String pattern = "MtsHlsUriToken=(\\w*)"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(queryString); if (m.find()) return m.group(1); else { System.out.println("Not Found MtsHlsUriToken Param"); return null; } } } /** * 服务启动 * * @throws IOException */ private void serviceBootStrap() throws IOException { HttpServerProvider provider = HttpServerProvider.provider(); //监听端口9999,能同时接受30个请求 HttpServer httpserver = provider.createHttpServer(new InetSocketAddress(9999), 30); httpserver.createContext("/", new HlsDecryptHandler()); httpserver.start(); System.out.println("hls decrypt server started"); } public static void main(String[] args) throws IOException { HlsDecryptServer server = new HlsDecryptServer(); server.serviceBootStrap(); } }
业务场景视频直播服务,系统默认的权限仅有AliyunLiveFullAccess,针对API接口所涉及的权限配置暂无详细说明解决方案1、视频直播服务API接口,官网链接:https://help.aliyun.com/document_detail/48207.html?spm=a2c4g.11186623.6.692.529e7375EV5OUE2、通过RAM自定义授权指定的API接口,方法如下:{ "Version": "1", "Statement": [ { "Action": "live: DescribeLiveStreamsOnlineList", "Resource": "acs:cdn:*:*:domain/***push.xxx.cn", "Effect": "Allow" } ]} 注意点由于直播服务使用的CDN的资源,Action处写的API接口是live,Resource处写的产品是CDN。否则会提示报错:User not authorized to operate on the specified resource。借鉴文档https://help.aliyun.com/knowledge_detail/58963.html?spm=a2c4g.11186623.6.714.15281e2aShjKnH
业务场景针对对象存储OSS私有bucket权限的使用场景,每个object都需要生成一次签名URL。针对m3u8的索引文件,索引里的每一个ts都需要生成一次签名地址。普通的带签名的m3u8地址,ts是没有签名的。那么播放器请求的时候,请求到ts时,就会抛出403签名的权限报错。解决方法1、官网提供了签名URL的生成方法以及demohttps://help.aliyun.com/document_detail/100670.html?spm=a2c4g.11186623.6.659.181165d3h56PAa2、通过官网的方法,在header中添加上x-oss-process=hls/sign处理即可。demo例子:(Java)// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = "";String accessKeySecret = "";String bucketName = "";String objectName = "";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 设置图片处理样式。String style = "hls/sign";// 指定过期时间为10分钟。Date expiration = new Date(new Date().getTime() + 1000 60 10 );GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);req.setExpiration(expiration);req.setProcess(style);URL signedUrl = ossClient.generatePresignedUrl(req);System.out.println(signedUrl);// 关闭OSSClient。ossClient.shutdown();最终输出的地址上的ts是带上签名的。
业务场景在跨境请求的场景下,由于跨境链路的限制,出现访问慢或无法访问等普遍现象。解决方案方法一:添加CDN/全站加速进行加速,通过提前预热的形式,将需要访问的资源提前缓存到节点上,从而客户端可以直接访问节点获取资源,避免跨境的链路限制。(注意:要求高命中率前提)方法二:双源站的方式,即中国大陆一个源站,海外一个源站。目前全站加速支持一个域名根据用户访问的节点进行回源不同的源站,国内节点回源国内源站;海外节点回源海外源站。方法三:源站服务器迁移OSS对象存储的方式,OSS支持“传输加速”的功能;(主要是针对跨境问题,与CDN/全站加速原理不同)通过CDN/全站加速进行回源OSS对象存储,OSS开启“传输加速”。附操作:1、源站服务器迁移至OSS对象存储,可通过在线迁移服务、ossutil等工具进行迁移;2、OSS对象存储开启“传输加速”;3、添加CDN/全站加速域名,回源OSS对象存储的“传输加速”域名。
2022年06月
2022年02月
2020年08月
2020年07月
2020年06月
2020年05月
2020年04月
2020年03月
2020年01月