• 关于

    本地小程序消息使用说明

    的搜索结果

回答

如何查看、关闭和开放WIN 系统端口Windows有很多端口是开放的,在你上网的时候,网络病毒和黑客可以通过这些端口连上你的电脑。为了让你的系统变为铜墙铁壁,应该封闭这些端口,主要有:TCP 135、139、445、593、1025 端口和 UDP 135、137、138、445 端口,一些流行病毒的后门端口(如 TCP 2745、3127、6129 端口),以及远程服务访问端口3389。查看端口在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令:依次点击“开始→运行”,键入“cmd”并回车,打开命令提示符窗口。在命令提示符状态下键入“netstat -a -n”,按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态。小知识:Netstat命令用法命令格式:Netstat -a -e -n -o -s-an-a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。-e 表示显示以太网发送和接收的字节数、数据包数等。-n 表示只以数字形式显示所有活动的TCP连接的地址和端口号。-o 表示显示活动的TCP连接并包括每个连接的进程ID(PID)。-s 表示按协议显示各种连接的统计信息,包括端口号。-an 查看所有开放的端口关闭/开启端口先介绍一下在Windows中如何关闭/打开端口的简单方法,因为默认的情况下,有很多不安全的或没有什么用的端口是开启的,比如Telnet服务的23端口、FTP服务的21端口、SMTP服务的25端口、RPC服务的135端口等等。为了保证系统的安全性,我们可以通过下面的方法来关闭/开启端口。关闭端口比如在Windows 2000/XP中关闭SMTP服务的25端口,可以这样做:首先打开“控制面板”,双击“管理工具”,再双击“服务”。接着在打开的服务窗口中找到并双击“Simple Mail Transfer Protocol (SMTP)”服务,单击“停止”按钮来停止该服务,然后在“启动类型”中选择“已禁用”,最后单击“确定”按钮即可。这样,关闭了SMTP服务就相当于关闭了对应的端口。开启端口如果要开启该端口只要先在“启动类型”选择“自动”,单击“确定”按钮,再打开该服务,在“服务状态”中单击“启动”按钮即可启用该端口,最后,单击“确定”按钮即可。提示:在Windows 98中没有“服务”选项,你可以使用防火墙的规则设置功能来关闭/开启端口。如何在WinXP/2000/2003下关闭和开放网络端口的详细方法第一步,点击开始菜单/设置/控制面板/管理工具,双击打开本地安全策略,选中IP 安全策略,在本地计算机,在右边窗格的空白位置右击鼠标,弹出快捷菜单,选择创建 IP 安全策略(如右图),于是弹出一个向导。在向导中点击下一步按钮,为新的安全策略命名;再按下一步,则显示安全通信请求画面,在画面上把激活默认相应规则左边的钩去掉,点击完成按钮就创建了一个新的IP 安全策略。第二步,右击该IP安全策略,在属性对话框中,把使用添加向导左边的钩去掉,然后单击添加按钮添加新的规则,随后弹出新规则属性对话框,在画面上点击添加按钮,弹出IP筛选器列表窗口;在列表中,首先把使用添加向导左边的钩去掉,然后再点击右边的添加按钮添加新的筛选器。第三步,进入筛选器属性对话框,首先看到的是寻址,源地址选任何 IP 地址,目标地址选我的 IP 地址;点击协议选项卡,在选择协议类型的下拉列表中选择TCP,然后在到此端口下的文本框中输入135,点击确定按钮(如左图),这样就添加了一个屏蔽 TCP 135(RPC)端口的筛选器,它可以防止外界通过135端口连上你的电脑。点击确定后回到筛选器列表的对话框,可以看到已经添加了一条策略,重复以上步骤继续添加 TCP 137、139、445、593 端口和 UDP 135、139、445 端口,为它们建立相应的筛选器。重复以上步骤添加TCP 1025、2745、3127、6129、3389 端口的屏蔽策略,建立好上述端口的筛选器,最后点击确定按钮。第四步,在新规则属性对话框中,选择新 IP 筛选器列表,然后点击其左边的圆圈上加一个点,表示已经激活,最后点击筛选器操作选项卡。在筛选器操作选项卡中,把使用添加向导左边的钩去掉,点击添加按钮,添加阻止操作(右图):在新筛选器操作属性的安全措施选项卡中,选择阻止,然后点击确定按钮。第五步、进入新规则属性对话框,点击新筛选器操作,其左边的圆圈会加了一个点,表示已经激活,点击关闭按钮,关闭对话框;最后回到新IP安全策略属性对话框,在新的IP筛选器列表左边打钩,按确定按钮关闭对话框。在本地安全策略窗口,用鼠标右击新添加的 IP 安全策略,然后选择指派。重新启动后,电脑中上述网络端口就被关闭了,病毒和黑客再也不能连上这些端口,从而保护了你的电脑。目前还没听说有补丁下载。端口分类逻辑意义上的端口有多种分类标准,下面将介绍两种常见的分类:按端口号分布划分(1)知名端口(Well-Known Ports)知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。(2)动态端口(Dynamic Ports)动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。不过,动态端口也常常被病毒木马程序所利用,如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。按协议类型划分按协议类型划分,可以分为TCP、UDP、IP和ICMP(Internet控制消息协议)等端口。下面主要介绍TCP和UDP端口:(1)TCP端口TCP端口,即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP服务的21端口,Telnet服务的23端口,SMTP服务的25端口,以及HTTP服务的80端口等等。(2)UDP端口UDP端口,即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。常见的有DNS服务的53端口,SNMP(简单网络管理协议)服务的161端口,QQ使用的8000和4000端口等等。常见网络端口端口:0服务:Reserved说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。端口:1服务:tcpmux说明:这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开。Irix机器在发布是含有几个默认的无密码的帐户,如:IP、GUEST UUCP、NUUCP、DEMOS 、TUTOR、DIAG、OUTOFBOX等。许多管理员在安装后忘记删除这些帐户。因此HACKER在INTERNET上搜索tcpmux并利用这些帐户。端口:7服务:Echo说明:能看到许多人搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息。端口:19服务:Character Generator说明:这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。HACKER利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。端口:21服务:FTP说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。端口:22服务:Ssh说明:PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。端口:23服务:Telnet说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。端口:25服务:SMTP说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。端口:31服务:MSG Authentication说明:木马Master Paradise、Hackers Paradise开放此端口。端口:42服务:WINS Replication说明:WINS复制端口:53服务:Domain Name Server(DNS)说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。端口:67服务:Bootstrap Protocol Server说明:通过DSL和Cable modem的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些机器在向DHCP服务器请求一个地址。HACKER常进入它们,分配一个地址把自己作为局部路由器而发起大量中间人(man-in-middle)攻击。客户端向68端口广播请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的IP地址。端口:69服务:Trival File Transfer说明:许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使入侵者能从系统中窃取任何文件。它们也可用于系统写入文件。端口:79服务:Finger Server说明:入侵者用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器Finger扫描。端口:80服务:HTTP说明:用于网页浏览。木马Executor开放此端口。端口:99服务:Metagram Relay说明:后门程序ncx99开放此端口。端口:102服务:Message transfer agent(MTA)-X.400 over TCP/IP说明:消息传输代理。

51干警网 2019-12-02 03:20:36 0 浏览量 回答数 0

问题

【阿里云产品公测】消息队列服务MQS java SDK 机器人应用 初体验

啊里新人 2019-12-01 21:08:47 25480 浏览量 回答数 18

回答

1 syslogd的配置文件 syslogd的配置文件/etc/syslog.conf规定了系统中需要监视的事件和相应的日志的保存位置 cat /etc/syslog.conf # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! .info;mail.none;authpriv.none;cron.none /var/log/messages #除了mail/news/authpriv/cron以外,将info或更高级别的消息送到/var/log/messages,其中是通配符,代表任何设备;none表示不对任何级别的信息进行记录 # The authpriv file has restricted access. authpriv.* /var/log/secure #将authpirv设备的任何级别的信息记录到/var/log/secure文件中,这主要是一些和认证,权限使用相关的信息. # Log all the mail messages in one place. mail.* -/var/log/maillog #将mail设备中的任何级别的信息记录到/var/log/maillog文件中, 这主要是和电子邮件相关的信息. # Log cron stuff cron.* /var/log/cron #将cron设备中的任何级别的信息记录到/var/log/cron文件中, 这主要是和系统中定期执行的任务相关的信息. # Everybody gets emergency messages .emerg * #将任何设备的emerg级别或更高级别的消息发送给所有正在系统上的用户. # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler #将uucp和news设备的crit级别或更高级别的消息记录到/var/log/spooler文件中. # Save boot messages also to boot.log local7. /var/log/boot.log #将和本地系统启动相关的信息记录到/var/log/boot.log文件中. 2. syslogd语法 该配置文件的每一行的格式如下: facility.priority action 设备.级别 动作 3. Syslogd设备字段 设备字段用来指定需要监视的事件.它可取的值如下: authpriv cron daemon kern lpr syslog user uucp mail news 报告认证活动通常,口令等私有信息不会被记录 报告与cron和at有关的信息 报告与xinetd有关的信息 报告与内核有关的信息 报告与打印服务有关的信息 由syslog生成的信息 报告由用户程序生成的任何信息由UUCP生成的信息 报告与邮件服务有关的信息 报告与网络新闻服务有关的信息 4. syslogd级别字段 级别字段用于指明与每一种功能有关的级别和优先级: alert crit err warning notice info debug none * emerg 需要立即引起注意的情况 危险情况的警告 除了emerg,alert,crit的其他错误 警告信息需要引起注意的情况 值得报告的消息 由运行于debug模式的程序所产生的消息 用于禁止任何消息 所有级别,除了none 出现紧急情况使得该系统不可用 5. syslogd动作字段 动作字段用于描述对应功能的动作 file username device @hostname 指定一个绝对路径的日志文件名记录日志信息 发送信息到指定用户,*表示所有用户 将信息发送到指定的设备中,如/dev/console将信息发送到可解析的远程主机hostname,且该主机必须正在运行syslogd并可以识别syslog的配置文件 6. 查看日志文件 常见的日志文件日志文件通常存放在/var/log目录下.在该目录下除了包括syslogd 记录的日志之外,同时还包含所有应用程序的日志. 为了查看日志文件的内容必须要有root权限.日志文件中的信息很重要,只能让超级用户有访问这些文件的权限. 7. log cups/ httpd/ mail/ news/ boot.log dmesg maillog messages secure wtmp 存储CUPS打印系统的日志目录 记录apache的访问日志和错误日志目录 存储mail日志目录 存储INN新闻系统的日志目录 记录系统启动日志记录系统启动时的消息日志 记录邮件系统的日志 由syslogd记录的info或更高级别的消息日志 由syslogd记录的认证日志 一个用户每次登录进入和退出时间的永久记录 8. 查看文本日志文件 绝大多数日志文件是纯文本文件,每一行就是一个消息.只要是在Linux下能够处理纯文本的工具都能用来查看日志文件.可以使用 cat,tac, more,less,tail和grep进行查看文件中每一行表示一个消息,而且都由四个域的固定格式组成: 时间标签(Timestamp):表示消息发出的日期和时间. 主机名(Hostname):表示生成消息的计算机的名字. 生成消息的子系统的名字:可以是"Kernel",表示消息来自内核或者 是进程的名字,表示发出消息的程序的名字. 在方括号里的是进程的PID. 消息(Message),即消息的内容. syslog发出的消息,说明了守护进程已经在 Dec 16,03:32:41 重新启动了. Dec 16 03:32:41 cnetos5 syslogd 1.4.1: restart. # 在 Dec 19,00:20:56 启动了内核日志 klogd Dec 19 00:20:56 cnetos5 kernel: klogd 1.4.1, log source = /proc/kmsg started. # 在 Dec 19,00:21:01 启动了xinetd Dec 19 00:21:01 cnetos5 xinetd[2418]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in. 9. 查看非文本日志文件Lastlog 也有一些日志文件是二进制文件,需要使用相应的命令进行读取. 使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog 的内容 rpc 从未登录过 rpcuser 从未登录过 sshd 从未登录过 pcap 从未登录过 haldaemon 从未登录过 xfs 从未登录过 gdm 从未登录过 boobooke 从未登录过 baobao pts/1 192.168.1.2 三 11月 26 12:44:32 +0800 2008 abc 从未登录过 test pts/1 192.168.1.5 四 11月 27 17:30:53 +0800 2008 test01 从未登录过 last命令往回搜索/var/log/wtmp来显示自从文件第一次创建以来登录过用户 root pts/1 116.226.69.195 Fri Aug 31 15:48 - 18:37 (02:49) 10. 查看非文本日志文件lastb lastb命令搜索/var/log/btmp来显示登录未成功的信息. root ssh:notty 222.143.27.97 Thu Sep 6 19:43 - 19:43 (00:00) 11. 查看非文本日志文件who who命令查询wtmp文件并报告当前登录的每个用户.who命令的缺省输出包括用户名,终端类型,登录日期及远程主机. [root@server ~]# who root pts/0 2012-09-08 10:18 (116.226.69.195) [root@server ~]# w 10:41:31 up 212 days, 20:19, 1 user, load average: 0.21, 0.16, 0.14 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 116.226.69.195 10:18 0.00s 0.09s 0.00s w 12.日志滚动 为什么使用日志滚动所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费.同时也 加快了管理员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快. Logrotate 其命令格式为: logrotate [选项] <configfile> -d:详细显示指令执行过程,便于排错或了解程序执行的情况. -f:强行启动记录文件维护操作,即使logrotate指令认为无需要亦然 -m command:指定发送邮件的程序,默认为 /usr/bin/mail. -s statefile:使用指定的状态文件. -v:在执行日志滚动时显示详细信息. 13. 日志滚动 logrotate 默认的主配置文件是 /etc/logrotate.conf /etc/logrotate.d 的目录下的文件,这些文件被 include 到主配置文件 /etc/logrotate.conf 中 # see "man logrotate" for details # 每周清理一次日志文件 weekly #保存过去四周的日志文件 rotate 4 #清除旧日志文件的同时,创建新的空日志文件 create #若使用压缩的日志文件,请删除下面行的注释符 #compress #包含/etc/logrotate.d目录下的所有配置文件 include /etc/logrotate.d #设置/var/log/wtmp的日志滚动 /var/log/wtmp { monthly minsize 1M create 0664 root utmp rotate 1 } 可以使用ls命令显示/etc/logrotate.d目录: [root@server ~]# ls /etc/logrotate.d mgetty psacct rpm setroubleshoot snmpd syslog yum 每个文件的基本格式均相同 [root@server ~]# cat /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron { #对日志文件 sharedscripts #调用日志滚动通用函数sharedscripts postrotate #在日志滚动之后执行语句括号postrotate和endscript之间的命令postrotate /bin/kill -HUP cat /var/run/syslogd.pid 2> /dev/null 2> /dev/null || true /bin/kill -HUP cat /var/run/rsyslogd.pid 2> /dev/null 2> /dev/null || true #重新启动syslogd endscript } logrotate是由crond运行的,在默认配置中,可以发现在/etc/cron.daily目录中有一个名为logrotate的文件 [root@server ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 答案来源于网络

养狐狸的猫 2019-12-02 03:06:55 0 浏览量 回答数 0

回答

Re网站上传后无法用IP地址访问到网站 测试页删除后,临时域名还是无法访问。 访问方式: 临时域名 /folder/default.aspx 错误信息如下; ========================分割线======================================= “/”应用程序中的服务器错误。 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。 分析器错误消息: 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。源错误: [table=100%,#ffffcc,,1][tr][td]服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。[/td][/tr][/table]============================分割线 =========================================== ------------------------- Re网站上传后无法用IP地址访问到网站 刚才把网站文件都放在根目录发现可以访问了,放在解压后文件夹里面为什么不行呢,当然我只是测试 ------------------------- Re网站上传后无法用IP地址访问到网站 问一个比较小白的问题,仅把首页文件放在根目录时,我还是无法访问我的网站,错误提示如下。那要如何修改Web.Config文件,才能正常访问。 =========== “/”应用程序中的服务器错误。 运行时错误 说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。 详细信息: 若要使他人能够在远程计算机上查看此特定错误消息的详细信息,请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记。然后应将此 <customErrors> 标记的“mode”属性设置为“Off”。[table=100%,#ffffcc,,1][tr][td]<!-- Web.Config 配置文件 --><configuration><system.web><customErrors mode="Off"/></system.web></configuration>[/td][/tr][/table] 注释: 通过修改应用程序的 <customErrors> 配置标记的“defaultRedirect”属性,使之指向自定义错误页的 URL,可以用自定义错误页替换所看到的当前错误页。 [table=100%,#ffffcc,,1][tr][td]<!-- Web.Config 配置文件 --><configuration><system.web><customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/></system.web></configuration>[/td][/tr][/table] ==========

小睿 2019-12-02 02:46:11 0 浏览量 回答数 0

回答

概述 当网站访问很慢或无法访问时,若已经排除显著的问题,而使用ping命令检测到有明显丢包时,建议您做链路测试。在Windows环境中,推荐优先使用WinMTR工具,或者tracert命令行进行链路测试以判断问题来源。通常情况下,链路测试步骤如下。 利用链路测试工具探测网络状况和服务器状态。 根据链路测试结果分析处理。 详细信息 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 WinMTR工具 mtr(My traceroute)作为一款网络测试工具,集成了tracert与ping这两个命令的图形界面。ping与tracert通常被用于检测网络状况和服务器状态,具体说明如下。 命令名称 具体说明 ping 送出封包到指定的服务器。如果服务器有回应就会传送回封包,并附带返回封包来回的时间 tracert 返回从用户的电脑到指定的服务器中间经过的所有节点(路由)以及每个节点的回应速度。 WinMTR是mtr工具在Windows环境下的图形化实现,适合Windows下做路由追踪及ping测试。WinMTR默认发送ICMP数据包进行探测,无法切换。 相比tracert命令行工具,WinMTR能避免节点波动对测试结果的影响,测试结果更正确。Windows环境下,建议优先使用WinMTR进行链路测试。下载WinMTR工具。 下载WinMTR工具后,直接解压运行。运行程序后,在 Host 字段输入目标服务器域名或IP。 1 单击 Start 开始测试。开始测试后,相应按钮变成了 Stop。 运行一段时间后,单击 Stop 停止测试。 说明:您可以多测试几分钟,测试结束后,将结果导出。 常见可选参数说明 Copy Text to clipboard:将测试结果以文本格式复制到粘贴板。 Copy HTML to clipboard:将测试结果以HTML格式复制到粘贴板。 Export TEXT:将测试结果以文本格式导出到指定文件。 Export HTML:将测试结果以HTML格式导出到指定文件。 Options:为可选参数。具体包括以下参数。 Interval(sec):每次探测的间隔(过期)时间,默认为1秒。 Ping size(bytes):ping 探测所使用的数据包大小,默认为64字节。 Max hosts in LRU list:LRU列表支持的最大主机数,默认值为128。 Resolve names:通过反查IP以域名显示相关节点。 WinMTR运行后的返回结果说明 默认配置下,WinMTR测试结果说明如下。 第一列(Hostname):到目标服务器要经过的每个节点主机IP或域名。 第二列(Nr):节点编号。 第三列(Loss%):节点丢包率。ping数据包回复失败的百分比,由此可判断哪个节点(线路)出现故障,是服务器所在机房还是国际路由干路。 第四列(Sent):已发送的数据包数量。 第五列(Recv):已成功接收的数据包数量。 第六、七、八、九列(Best 、Avg、Worst、Last):分别是回应时间的最小值、平均值、最大值和最后一个数据包的回应时间。 tracert命令行工具 tracert (Trace Route) 是Windows自带的网络诊断命令行实用程序,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。 tracert通过向目标地址发送ICMP数据包来确定到目标地址的路由。在这些数据包中,tracert使用了不同的IP生存期 (TTL) 值。由于要求沿途的路由器在转发数据包前至少必须将TTL减少1,因此TTL实际上相当于一个跃点计数器 (hop counter)。当某个数据包的TTL达到零时,相应节点就会向源计算机发送一个ICMP超时的消息。tracert第一次发送TTL为1的数据包,并在每次后续传输时将TTL增加1,直到目标地址响应或达到TTL的最大值。中间路由器发送回来的ICMP超时消息中包含了相应节点的信息。 在桌面底部单击 开始 菜单,选择 运行。 打开运行框后,在框中输入 cmd,并单击 确定。 在命令运行界面中,输入 tracert ,按回车键后,界面将显示tracert的用法说明。 2 根据具体用法,输入待跟踪的目标地址,示例如下。 C:> tracert -d 223.5.5.5 通过最多 30 个跃点跟踪到 223.5.5.5 的路由 1 * * * 请求超时。 2 9 ms 3 ms 12 ms 192.X.X.20 3 4 ms 9 ms 2 ms 111.X.X.41 4 9 ms 2 ms 1 ms 111.X.X.197 5 11 ms * * 211.X.X.57 6 3 ms 2 ms 2 ms 211.X.X.62 7 2 ms 2 ms 1 ms 42.X.X.190 8 32 ms 4 ms 3 ms 42.X.X.238 9 * * * 请求超时。 10 3 ms 2 ms 2 ms 223.5.5.5 分析链路测试结果 以如下链路测试结果示例图为基础进行阐述。 判断各区域是否存在异常,并根据各区域的情况分别处理。 区域A:客户端本地网络,即本地局域网和本地网络提供商网络。针对该区域异常,客户端本地网络相关节点问题,请对本地网络进行排查分析;本地网络提供商网络相关节点问题,请向当地运营商反馈。 区域B:运营商骨干网络。针对该区域异常,可根据异常节点IP查询归属运营商,然后直接或通过阿里云售后技术支持,向相应运营商反馈问题。 区域C:目标服务器本地网络,即目标主机归属网络提供商网络。针对该区域异常,需要向目标主机归属网络提供商反馈问题。 结合Avg(平均值)和StDev(标准偏差),判断各节点是否存在异常。 若StDev很高,则同步观察相应节点的Best和Worst,来判断相应节点是否存在异常。 若StDev不高,则通过Avg来判断相应节点是否存在异常。 注意:上述StDev高或者不高,并没有具体的时间范围标准。而需要根据同一节点其它列的延迟值大小来进行相对评估。比如,如果Avg为30ms,那么,当StDev为25ms,则认为是很高的偏差。而如果Avg为325ms,则同样的StDev为25ms,反而认为是不高的偏差。 查看节点丢包率,若“Loss%”不为零,则说明这一跳路由的网络可能存在问题。导致节点丢包的原因通常有两种。 人为限制了节点的ICMP发送速率,导致丢包。 节点确实存在异常,导致丢包。 确定当前异常节点的丢包原因。 若随后节点均没有丢包,说明当前节点丢包是由于运营商策略限制所致,可以忽略。如前文链路测试结果示例图中的第2跳路由的网络所示。 若随后节点也出现丢包,说明当前节点存在网络异常,导致丢包。如前文链路测试结果示例图中的第5跳路由的网络所示。 说明:前述两种情况可能同时发生,即相应节点既存在策略限速,又存在网络异常。对于这种情况,若当前节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳路由的网络的丢包率为准。如前文链路测试结果示例图所示,在第5、6、7跳路由的网络均出现了丢包。所以,最终丢包情况,以第7跳的40%作为参考。 通过查看是否有明显的延迟,来确认节点是否存在异常。通过如下两个方面进行分析。 若某一跳路由的网络之后延迟明显陡增,则通常判断该节点存在网络异常。如前文链路测试结果示例图所示,从第5跳路由的网络之后的后续节点延迟明显陡增,则推断是第5跳路由的网络节点出现了网络异常。 注:高延迟并不一定完全意味着相应节点存在异常,延迟大也有可能是在数据回包链路中引发的,建议结合反向链路测试一并分析。 ICMP策略限速也可能会导致相应节点的延迟陡增,但后续节点通常会恢复正常。如前文链路测试结果示例图所示,第3跳路由的网络有100%的丢包率,同时延迟也明显陡增。但随后节点的延迟马上恢复了正常。所以判断该节点的延迟陡增及丢包是由于策略限速所致。 操作建议 若数据包在目标地址出现了100%的丢包,建议对目标服务器的安全策略配置进行排查。 若数据包出现循环跳转,导致无法到达目标服务器,建议联系相应节点归属运营商处理。 若数据包在跳转后无法收到任何反馈,建议结合反向链路测试作进一步确认,并联系相应节点归属运营商进行处理。 阿里云中国内地机房和其他国家或地区有网络通信的专线,为降低通信时候的丢包率,推荐使用高速通道。 若主机掉包和延迟非常高,建议做WinMTR双向测试,即本地到服务器的和服务器到本地的测试。无法远程登录时,请通过管理终端进行登录。

1934890530796658 2020-03-25 23:51:46 0 浏览量 回答数 0

回答

一 系统介绍 Android 是Google开发的基于Linux平台的、开源的、智能手机操作系统。Android包括操作系统、中间件和应用程序,由于源代码开放,Android可以被移植到不同的硬件平台上。 围绕在Google的Android系统中,形成了移植开发和上层应用程序开发两个不同的开发方面。手机厂商从事移植开发工作,上层的应用程序开发可以由任何单位和个人完成,开发的过程可以基于真实的硬件系统,还可以基于仿真器环境。 作为一个手机平台,Android在技术上的优势主要有以下几点: - 全开放智能手机平台 - 多硬件平台的支持 - 使用众多的标准化技术 - 核心技术完整,统一 - 完善的SDK和文档 - 完善的辅助开发工具 Android的开发者可以在完备的开发环境中进行开发,Android的官方网站也提供了丰富的文档、资料。这样有利于Android系统的开发和运行在一个良好的生态环境中。 https://developer.android.com/about安卓开发者官方网站 从宏观的角度来看,Android是一个开放的软件系统,它包含了众多的源代码。从下至上,Android系统分成4个层次: 第1层次:Linux操作系统及驱动; 第2层次:本地代码(C/C++)框架; 第3层次:Java框架; 第4层次:Java应用程序。 Android系统的架构如图所示: 由于Android系统需要支持Java代码的运行,这部分内容是Android的运行环境(Runtime),由虚拟机和Java基本类组成。 对于Android应用程序的开发,主要关注第3层次和第4层次之间的接口。 二 学习路线 基础学习——JavaSE: 基础学习扩展——JavaEE: 基础学习扩展——Linux基础: Android开发学习——基础理论:系统架构分析: Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层。 Linux内核(Linux Kernel) Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的。 Linux 内核是硬件和软件层之间的抽象层。 中间件 中间件包括两部分: 核心库和运行时(libraries & Android runtime) 核心库包括,SurfaceManager 显示系统管理库,负责把2D或3D内容显示到屏幕;Media Framework 媒体库,负责支持图像,支持多种视频和音频的录制和回放;SQlite 数据库,一个功能强大的轻量级嵌入式关系数据库;WebKit 浏览器引擎等。 Dalvik虚拟机: 区别于Java虚拟机的是,每一个Android 应用程序都在它自己的进程中运行,都有一个属于自己的Dalvik 虚拟机,这一点可以让系统在运行时可以达到优化,程序间的影响大大降低。Dalvik虚拟机并非运行Java字节码,而是运行自己的字节码。 应用程序框架(Application Framework) 丰富而又可扩展性的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids), 文本框(text boxes),按钮( buttons), 可嵌入的web 浏览器。内容提供者(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件( layoutfiles )。通知管理器(Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。 三 基础知识 掌握java部分之后,可以使用开发工具进入android世界 您可以使用 Kotlin、Java 和 C++ 语言编写 Android 应用。Android SDK 工具会将您的代码连同任何数据和资源文件编译成一个 APK(Android 软件包),即带有 .apk 后缀的归档文件。一个 APK 文件包含 Android 应用的所有内容,它也是 Android 设备用来安装应用的文件。 每个 Android 应用都处于各自的安全沙盒中,并受以下 Android 安全功能的保护: • Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户; • 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件; • 每个进程都拥有自己的虚拟机 (VM),因此应用代码独立于其他应用而运行。 • 默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。 Android 系统实现了最小权限原则。换言之,默认情况下,每个应用只能访问执行其工作所需的组件,而不能访问其他组件。这样便能创建非常安全的环境,在此环境中,应用无法访问其未获得权限的系统部分。不过,应用仍可通过一些途径与其他应用共享数据以及访问系统服务: • 可以安排两个应用共享同一 Linux 用户 ID,在此情况下,二者便能访问彼此的文件。为节省系统资源,也可安排拥有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一 VM。应用还必须使用相同的证书进行签名。 • 应用可以请求访问设备数据(如用户的联系人、短信消息、可装载存储装置(SD 卡)、相机、蓝牙等)的权限。用户必须明确授予这些权限。如需了解详细信息,请参阅使用系统权限。 本文档的其余部分将介绍以下概念: • 用于定义应用的核心框架组件 • 用来声明组件和应用必需设备功能的清单文件。 • 与应用代码分离并允许应用针对各种设备配置适当优化其行为的资源。 应用组件 应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入您的应用。有些组件会依赖于其他组件。 共有四种不同的应用组件类型: • Activity • 服务 • 广播接收器 • 内容提供程序 每种类型都有不同的用途和生命周期,后者会定义如何创建和销毁组件。以下部分将介绍应用组件的四种类型。 Activity Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕。例如,电子邮件应用可能有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。尽管这些 Activity 通过协作在电子邮件应用中形成一种紧密结合的用户体验,但每个 Activity 都独立于其他 Activity 而存在。因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。Activity 有助于完成系统和应用程序之间的以下重要交互: • 追踪用户当前关心的内容(屏幕上显示的内容),以确保系统继续运行托管 Activity 的进程。 • 了解先前使用的进程包含用户可能返回的内容(已停止的 Activity),从而更优先保留这些进程。 • 帮助应用处理终止其进程的情况,以便用户可以返回已恢复其先前状态的 Activity。 • 提供一种途径,让应用实现彼此之间的用户流,并让系统协调这些用户流。(此处最经典的示例是共享。) 您需将 Activity 作为 Activity 类的子类来实现。如需了解有关 Activity 类的更多信息,请参阅 Activity 开发者指南。 服务 服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。例如,当用户使用其他应用时,服务可能会在后台播放音乐或通过网络获取数据,但这不会阻断用户与 Activity 的交互。诸如 Activity 等其他组件可以启动服务,使该服务运行或绑定到该服务,以便与其进行交互。事实上,有两种截然不同的语义服务可以告知系统如何管理应用:已启动服务会告知系统使其运行至工作完毕。此类工作可以是在后台同步一些数据,或者在用户离开应用后继续播放音乐。在后台同步数据或播放音乐也代表了两种不同类型的已启动服务,而这些服务可以修改系统处理它们的方式: • 音乐播放是用户可直接感知的服务,因此,应用会向用户发送通知,表明其希望成为前台,从而告诉系统此消息;在此情况下,系统明白它应尽全力维持该服务进程运行,因为进程消失会令用户感到不快。 • 通常,用户不会意识到常规后台服务正处于运行状态,因此系统可以更自由地管理其进程。如果系统需要使用 RAM 来处理用户更迫切关注的内容,则其可能允许终止服务(然后在稍后的某个时刻重启服务)。 绑定服务之所以能运行,原因是某些其他应用(或系统)已表示希望使用该服务。从根本上讲,这是为另一个进程提供 API 的服务。因此,系统会知晓这些进程之间存在依赖关系,所以如果进程 A 绑定到进程 B 中的服务,系统便知道自己需使进程 B(及其服务)为进程 A 保持运行状态。此外,如果进程 A 是用户关心的内容,系统随即也知道将进程 B 视为用户关心的内容。由于存在灵活性(无论好坏),服务已成为非常有用的构建块,并且可实现各种高级系统概念。动态壁纸、通知侦听器、屏幕保护程序、输入方法、无障碍功能服务以及众多其他核心系统功能均可构建为在其运行时由应用实现、系统绑定的服务。 您需将服务作为 Service 的子类来实现。如需了解有关 Service 类的更多信息,请参阅服务开发者指南。 注意:如果您的应用面向 Android 5.0(API 级别 21)或更高版本,请使用 JobScheduler 类来调度操作。JobScheduler 的优势在于,它能通过优化作业调度来降低功耗,以及使用 Doze API,从而达到省电目的。如需了解有关使用此类的更多信息,请参阅 JobScheduler 参考文档。 广播接收器 借助广播接收器组件,系统能够在常规用户流之外向应用传递事件,从而允许应用响应系统范围内的广播通知。由于广播接收器是另一个明确定义的应用入口,因此系统甚至可以向当前未运行的应用传递广播。例如,应用可通过调度提醒来发布通知,以告知用户即将发生的事件。而且,通过将该提醒传递给应用的广播接收器,应用在提醒响起之前即无需继续运行。 许多广播均由系统发起,例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可发起广播,例如,通知其他应用某些数据已下载至设备,并且可供其使用。尽管广播接收器不会显示界面,但其可以创建状态栏通知,在发生广播事件时提醒用户。但广播接收器更常见的用途只是作为通向其他组件的通道,旨在执行极少量的工作。例如,它可能会根据带 JobScheduler 的事件调度 JobService 来执行某项工作 广播接收器作为 BroadcastReceiver 的子类实现,并且每条广播都作为 Intent 对象进行传递。如需了解详细信息,请参阅 BroadcastReceiver 类。 内容提供程序 内容提供程序管理一组共享的应用数据,您可以将这些数据存储在文件系统、SQLite 数据库、网络中或者您的应用可访问的任何其他持久化存储位置。其他应用可通过内容提供程序查询或修改数据(如果内容提供程序允许)。例如,Android 系统可提供管理用户联系人信息的内容提供程序。 因此,任何拥有适当权限的应用均可查询内容提供程序(如 ContactsContract.Data),以读取和写入特定人员的相关信息。我们很容易将内容提供程序看作数据库上的抽象,因为其内置的大量 API 和支持时常适用于这一情况。但从系统设计的角度看,二者的核心目的不同。对系统而言,内容提供程序是应用的入口点,用于发布由 URI 架构识别的已命名数据项。因此,应用可以决定如何将其包含的数据映射到 URI 命名空间,进而将这些 URI 分发给其他实体。反之,这些实体也可使用分发的 URI 来访问数据。在管理应用的过程中,系统可以执行以下特殊操作: • 分配 URI 无需应用保持运行状态,因此 URI 可在其所属的应用退出后继续保留。当系统必须从相应的 URI 检索应用数据时,系统只需确保所属应用仍处于运行状态。 • 这些 URI 还会提供重要的细粒度安全模型。例如,应用可将其所拥有图像的 URI 放到剪贴板上,但将其内容提供程序锁定,以便其他应用程序无法随意访问它。当第二个应用尝试访问剪贴板上的 URI 时,系统可允许该应用通过临时的 URI 授权来访问数据,这样便只能访问 URI 后面的数据,而非第二个应用中的其他任何内容。 内容提供程序也适用于读取和写入您的应用不共享的私有数据。 内容提供程序作为 ContentProvider 的子类实现,并且其必须实现一组标准 API,以便其他应用能够执行事务。如需了解详细信息,请参阅内容提供程序开发者指南。 Android 系统设计的独特之处在于,任何应用都可启动其他应用的组件。例如,当您想让用户使用设备相机拍摄照片时,另一个应用可能也可执行该操作,因而您的应用便可使用该应用,而非自行产生一个 Activity 来拍摄照片。您无需加入甚至链接到该相机应用的代码。只需启动拍摄照片的相机应用中的 Activity 即可。完成拍摄时,系统甚至会将照片返回您的应用,以便您使用。对用户而言,这就如同相机是您应用的一部分。 当系统启动某个组件时,它会启动该应用的进程(如果尚未运行),并实例化该组件所需的类。例如,如果您的应用启动相机应用中拍摄照片的 Activity,则该 Activity 会在属于相机应用的进程(而非您的应用进程)中运行。因此,与大多数其他系统上的应用不同,Android 应用并没有单个入口点(即没有 main() 函数)。 由于系统在单独的进程中运行每个应用,且其文件权限会限制对其他应用的访问,因此您的应用无法直接启动其他应用中的组件,但 Android 系统可以。如要启动其他应用中的组件,请向系统传递一条消息,说明启动特定组件的 Intent。系统随后便会为您启动该组件。 启动组件 在四种组件类型中,有三种(Activity、服务和广播接收器)均通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。您可以将 Intent 视为从其他组件(无论该组件是属于您的应用还是其他应用)请求操作的信使。 您需使用 Intent 对象创建 Intent,该对象通过定义消息来启动特定组件(显式 Intent)或特定的组件类型(隐式 Intent)。 对于 Activity 和服务,Intent 会定义要执行的操作(例如,查看或发送某内容),并且可指定待操作数据的 URI,以及正在启动的组件可能需要了解的信息。例如,Intent 可能会传达对 Activity 的请求,以便显示图像或打开网页。在某些情况下,您可以通过启动 Activity 来接收结果,这样 Activity 还会返回 Intent 中的结果。例如,您可以发出一个 Intent,让用户选取某位联系人并将其返回给您。返回 Intent 包含指向所选联系人的 URI。 对于广播接收器,Intent 只会定义待广播的通知。例如,指示设备电池电量不足的广播只包含指示“电池电量不足”的已知操作字符串。 与 Activity、服务和广播接收器不同,内容提供程序并非由 Intent 启动。相反,它们会在成为 ContentResolver 的请求目标时启动。内容解析程序会通过内容提供程序处理所有直接事务,因此通过提供程序执行事务的组件便无需执行事务,而是改为在 ContentResolver 对象上调用方法。这会在内容提供程序与请求信息的组件之间留出一个抽象层(以确保安全)。 每种组件都有不同的启动方法: • 如要启动 Activity,您可以向 startActivity() 或 startActivityForResult() 传递 Intent(当您想让 Activity 返回结果时),或者为其安排新任务。 • 在 Android 5.0(API 级别 21)及更高版本中,您可以使用 JobScheduler 类来调度操作。对于早期 Android 版本,您可以通过向 startService() 传递 Intent 来启动服务(或对执行中的服务下达新指令)。您也可通过向将 bindService() 传递 Intent 来绑定到该服务。 • 您可以通过向 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播。 • 您可以通过在 ContentResolver 上调用 query(),对内容提供程序执行查询。 如需了解有关 Intent 用法的详细信息,请参阅 Intent 和 Intent 过滤器文档。以下文档将为您详细介绍如何启动特定组件:Activity、服务、BroadcastReceiver 和内容提供程序。

问问小秘 2020-03-03 09:47:38 0 浏览量 回答数 0

回答

本文汇总了各类型网站的部署方式,便于您自助搭建网站。 网站类型 部署方式 说明 WordPress 云市场镜像搭建WordPress 使用ROS搭建WordPress 手动搭建WordPress(CentOS 7) 手动搭建WordPress(Windows) WordPress是一款常用的搭建个人博客网站的软件。您可以使用WordPress架设自己的网站,也可以搭建内容管理系统CMS(Content Management System)。 使用镜像或资源编排服务ROS(Resource Orchestration Service)模板部署WordPress解决了空间和程序的问题,降低了建站的门槛,即买即用。ROS通过一个JSON格式的模板文件,创建一组阿里云资源。您也可以手动搭建WordPress。 LNMP 环境 ROS模板部署 镜像部署 手动部署(CentOS6) 手动部署(CentOS7) LNMP分别代表Linux、Nginx、MySQL和PHP。使用镜像和资源编排服务ROS模板可以帮您省时省力地部署LNMP环境。如果您熟悉Linux操作系统,希望满足个性化部署的要求,您也可以选择手动部署。 Java Web环境 镜像部署 Tomcat是开源且免费的Java Web服务器,常用作Web开发工具,可以托管由Servlet、JSP 页面(动态内容)、HTML 页面、JS、Stylesheet、图片(静态内容)组成的Java Web应用程序。 适合新手,利用云市场丰富的JAVA 镜像资源快捷部署环境。 手动部署Java Web环境 如果您熟悉Linux命令,可以在ECS上个性化地部署Java web项目。 插件部署 Alibaba Cloud Toolkit for Eclipse,简称Cloud Toolkit,是一款免费的IDE插件。当您在本地完成应用程序的开发、调试及测试后,即可通过该插件轻松将应用程序部署到ECS实例。 Node.js(CentOS) 手动部署 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,用来方便、快速地搭建易于扩展的网络应用。 Node.js使用了一个事件驱动、非阻塞式I/O的模型,轻量又高效,非常适合在分布式设备运行的数据密集型实时应用。Node.js的包管理器npm,是全球最大的开源库生态系统。 Magento电子商务网站 手动部署 Magento是一款开源电商网站框架,其丰富的模块化架构体系及拓展功能可为大中型站点提供解决方案。 Web环境(Windows) 镜像部署 使用阿里云镜像,您可以在Windows操作系统中一键部署Web环境,包括安装IIS 组件(不包括FTP组件)、PHP环境、重定向Rewrite、MySQL和PHPWind。 ThinkPHP框架 镜像部署 ThinkPHP是一款免费、开源、快速、简单、面向对象的轻量级PHP开发框架,遵循Apache2开源协议,为了敏捷Web应用开发和简化企业应用开发而诞生。 PHPWind论坛 镜像部署 PHPWind是一款采用PHP+MySQL方式运行的开源社区程序,轻架构、高效率、简易开发,能够实现快速搭建并轻松管理社区站点的功能。 GitLab 镜像部署和手动部署 GitLab通过Ruby on Rails,实现自托管的Git项目仓库,可通过Web界面轻松访问公开或者私人项目。 使用AMH搭建PHP环境 镜像和手动部署 AMH是一套通过Web控制和管理服务器的Linux服务器管理系统以及虚拟主机管理系统。 Microsoft SharePoint 2016 手动部署 Microsoft SharePoint是Microsoft SharePoint Portal Server的简称。SharePoint Portal Server是一个门户站点,使得企业能够开发出智能的门户站点,该站点能够无缝连接到团队和知识,使人们能够更好地利用业务流程中的相关信息,更有效地开展工作。 Drupal内容管理框架 镜像部署 Drupal是一款采用PHP语言编写的开源内容管理框架(CMF),由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。 如果您熟悉ECS、 Linux系统,刚开始使用ECS实例建站,可以使用镜像快速搭建Drupal环境。 Docker(CentOS7) 手动部署 Docker是一个开源工具,能将一个Web应用封装在一个轻量级、便携且独立的容器里,几乎可以运行在任何服务环境下。 适用于熟悉Linux系统,刚开始使用ECS实例的开发者。 LAMP 环境 手动部署 LAMP指Linux、Apache、MySQL和PHP,是一组常用来搭建动态网站或者服务器的开源软件。它们本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。 常用数据库(Oracle、MySQL和SQL Server) 镜像和手动部署 使用阿里云镜像,您可以方便、快捷地部署Oracle、MySQL、SQL Server等常用数据库。如果您熟悉ECS和数据库,也可以手动部署数据库。 WDlinux Control Panel(WDCP) 镜像部署 WDCP(WDlinux Control Panel)是一套通过Web控制和管理服务器的Linux服务器管理系统以及虚拟主机管理系统。 RabbitMQ 手动部署 RabbitMQ是AMQP的一个开源实现,支持:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP、AJAX等多种客户端。 用于在分布式系统中存储转发消息,具有较好的易用性、扩展性和高可用性。 PostgreSQL主从架构 手动部署 阿里云版数据库PostgreSQL具有NoSQL兼容、高效查询、插件化管理、安全稳定的特性。 如果您熟悉ECS、Linux系统、PostgreSQL,可以手动部署PostgreSQL主从架构。 Subversion(SVN)版本控制系统 手动部署 SVN (Subversion)作为一个开源的版本控制系統,能管理随时间改变的数据。 Joomla基础管理平台 镜像部署 Joomla是一套知名的内容管理系统,采用PHP加MySQL的方式开发软件系统。 Ghost博客(CentOS 7) 手动部署 Ghost是一个免费的开源博客平台,使用JavaScript编写,基于Node.js,旨在简化个人博客和在线出版物的在线发布过程。此外,将来随着业务的扩展,您可以利用阿里云强大的产品平台,平滑地横向和纵向扩展服务容量。 Moodle课程管理系统 镜像部署 Moodle是一个开源课程管理系统,采用PHP加MySQL的方式运行软件,遵循GNU公共许可协议。 Moodle平台界面简单精巧,您可以根据需要随时调整界面、增减内容。 FTP站点 手动部署(Windows) 在Windows操作系统下搭建FTP服务器(File Transfer Protocol Server)以提供文件存储和访问服务。 手动部署(Linux) 在ECS实例上安装vsftpd,它是Linux下的一款小巧轻快、安全易用的FTP服务器软件。

1934890530796658 2020-03-25 19:18:47 0 浏览量 回答数 0

回答

概述 当客户端访问目标服务器出现ping丢包或ping不通时,可以通过tracert或mtr等工具进行链路测试来判断问题根源。本文介绍如何通过工具进行链路测试和分析。 详细信息 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 本文分别介绍如下链路测试方法。 链路测试工具 测试结果的简要分析 常见的链路异常场景 链路测试步骤 测试完成后的解决方法 链路测试工具 操作系统类型不同,链路测试所使用的工具也有所不同。简要介绍如下。 Linux系统 此处简单介绍两个链路测试工具。 工具一:mtr命令 mtr(My traceroute)几乎是所有Linux发行版本预装的网络测试工具。其将ping和traceroute的功能合并,所以功能更强大。mtr默认发送ICMP数据包进行链路探测。您也可以通过“-u”参数来指定使用UDP数据包进行探测。相对于traceroute只会做一次链路跟踪测试,mtr会对链路上的相关节点做持续探测并给出相应的统计信息。所以,mtr能避免节点波动对测试结果的影响,所以其测试结果更正确,建议优先使用。 用法说明 mtr [-BfhvrwctglxspQomniuT46] [--help] [--version] [--report] [--report-wide] [--report-cycles=COUNT] [--curses] [--gtk] [--csv|-C] [--raw] [--xml] [--split] [--mpls] [--no-dns] [--show-ips] [--address interface] [--filename=FILE|-F] [--ipinfo=item_no|-y item_no] [--aslookup|-z] [--psize=bytes/-s bytes] [--order fields] [--report-wide|-w] [--inet] [--inet6] [--max-ttl=NUM] [--first-ttl=NUM] [--bitpattern=NUM] [--tos=NUM] [--udp] [--tcp] [--port=PORT] [--timeout=SECONDS] [--interval=SECONDS] HOSTNAME 常见可选参数说明 --report:以报告模式显示输出。 --split:将每次追踪的结果分别列出来,而非统计整个结果。 --psize:指定ping数据包的大小。 --no-dns:不对IP地址做域名反解析。 --address:主机有多个IP地址时,设置发送数据包的IP地址。 -4:只使用IPv4协议。 -6:只使用IPv6协议。 另外,也可以在mtr运行过程中,输入类似如下的字母来快速切换模式。 ?或h:显示帮助菜单。 d:切换显示模式。 n:启用或禁用DNS域名解析。 u:切换使用ICMP或UDP数据包进行探测。 命令输出示例 返回结果说明 默认配置下,返回结果中各数据列的说明如下。 第一列(Host):节点IP地址和域名。按 n 键可切换显示。 第二列(Loss%):节点丢包率。 第三列(Snt):每秒发送数据包数。默认值是10,可以通过“-c”参数指定。 第四列(Last):最近一次的探测延迟。 第五、六、七列(Avg、Best、Worst):分别是探测延迟的平均值、最小值和最大值。 第八列(StDev):标准偏差。越大说明相应节点越不稳定。 工具二:traceroute命令 traceroute也是几乎所有Linux发行版本预装的网络测试工具,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。traceroute先发送小的具有最大存活时间值(Max_TTL)的UDP探测数据包,然后侦听从网关开始的整个链路上的ICMP TIME_EXCEEDED响应。探测从TTL=1开始,TTL值逐步增加,直至接收到ICMP PORT_UNREACHABLE消息。ICMP PORT_UNREACHABLE消息用于标识目标主机已经被定位,或命令已经达到允许跟踪的最大TTL值。traceroute默认发送UDP数据包进行链路探测。可以通过“-I”参数来指定使用ICMP数据包进行探测。 用法说明 traceroute [-I] [ -m Max_ttl ] [ -n ] [ -p Port ] [ -q Nqueries ] [ -r ] [ -s SRC_Addr ] [ -t TypeOfService ] [ -f flow ] [ -v ] [ -w WaitTime ] Host [ PacketSize ] 常见可选参数说明 -d:使用Socket层级的排错功能。 -f:设置第一个检测数据包的存活数值TTL的大小。 -F:设置不要分段标识。 -g:设置来源路由网关,最多可设置8个。 -i:主机有多个网卡时,使用指定的网卡发送数据包。 -I:使用ICMP数据包替代UDP数据包进行探测。 -m:设置检测数据包的最大存活数值TTL的大小。 -n:直接使用IP地址而非主机名称(禁用DNS反查)。 -p:设置UDP传输协议的通信端口。 -r:忽略普通的Routing Table,直接将数据包发送到目标主机上。 -s:设置本地主机发送数据包的IP地址。 -t:设置检测数据包的TOS数值。 -v:详细显示指令的执行过程。 -w:设置等待远端主机回包时间。 -x:开启或关闭数据包的正确性检验。 命令输出示例 Windows系统 此处简单介绍两个链路测试工具。 工具一:WinMTR(建议优先使用) WinMTR是mtr工具在Windows环境下的图形化实现,但进行了功能简化,只支持部分mtr的参数。WinMTR默认发送ICMP数据包进行探测,无法切换。和mtr一样,相比tracert,WinMTR能避免节点波动对测试结果的影响,所以测试结果更正确。所以在WinMTR可用的情况下,建议优先使用WinMTR进行链路测试。 用法说明 WinMTR无需安装,直接解压运行即可。操作方法非常简单,说明如下。 如下图所示,运行程序后,在 Host 字段输入目标服务器域名或IP,注意不要包含空格。 单击 Start 开始测试。开始测试后,相应按钮变成了 Stop。 运行一段时间后,单击 Stop 停止测试。 其它选项说明如下。 Copy Text to clipboard:将测试结果以文本格式复制到粘贴板。 Copy HTML to clipboard:将测试结果以HTML格式复制到粘贴板。 Export TEXT:将测试结果以文本格式导出到指定文件。 Export HTML:将测试结果以HTML格式导出到指定文件。 Options:可选参数,包括的可选参数如下。 Interval(sec):每次探测的间隔(过期)时间。默认为1秒。 ping size(bytes):ping探测所使用的数据包大小,默认为64字节。 Max hosts in LRU list:LRU列表支持的最大主机数,默认值为128。 Resolve names:通过反查IP地址,以域名显示相关节点。 返回结果说明 默认配置下,返回结果中各数据列的说明如下。 第一列(Hostname):节点的IP或域名。 第二列(Nr):节点编号。 第三列(Loss%):节点丢包率。 第四列(Sent):已发送的数据包数量。 第五列(Recv):已成功接收的数据包数量。 第六、七、八、九列(Best 、Avg、Worst、Last):分别是到相应节点延迟的最小值、平均值、最大值和最后一次值。 工具二:tracert命令行工具 tracert(Trace Route)是Windows自带的网络诊断命令行程序,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。 tracert通过向目标地址发送 ICMP 数据包来确定到目标地址的路由。在这些数据包中,tracert使用了不同的IP“生存期”,即TTL值。由于要求沿途的路由器在转发数据包前必须至少将TTL减少1,因此TTL实际上相当于一个跃点计数器(hop counter)。当某个数据包的TTL达到0时,相应节点就会向源计算机发送一个ICMP超时的消息。 tracert第一次发送TTL为1的数据包,并在每次后续传输时将TTL增加1,直到目标地址响应或达到TTL的最大值。中间路由器发送回来的ICMP超时消息中包含了相应节点的信息。 用法说明 tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name 常见可选参数说明 -d:不要将地址解析为主机名(禁用DNS反解)。 -h:maximum_hops,指定搜索目标地址时的最大跃点数。 -j: host-list,指定沿主机列表的松散源路由。 -w:timeout,等待每个回复的超时时间(以毫秒为单位)。 -R:跟踪往返行程路径(仅适用于IPv6)。 -S:srcaddr,要使用的源地址(仅适用于IPv6)。 -4:强制使用IPv4。 -6:强制使用IPv6。 target_host:目标主机域名或IP地址。 命令输出示例 C:> tracert -d 223.5.5.5 通过最多 30 个跃点跟踪到 223.5.5.5 的路由 1 请求超时。 2 9 ms 3 ms 12 ms 192.168.X.X 3 4 ms 9 ms 2 ms X.X.X.X 4 9 ms 2 ms 1 ms XX.XX.XX.XX 5 11 ms 211.XX.X.XX 6 3 ms 2 ms 2 ms 2XX.XX.1XX.XX 7 2 ms 2 ms 1 ms 42.XX.2XX.1XX 8 32 ms 4 ms 3 ms 42.XX.2XX.2XX 9 请求超时。 10 3 ms 2 ms 2 ms 223.5.5.5 跟踪完成。 测试结果的简要分析 由于mtr(WinMTR)有更高的准确性,本文以其测试结果为例,参考如下要点进行分析。此处分析时以如下示例图为基础。 要点一:网络区域 正常情况下,从客户端到目标服务器的整个链路中会包含如下区域。 客户端本地网络,即本地局域网和本地网络提供商网络。如上图中的区域A。如果该区域出现异常,并且是客户端本地网络中的节点出现异常,则需要对本地网络进行相应的排查分析。如果是本地网络提供商网络出现异常,则需要向当地运营商反馈问题。 运营商骨干网络。如上图中的区域B。如果该区域出现异常,可以根据异常节点的IP查询其所属的运营商,直接向对应运营商进行反馈,或者通过阿里云技术支持,向运营商进行反馈。 目标服务器本地网络,即目标服务器所属提供商的网络。如上图中的区域C。如果该区域出现异常,需要向目标服务器所属的网络运营商反馈问题。 要点二:链路负载均衡 如上图中的区域D。如果中间链路某些部分启用了链路负载均衡,则mtr只会对首尾节点进行编号和探测统计。中间节点只会显示相应的IP或域名信息。 要点三:结合Avg(平均值)和StDev(标准偏差)综合判断 由于链路抖动或其它因素的影响,节点的Best和Worst值可能相差很大。Avg统计了自链路测试以来所有探测的平均值,所以能更好的反应出相应节点的网络质量。而StDev越高,则说明数据包在相应节点的延时值越不相同,即越离散。所以标准偏差值可用于协助判断Avg是否真实反应了相应节点的网络质量。例如,如果标准偏差很大,说明数据包的延迟是不确定的。可能某些数据包延迟很小,例如25ms,而另一些延迟却很大,例如350ms,但最终得到的平均延迟反而可能是正常的。所以,此时Avg并不能很好的反应出实际的网络质量情况。 综上,建议的分析标准如下。 如果StDev很高,则同步观察相应节点的Best和Worst,来判断相应节点是否存在异常。 如果StDev不高,则通过Avg来判断相应节点是否存在异常。 注:上述StDev高或者不高,并没有具体的时间范围标准。而需要根据同一节点其它列的延迟值大小来进行相对评估。比如,如果Avg为30ms,那么,当StDev为25ms,则认为是很高的偏差。而如果Avg为325ms,则StDev同样为25ms,反而认为是不高的偏差。 要点四:Loss%(丢包率)的判断 任一节点的Loss%(丢包率)如果不为零,则说明这一跳网络可能存在问题。导致相应节点丢包的原因通常有如下两种。 运营商基于安全或性能需求,限制了节点的ICMP发送速率,导致丢包。 节点确实存在异常,导致丢包。 结合异常节点及其后续节点的丢包情况,并参考如下内容,判定丢包原因。 如果随后节点均没有丢包,则通常表示异常节点丢包是由于运营商策略限制所致。可以忽略相关丢包。如上图中的第2跳所示。 如果随后节点也出现丢包,则通常说明异常节点确实存在网络异常,导致丢包。如上图中的第5跳所示。 另外,上述两种情况可能同时发生,即相应节点既存在策略限速,又存在网络异常。对于这种情况,如果异常节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳的丢包率为准。如上图所示,在第 5、6、7跳均出现了丢包。所以,最终丢包情况,以第7跳的40%作为参考。 要点五:关于延迟 关于延迟,有如下两种场景。 场景一:延迟跳变 如果在某一跳之后延迟明显陡增,则通常判断该节点存在网络异常。如上图所示,从第5跳之后的后续节点延迟明显陡增,则推断是第5跳节点出现了网络异常。不过,高延迟并不一定完全意味着相应节点存在异常。如上图所示,第5跳之后,虽然后续节点延迟明显陡增,但测试数据最终仍然正常到达了目的主机。所以,延迟大也有可能是在数据回包链路中引发的。所以,需要结合反向链路测试一并分析。 场景二:ICMP限速导致延迟增加 ICMP策略限速也可能会导致相应节点的延迟陡增,但后续节点通常会恢复正常。如上图所示,第3跳有100%的丢包率,同时延迟也明显陡增。但随后节点的延迟马上恢复了正常。所以判断该节点的延迟陡增及丢包是由于策略限速所致。 常见的链路异常场景 常见的链路异常场景及测试报告如下。 场景一:目标主机网络配置不当 示例数据如下。 [root@mycentos6 ~]# mtr —no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. ??? 2. ??? 3. 1XX.X.X.X 0.0% 10 521.3 90.1 2.7 521.3 211.3 4. 11X.X.X.X 0.0% 10 2.9 4.7 1.6 10.6 3.9 5. 2X.X.X.X 80.0% 10 3.0 3.0 3.0 3.0 0.0 6. 2X.XX.XX.XX 0.0% 10 1.7 7.2 1.6 34.9 13.6 7. 1XX.1XX.XX.X 0.0% 10 5.2 5.2 5.1 5.2 0.0 8. 2XX.XX.XX.XX 0.0% 10 5.3 5.2 5.1 5.3 0.1 9. 173.194.200.105 100.0% 10 0.0 0.0 0.0 0.0 0.0 在该示例中,数据包在目标地址出现了100%的丢包。从数据上看是数据包没有到达,其实很有可能是目标服务器相关安全策略(比如防火墙、iptables 等)禁用了ICMP所致,导致目的主机无法发送任何应答。所以,该场景需要排查目标服务器的安全策略配置。 场景二:ICMP限速 示例数据如下。 [root@mycentos6 ~]# mtr --no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 63.247.X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.X.XX 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 60.0% 10 27.2 25.3 23.1 26.4 2.9 6. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2 在该示例中,在第5跳出现了明显的丢包,但后续节点均未见异常。所以推断是该节点ICMP限速所致。该场景对最终客户端到目标服务器的数据传输不会有影响,所以,分析的时候可以忽略。 场景三:环路 示例数据如下。 [root@mycentos6 ~]# mtr —no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 63.247.7X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.6X.X 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. 72.14.233.57 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. 72.14.233.56 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. 72.14.233.57 0.0% 10 0.0 0.0 0.0 0.0 0.0 9 ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 在该示例中,数据包在第5跳之后出现了循环跳转,导致最终无法到达目标服务器。这通常是由于运营商相关节点路由配置异常所致。所以,该场景需要联系相应节点归属运营商处理。 场景四:链路中断 示例数据如下。 [root@mycentos6 ~]# mtr —no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 63.247.7X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.6X.X 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 9 ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 在该示例中,数据包在第4跳之后就无法收到任何反馈。这通常是由于相应节点中断所致。建议结合反向链路测试做进一步确认。该场景需要联系相应节点归属运营商处理。 链路测试步骤 通常情况下,链路测试步骤如下图所示。 相关步骤的详情说明如下。 步骤一:获取本地网络对应的公网IP 在客户端本地网络内访问淘宝IP地址库,获取本地网络对应的公网IP地址。 步骤二:正向链路测试(ping和mtr) 从客户端向目标服务器做如下测试。 从客户端向目标服务器域名或IP做持续的ping测试,建议至少ping 100个数据包,记录测试结果。 根据客户端操作系统的不同,使用WinMTR或mtr,设置测试目的地址为目标服务器域名或IP,然后进行链路测试,记录测试结果。 步骤三:反向链路测试(ping和mtr) 进入目标服务器系统内部做如下测试。 从目标服务器向步骤一获取的客户端IP做持续的ping测试,建议至少ping 100个数据包,记录测试结果。 根据目标服务器操作系统的不同,使用WinMTR或mtr,设置测试目的地址为客户端的IP地址,然后进行链路测试,记录测试结果。 步骤四:测试结果分析 参阅测试结果的简要分析,对测试结果进行分析。确认异常节点后,访问如下链接或其他可以查询IP归属地的网站,获取该异常节点的归属运营商信息。如果是客户端本地网络相关节点出现异常,则需要对本地网络进行相应排查分析。如果是运营商相关节点出现异常,则需要向运营商反馈问题。查询结果类似如下。 测试完成后的解决方法 当出现ping丢包或ping不通时,首先请参考云服务器ECS网络故障诊断,排查是否为网络故障。 如果确认是因系统中病毒导致使用ping命令测试ECS实例的IP地址间歇性丢包,则可参考使用ping命令测试ECS实例的IP地址间歇性丢包进行处理。 如果是因删除ECS实例的默认安全组规则导致无法ping通ECS实例,可参考删除ECS实例的默认安全组规则导致无法ping通ECS实例进行处理。 如果在Linux系统内核没有禁PING的情况下,是因系统内部防火墙策略设置导致ECS服务器PING不通。可参考Linux系统的ECS中没有禁PING却PING不通的解决方法。

1934890530796658 2020-03-25 23:17:54 0 浏览量 回答数 0

回答

Beego https://beego.me/ Beego 框架提供了很多标准附加功能,例如全功能路由器和可用于执行 CRUD 操作的对象到数据库映射工具。Bee 是 Beego 爱好者的最爱,它是一个快速而强大的命令行工具,用于构建、更新、打包和部署应用程序。Bee 可以从模板生成源代码,并保持数据库的最新状态。 Buffalo https://gobuffalo.io/en Buffalo 团队需要能够将 Web 应用程序的所有部分组装在一起的东西,包括应用程序本身的一些设计。他们把能够安装在一起的很多部件叫作“生态系统”。如果你想要路由——很少有人不需要——Buffalo 就包含了 Gorilla/Mux。如果你需要模板,Buffalo 倾向于使用 Plush,而不是使用内置的 Go 语言模板机制。数据库连接模块集合 Pop 可以帮你将数据库信息转换为 Go 对象。你还可以找到连接数据库、处理 cookie 以及完成其他任务的标准方法。 Cobra https://github.com/spf13/cobra 有时候,你只需要一个命令行界面。Cobra 提供了 CLI 的所有标准功能,因此你不必浪费时间实现代码来查找 -h 或 -help 标志。如果你的微服务需要对具有大量标志和其他功能的命令行调用做出响应,那么可以考虑集成 Cobra。 Docker 你当然可以在办公室服务器小黑屋里的裸机上运行微服务,但越来越多的人将他们的代码捆绑在 Docker 容器中,并将容器发到云端。小型的包更容易处理大量不同的代码块,当你对微服务架构的愿景要求你创建很多小的独立代码块时,这将是一项有价值的服务。 值得一提的是,Docker 是用 Go 语言开发的,尽管在部署 Docker 容器时你可能永远不会想到这一点。Docker 社区版是开源的,所以如果有必要,你可以参与其中,但很可能你只是将 Docker 作为部署微服务的工具。Go 语言爱好者之所以想要记住 Docker 是用 Go 语言开发的这一事实,是因为无处不在的 Docker 有力地证明了他们对这门语言的支持。 Echo https://echo.labstack.com/ Echo 是一个极简框架,但它提供了很多最重要的组件。路由器可以将 URL 拆解,然后将拆解的各个部份转换为参数,因此你无需自行解析它们。然后,你可以混合使用身份验证、表单解析、压缩和合理性限制。你可以专注于从函数中返回正确的信息。 Errors https://github.com/juju/errors 有时候,API 的用户会传递错误的参数。你可以自己处理这些参数,也可以把它们创给 Errors,这是一个可以自动执行大部分跟踪的库,方便进行调试。当发生错误时,Errors 会使用注释来详细说明出错的地方和位置。 Gin https://github.com/gin-gonic/gin Gin 是 Martini( https://github.com/go-martini/martini )的下一代框架。可以说,Gin 抛弃了那些额外的东西,专注于提供最有用的部分。花费大量时间构建 Node.js 微服务的开发人员会感到宾至如归。你可以实例化一个对象,然后附加函数来处理特定的调用,这样就可以创建一个微服务。Gin 负责处理路由,而你的函数处理业务逻辑。如果不去考虑标点符号,它的代码甚至看起来有点像 Node.js 代码。 Ginkgo https://onsi.github.io/ginkgo/ 测试可能是微服务开发当中最具挑战性的事情。Ginkgo 通过行为驱动测试扩展了标准 Go 发行版的内置测试机制。Ginkgo 提供了一种高级机制,用于指定函数或服务应该产生哪些结果。结果通常使用 Ginkgo 提供的 Gomega 匹配器( http://onsi.github.io/gomega/ )进行评估,但如果你愿意,也可以使用不同的匹配器库。 Ginkgo 是一个全面的框架,提供了各种选项,用于设置测试数据、运行测试以及在事后释放测试数据。你只需要描述结果,然后让 Ginkgo 处理其他的事情。 Goa https://github.com/goadesign/goa 如果你是一个曾经使用 Ruby 和 Praxis 框架的开发人员,或者是一个欣赏设计语言的强大力量人,那么你会在 Goa 中找到很多你喜欢的东西。你本身不需要编写 Go 代码。你使用 Goa DSL 为 API 编写设计规范,然后 Goa 将其转换为可执行的 Go 代码。DSL 针对微服务 API 进行了优化,并强制你的设计遵循标准的架构。 Gorilla http://www.gorillatoolkit.org/ Gorilla 项目提供了一系列你需要的模块。Gorilla 的 Mux( http://www.gorillatoolkit.org/pkg/mux )路由器被很多其他框架使用,因为它太好用了。很多用户之所以使用 Gorilla,是因为 websocket( http://www.gorillatoolkit.org/pkg/websocket )。 Gotify https://github.com/gotify/server 同步一组微服务所面临的一个挑战是建立有效的消息传递节点。Gotify 是一个简单的服务器,用于发送和接收消息,将你的微服务集合与持续存储的消息组合在一起。最有用的部分可能是它的 Web 接口,可帮助开发者应对最令人头疼的调试问题。 Hugo https://github.com/gohugoio/hugo Hugo 是一种静态站点生成器,可以用这个框架构建的微服务并不多,但如果网站只有有限的重复查询答案时,这是一个值得考虑的选项。Hugo 一次生成答案,然后可以重复使用。如果你已经已 HTML 格式提供答案,那么 Hugo 会非常有用。 Kite https://github.com/koding/kite 如果你希望建立一个更加可控的服务群体,而不是通常的服务之间的互动,那么可以考虑一下 Kite。Kite 的目标是让微服务之间的通信协调变得更简单一些。来自 Kite 以外的 API 调用通过 websocket 进入,然后 Kite 使用更快、更低级别的套接字连接(基于 dnode)传递新消息。中间有一个叫作 Kontrol 的服务注册表和身份验证服务。如果你需要经常交换消息和协调很多的操作,那么在不同服务器之间添加这一层会让一切变得更快。 Logrus https://github.com/sirupsen/logrus 要跟踪 API 的流入和流出数据和可能产生的错误,通常需要将日志写入文件中。这个过程可以很简单,比如在一个打开的文件中写入一行行的数据,但通常使用完整的日志框架会更好。Logrus 提供了格式化程序来标准化你的日志输出,并让后续的自动化日志文件分析变得更容易。不要尝试自己开发日志代码,使用像 Logrus 这样的库会事半功倍。 Nano https://github.com/pasztorpisti/nano 构建一个微服务并不需要太多东西,Nano 就是一个极简主义的例子。它的实际代码不会超过 200 行,如果算上注释也只有 400 多行。你只需要几行代码就可以构建一个微服务——只包含处理请求所需的业务逻辑。这个框架还有一些其他不错的特性,例如与语言无关的 API 结构,这样你的 Go 代码就可以与使用其他语言开发的服务发生交互。它还提供了一个测试过程来,可以嵌入你的本地测试例程。简简单单,但却恰到好处。 Negroni https://github.com/urfave/negroni 有些人看完 Martini 后,决定走一条更简单的道路。他们剥离了路由器和其他一些东西,创建了 Negroni,这是一个非常小型的工具,除了处理标准文件、自定义请求、从基本错误中恢复以及保留日志之外,它不会做更多的工作。如果你想要额外的东西,可以自己加入。Negroni 团队也提供了一系列与可以与 Negroni 一起使用的小型项目。 Renderer https://github.com/thedevsaddam/renderer 在准备输出响应时,你需要获取数据并将其插入到模板中。Renderer 提供了各种输出格式(JSON、JSONP、XML、YAML、HTML、文件)和一个漂亮、快速和标准的模板引擎。 Revel https://revel.github.io/ Revel 借鉴了 Webpack 的一个简洁的特性,这让 Revel 看起来就像一个 IDE 一样,或者至少是 IDE 的一部分,每当你对代码做出更改,它会持续地重新构建你的项目。当你保存修改后,Revel 会检测到更改,然后就编译代码,如果没有编译错误,就启动应用程序。因此,Revel 服务器会自动部署修改的码——在桌面上进行开发时这项功能非常好用,或许对于生产环境代码部署来说也是有点诱人的。 这个框架本身功能齐全,它提供了模板、缓存、验证和过滤器。如果你正在构建很多微服务,它还提供了一个模块系统,让你可以在项目之间共享一些 MVC 组件。 Testify https://github.com/stretchr/testify 使用断言的最简单方法之一是使用 Testify,它是一个 Go 语言项目,还提供了模拟工具,用于快速测试大型微服务的各个部分。只需要几行代码就编写一些基本测试用例。 Tollbooth https://github.com/didip/tollbooth 在你发布 API 之后,当然希望来自世界各个角落的人都可以调用它。但当你的服务器发生熔断,或者你看一看为了获得弹性而为云托管账户支付的费用时,你可能会改变主意。Tollbooth 是一个用于限制传入请求的轻量级系统。限制前门的流量就等于减少了对管道中微服务或数据库的需求,让一切保持运行顺畅。 不使用框架 你只需从头开始编写 Go 代码,不需要导入任何依赖项或者实例化任何控制对象。使用 Go 语言创建微服务其实很容易,因为它已经内置了很多基本代码。这就是为什么只用几百行代码就可以构建出像 Nano 这样的框架。 监听套接字、解压缩 HTTP 请求等工作都是通过标准库完成的。虽然框架提供了一些额外的功能,但很多时候如果你需要一个非常基本的微服务,就不需要用到框架。太多的“附加功能”可能反而会妨碍你,而且 Go 开发人员可能会说,太多的依赖反而让 Go 语言变得更复杂。

有只黑白猫 2020-01-08 11:53:57 0 浏览量 回答数 0

问题

一小时入门阿里云IoT套件

三野 2019-12-01 21:12:51 27447 浏览量 回答数 11

回答

1.可以尝试通过“管理终端”登录操作:https://help.aliyun.com/document_detail/25433.html 2.使用ping看网站连接情况: 关于ping 这是我在百度上查到的: 一、什么是PING[编辑本段]是DOS命令,一般用于检测网络通与不通 ,也叫时延,其值越大,速度越慢PING (Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。 它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。Ping 是Windows系列自带的一个可执行命令。利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障。应用格式:Ping IP地址。该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。ping指的是端对端连通,通常用来作为可用性的检查, 但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。 严禁ping入侵作为大多数防火墙的一个基本功能提供给用户进行选择。 二、PING测试,通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑 1.Ping本机IP例如本机IP地址为:172.168.200.2。则执行命令Ping 172.168.200.2。如果网卡安装配置没有问题,则应有类似下列显示:Replay from 172.168.200.2 bytes=32 time<10msPing statistics for 172.168.200.2Packets Sent=4 Received=4 Lost=0 0% lossApproximate round trip times in milli-secondsMinimum=0ms Maxiumu=1ms Average=0ms如果在MS-DOS方式下执行此命令显示内容为:Request timed out,则表明网卡安装或配置有问题。将网线断开再次执行此命令,如果显示正常,则说明本机使用的IP地址可能与另一台正在使用的机器IP地址重复了。如果仍然不正常,则表明本机网卡安装或配置有问题,需继续检查相关网络配置。 2.Ping网关IP假定网关IP为:172.168.6.1,则执行命令Ping 172.168.6.1。在MS-DOS方式下执行此命令,如果显示类似以下信息:Reply from 172.168.6.1 bytes=32 time=9ms TTL=255Ping statistics for 172.168.6.1 Packets Sent=4 Received=4 Lost=0 Approximate round trip times in milli-secondsMinimum=1ms Maximum=9ms Average=5ms则表明局域网中的网关路由器正在正常运行。反之,则说明网关有问题。 3.Ping远程IP这一命令可以检测本机能否正常访问Internet。比如本地电信运营商的IP地址为:202.102.48.141。在MS-DOS方式下执行命令:Ping 202.102.48.141,如果屏幕显示:Reply from 202.102.48.141 bytes=32 time=33ms TTL=252Reply from 202.102.48.141 bytes=32 time=21ms TTL=252Reply from 202.102.48.141 bytes=32 time=5ms TTL=252Reply from 202.102.48.141 bytes=32 time=6ms TTL=252Ping statistics for 202.102.48.141 Packets Sent=4 Received=4 Lost=0 0% lossApproximate round trip times in milli-secondsMinimum=5ms Maximum=33ms Average=16ms则表明运行正常,能够正常接入互联网。反之,则表明主机文件(windows/host)存在问题。 3.如还有疑问,请联系客服 到阿里云会员中心提交工单,让售后帮你检查看看。 或点击右侧的浮标:联系我们 提交工单的地址:https://workorder.console.aliyun.com/#/ticket/createIndex 更多阿里云帮助文档 https://help.aliyun.com 希望对您有帮助!

阿里朵 2019-12-02 02:19:08 0 浏览量 回答数 0

回答

作者:九章算法 链接:https://www.zhihu.com/question/22744854/answer/763206431 来源:知乎 首先,这个神仙项目请你pick: https://github.com/sindresorhus/awesome 各领域各语言资源大合集 另外,可以关注GitHub的每日榜单,看看大家都在关注些什么(虽然有国外小哥吐槽榜单上都是中文哈哈 https://github.com/trending/python?since=daily 推荐不同语言的几个项目: Python : youtube-dl这个程序是一个开源的python项目。支持MacOS、Linux和Windows平台,可以在官网直接下载编译好的程序。可以用来下载YouTube视频,国内的一些视频站也可以进行下载。 interview_internal_reference: 总结了2019年最新的阿里,腾讯,百度,美团,头条等技术面试题目以及答案,分析汇总。 sherlock: 高级机器视觉软件,可以用于广泛的自动化检测应用。它提供了最大的设计灵活性,丰富的已验证的工具和功能。 DeepFaceLab: 这是一个github上的开源项目,所有人都可以查看源代码也能免费使用。个人认为这个项目的最大优点就是安装超级简单,几乎是无需安装,使用过程也不复杂 Manim: 解释数学视频的动画引擎。可以用来创建精确的2D动画。 XSStrike:XSStrike是一个Cross Site Scripting检测套件,配备四个手写解析器,一个智能有效载荷生成器,一个强大的模糊引擎和一个非常快速的爬虫。 XSStrike不是像其他工具一样注入有效载荷并检查它的工作原理,而是通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效载荷。 f="https://github.com/wangshub">Douyin -Bot:抖音机器人。是用于机器人算法的Python代码。教你如何在抖音上找到漂亮小姐姐~~ Photon:快速抓取工具,可以提取网址,电子邮件,文件,网站帐户等等。 google-images-download:可以实现搜索和下载数百个Google图像的Python脚本到本地。 faceswap是个基于dlib的换脸程序。模型训练速度较快,同样配置下更快的到达低loss值,而且有gui界面版本。 you-getyou-get 是py上一个方便的下载工具。这个爬虫神器能爬取视频网站和图片网站,你不用写任何代码就能很容易的把你喜欢的视频或者图片甚至音频文件给扒下来。而且支持腾讯、搜狐、新浪、B站、央视网、芒果TV,乐视网、优酷、熊猫斗鱼等等大多数的国内主流视频网站。 Java: advanced-java: Java工程师进阶知识扫盲,适合系统学习。 vhr:一个前后端分离的人力资源管理系统,采用SpringBoot+Vue开发。这个项目的权限管理模块已经开发完成,其他模块还在开发当中。可以管理角色和资源的关系,管理用户和角色的关系。 cat:作为服务端项目基础组件,cat提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。 jeecg-boot:一款基于代码生成器的JAVA快速开发平台!全新架构前后端分离:SpringBoot 2.x,Ant Design&Vue,Mybatis,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码,绝对是全栈开发的福音!! interviews:软件工程技术面试个人指南。可以这里找到针对很多面试问题的视频解决方案以及详细说明。 p3c:是阿里巴巴p3c项目组进行研发。根据《阿里巴巴Java开发规范》转化而成的自动化插件,并且实现了部分自动编程。 SpringAll:包括了Spring Boot,Spring Boot&Shiro,Spring Cloud,Spring Boot&Spring Security&Spring Security OAuth2等系列教程。toBeTopJavaer:Java工程师成神之路。总结的很好,直接理解学习就完了。 JavaScript: quasar:Quasar Framework是MIT许可的开源项目。能在记录时间内构建高性能VueJS用户界面 Daily-Interview-Question:前端大厂面试题汇总 next.js:一个基于React的一个服务端渲染简约框架。它使用React语法,可以很好的实现代码的模块化,有利于代码的开发和维护。 javascript-algorithms:这个存储库包含许多流行算法和数据结构的基于JavaScript的示例。每个算法和数据结构都有自己独立的自述文件,包含相关说明和链接,供进一步阅读 baidu-netdisk-downloaderx:一款图形界面的百度网盘不限速下载器,支持Windows,Linux和Mac。重点在不限速! 其他好玩的项目~ ChineseBQB:国内表情包大集合~~ komeiji-satori/Dress:女装大佬项目,一张图你就懂了 chinese-poetry最全的中文诗歌古典文集数据库.包含5.5万首唐诗、26万首宋诗和2.1万首宋词。唐宋两朝近1.4万古诗人, 和两宋时期1千多位词人 thefuck该项目的主要作用是,在terminal 里输错命令之后无需修改,fuck 一下,自动帮你更正命令,既解气又实用。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 阿里云开发者社区

茶什i 2020-01-08 10:37:26 0 浏览量 回答数 0

问题

【精品问答】大数据计算技术1000问

问问小秘 2019-12-01 21:57:13 6895 浏览量 回答数 2

问题

【精品问答】130+大数据面试汇总

问问小秘 2019-12-01 21:52:42 1644 浏览量 回答数 2

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:02 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:02 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。

2019-12-01 23:14:01 0 浏览量 回答数 0

回答

安装SDK 以 1.4.12 版本为例,步骤如下: 1.下载Java示例代码VODUploadDemo-java-1.4.12.zip开发包(包含示例代码和所需jar包), 见 视频上传SDK下载 ; 2.将解压后lib目录下的所有jar文件拷贝至您的项目中; 3.SDK依赖的jar包版本说明 注意:以下列举出部分依赖jar包的版本,您可直接在您的项目中添加maven依赖,也可以将VODUploadDemo-java-1.4.12.zip包中的所有jar包引入您的项目中使用。其中,aliyun-java-vod-upload-1.4.12.jar 还未正式开源,请您直接引入jar包至您的项目中使用。 <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.3.3</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-vod</artifactId> <version>2.15.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20170516</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> 4.使用IDE开发时引用jar包的方法,以Eclipse和IntelliJ IDEA为例说明如下: 4.1 在Eclipse中选择您的工程,右击 -> Properties -> Java Build Path -> Add JARs; 4.2 在IntelliJ IDEA中打开您的工程,File -> Project Structure -> Modules -> 右侧Dependencies -> + -> JARs or directories 5.选中您在第一步拷贝的所有jar文件; 经过以上几步,您就可以在Eclipse或IntelliJ IDEA项目中使用VODUpload Java SDK。 3. 示例代码 上传SDK示例 将VODUploadDemo-java-1.4.12.zip开发包解压后, 在sample目录下的UploadVideoDemo.java为文件上传示例程序, 如下: public class UploadVideoDemo { //账号AK信息请填写(必选) private static final String accessKeyId = ""; //账号AK信息请填写(必选) private static final String accessKeySecret = ""; public static void main(String[] args) { //1.音视频上传-本地文件上传 //视频标题(必选) String title = "测试标题"; //本地文件上传和文件流上传时,文件名称为上传文件绝对路径,如:/User/sample/文件名称.mp4 (必选) //文件名必须包含扩展名 String fileName = "测试文件名称.mp4"; //本地文件上传 testUploadVideo(accessKeyId, accessKeySecret, title, fileName); //2.图片上传-本地文件上传 testUploadImageLocalFile(accessKeyId, accessKeySecret); } /** * 本地文件上传接口 * * @param accessKeyId * @param accessKeySecret * @param title * @param fileName */ private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) { UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName); /* 可指定分片上传时每个分片的大小,默认为1M字节 */ request.setPartSize(1 * 1024 * 1024L); /* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/ request.setTaskNum(1); /* 是否开启断点续传, 默认断点续传功能关闭。当网络不稳定或者程序崩溃时,再次发起相同上传请求,可以继续未完成的上传任务,适用于超时3000秒仍不能上传完成的大文件。 注意: 断点续传开启后,会在上传过程中将上传位置写入本地磁盘文件,影响文件上传速度,请您根据实际情况选择是否开启*/ request.setEnableCheckpoint(false); /* OSS慢请求日志打印超时时间,是指每个分片上传时间超过该阈值时会打印debug日志,如果想屏蔽此日志,请调整该阈值。单位: 毫秒,默认为300000毫秒*/ //request.setSlowRequestsThreshold(300000L); /* 可指定每个分片慢请求时打印日志的时间阈值,默认为300s*/ //request.setSlowRequestsThreshold(300000L); /* 是否使用默认水印(可选),指定模板组ID时,根据模板组配置确定是否使用默认水印*/ //request.setIsShowWaterMark(true); /* 自定义消息回调设置(可选),参数说明参考文档 https://help.aliyun.com/document_detail/86952.html#UserData */ // request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}"); /* 视频分类ID(可选) */ //request.setCateId(0); /* 视频标签,多个用逗号分隔(可选) */ //request.setTags("标签1,标签2"); /* 视频描述(可选) */ //request.setDescription("视频描述"); /* 封面图片(可选) */ //request.setCoverURL("http://cover.sample.com/sample.jpg"); /* 模板组ID(可选) */ //request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56a33d"); /* 存储区域(可选) */ //request.setStorageLocation("in-201703232118266-5sejdln9o.oss-cn-shanghai.aliyuncs.com"); /* 开启默认上传进度回调 */ // request.setPrintProgress(true); /* 设置自定义上传进度回调 (必须继承 ProgressListener) */ // request.setProgressListener(new PutObjectProgressListener()); UploadVideoImpl uploader = new UploadVideoImpl(); UploadVideoResponse response = uploader.uploadVideo(request); System.out.print("RequestId=" + response.getRequestId() + "\n"); //请求视频点播服务的请求ID if (response.isSuccess()) { System.out.print("VideoId=" + response.getVideoId() + "\n"); } else { /* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */ System.out.print("VideoId=" + response.getVideoId() + "\n"); System.out.print("ErrorCode=" + response.getCode() + "\n"); System.out.print("ErrorMessage=" + response.getMessage() + "\n"); } } /** * 图片上传接口,本地文件上传示例 * 参数参考文档 https://help.aliyun.com/document_detail/55619.html * * @param accessKeyId * @param accessKeySecret */ private static void testUploadImageLocalFile(String accessKeyId, String accessKeySecret) { // 图片类型(必选)取值范围:default(默认),cover(封面),watermark(水印) String imageType = "cover"; UploadImageRequest request = new UploadImageRequest(accessKeyId, accessKeySecret, imageType); /* 图片文件扩展名(可选)取值范围:png,jpg,jpeg */ //request.setImageExt("png"); /* 图片标题(可选)长度不超过128个字节,UTF8编码 */ //request.setTitle("图片标题"); /* 图片标签(可选)单个标签不超过32字节,最多不超过16个标签,多个用逗号分隔,UTF8编码 */ //request.setTags("标签1,标签2"); /* 存储区域(可选)*/ //request.setStorageLocation("out-4f3952f78c0211e8b3020013e7.oss-cn-shanghai.aliyuncs.com"); /* 流式上传时,InputStream为必选,fileName为源文件名称,如:文件名称.png(可选)*/ //request.setFileName("测试文件名称.png"); /* 开启默认上传进度回调 */ // request.setPrintProgress(true); /* 设置自定义上传进度回调 (必须继承 ProgressListener) */ // request.setProgressListener(new PutObjectProgressListener()); UploadImageImpl uploadImage = new UploadImageImpl(); UploadImageResponse response = uploadImage.upload(request); System.out.print("RequestId=" + response.getRequestId() + "\n"); if (response.isSuccess()) { System.out.print("ImageId=" + response.getImageId() + "\n"); System.out.print("ImageURL=" + response.getImageURL() + "\n"); } else { System.out.print("ErrorCode=" + response.getCode() + "\n"); System.out.print("ErrorMessage=" + response.getMessage() + "\n"); } } } 上传进度条示例 将VODUploadDemo-java-1.4.12.zip开发包解压后, 在sample目录下的PutObjectProgressListener.java为上传进度回调函数示例程序,该类必须继承VoDProgressListener类。其中,ProgressEvent是通过OSS上传文件时产生的进度回调通知,您可自定义各个事件通知的业务处理逻辑,示例代码如下: import com.aliyun.oss.event.ProgressEvent; import com.aliyun.oss.event.ProgressEventType; /** * 上传进度回调方法类 * 当您开启上传进度回调时该事件回调才会生效。 * OSS分片上传成功或失败均触发相应的回调事件,您可根据业务逻辑处理相应的事件回调。 * 当创建音视频信息成功后,此上传进度回调中的videoId为本次上传生成的视频ID,您可以根据视频ID进行音视频管理。 * 当创建图片信息成功后,此上传进度回调中的ImageId为本次上传生成的图片ID,您可以根据视频ID进行图片管理。 */ public class PutObjectProgressListener implements VoDProgressListener { /** * 已成功上传至OSS的字节数 */ private long bytesWritten = 0; /** * 原始文件的总字节数 */ private long totalBytes = -1; /** * 本次上传成功标记 */ private boolean succeed = false; /** * 视频ID */ private String videoId; /** * 图片ID */ private String imageId; public void progressChanged(ProgressEvent progressEvent) { long bytes = progressEvent.getBytes(); ProgressEventType eventType = progressEvent.getEventType(); switch (eventType) { // 开始上传事件 case TRANSFER_STARTED_EVENT: if (videoId != null) { System.out.println("Start to upload videoId " + videoId + "......"); } if (imageId != null) { System.out.println("Start to upload imageId " + imageId + "......"); } break; // 计算待上传文件总大小事件通知,只有调用本地文件方式上传时支持该事件 case REQUEST_CONTENT_LENGTH_EVENT: this.totalBytes = bytes; System.out.println(this.totalBytes + "bytes in total will be uploaded to OSS."); break; // 已经上传成功文件大小事件通知 case REQUEST_BYTE_TRANSFER_EVENT: this.bytesWritten += bytes; if (this.totalBytes != -1) { int percent = (int) (this.bytesWritten * 100.0 / this.totalBytes); System.out.println(bytes + " bytes have been written at this time, upload progress: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")"); } else { System.out.println(bytes + " bytes have been written at this time, upload sub total : " + "(" + this.bytesWritten + ")"); } break; // 文件全部上传成功事件通知 case TRANSFER_COMPLETED_EVENT: this.succeed = true; if (videoId != null) { System.out.println("Succeed to upload videoId " + videoId + " , " + this.bytesWritten + " bytes have been transferred in total."); } if (imageId != null) { System.out.println("Succeed to upload imageId " + imageId + " , " + this.bytesWritten + " bytes have been transferred in total."); } break; // 文件上传失败事件通知 case TRANSFER_FAILED_EVENT: if (videoId != null) { System.out.println("Failed to upload videoId " + videoId + " , " + this.bytesWritten + " bytes have been transferred."); } if (imageId != null) { System.out.println("Failed to upload imageId " + imageId + " , " + this.bytesWritten + " bytes have been transferred."); } break; default: break; } } public boolean isSucceed() { return succeed; } public void onVidReady(String videoId) { setVideoId(videoId); } public void onImageIdReady(String imageId) { setImageId(imageId); } public String getVideoId() { return videoId; } public void setVideoId(String videoId) { this.videoId = videoId; } public String getImageId() { return imageId; } public void setImageId(String imageId) { this.imageId = imageId; } }

保持可爱mmm 2020-03-30 13:42:41 0 浏览量 回答数 0

问题

【精品问答】Python二级考试题库

珍宝珠 2019-12-01 22:03:38 1146 浏览量 回答数 2

回答

回楼主北京亿网的帖子 感谢你的关注,以后有什么问题可以咨询我们北京亿网,由于给客户上了一台阿里云产品,深深体会到了客户的不容易,我们亲自沟通都不行,最后还是自己查出原因,投诉什么的是没用的,你自己生气还不如自己想办法,指不上,第三方公司一等一小天,并且真的问题他们也是处理不了,只有普通客户的问题才能解决估计,比如这次,一分钟就明白的事,万网和第三方弄四天,我们客户急了都,没办法我们通地不断检查测试,查清原因了. ------------------------- Re使用阿里云ECS无法安装SQL2005系统的问题 引用楼主北京亿网于2014-12-06 08:15发表的 使用阿里云ECS无法安装SQL2005系统的问题 : 问题描述 : 在安装mssql2005时,安装CD1顺利完成,在安装CD2时无法进行,双击安装文件后自动关闭,无提示!怎么解决? 看的日志提示是: 事件 ID ( 11260 )的描述(在资源( MsiInstaller )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: 产品: Microsoft SQL Server 安装程序支持文件(英语) -- 错误 1260。由于一个软件限制策略的阻止,Windows 无法打开此程序。要获取更多信息,请打开事件查看器或与系统管理员联系。 ....... [url=http://bbs.aliyun.com/job.php?action=topost&tid=187191&pid=tpc][/url] 服务态度还行,就是服务方式不好,回复你的售后基本可以讲不算是一名技术人员,他不这样说也没什么可说的了,不过有一点说的没错,你这边不急不投诉他真不给你重视起来呢,你说怪不怪! ------------------------- Re使用阿里云ECS无法安装SQL2005系统的问题 问题已经自行查明原因,阿里提供镜象问题,暂时还无法加其他版本镜象,只能更换系统. ------------------------- 回6楼云追溯的帖子 好久没来阿里云论坛了,今天打开一看自己的贴子又跑首页了,你们就别指着给你解决什么,就一个弄清问题叫他们承认都要用我一个来月的时间,最后的结果是清楚原因,但不能给解决,只能逼着你换系统,所以别指望了,如果实在用不了,还是用我们的产品吧,还有代维服务,我们给客户代购的阿里云产品叫我们技术部操了不少心,要是我们的产品直接帮解决了,我这只能帮查出问题,叫人家解决,但后台没几个技术是专业的,全是叫第三方给查看,就算指出原因,也不会给解决,估计是反应不上去,没人重视,只要广告打的响,你们这些用不了的还不如新来的人多,不可能重视,大公司没办法! ------------------------- 回7楼ftp4oss的帖子 你的企业版2005数据库是装在阿里云2003系统上的吗,要是装2008系统上的这种另类反搭配就别在这讲了,那不如直接装SQL2008了.这个贴子的前题时指2003系统通常搭配的2005数据库无法安装的问题.原因是阿里云没有提供专业的服务器版系统静象,这种不专业的系统来当服务器系统,也只能装个人用的精简的数据库2005,企业的装不了. ------------------------- 回8楼拔刀斋的帖子 阿里云的技术支持仅限安装系统这部分,然后有什么问题安装什么他们也没个专业的技术来判断,只会告诉你支持,或是没限制,事实不是这样,因为他们提供的系统本身就有局限,等你问个半个月了也搞不了,他们换几个技术也搞不了时,会推荐你叫第三方服务,基本上所谓的第三方也没有几个专业的,提问一次两三天有个结果吧,建议没有技术力量的客户不要在折磨自己了,因为你搞什么想弄个对错都没有人帮你去判断!如果一定用阿里云可以联系我们代购,至少我们负责代维,不是他们后台不专业的技术说什么是什么,就是不给解决他也得承认我们查出的问题,到时你想退款也有依据.如果就是租了一个月也别退了,就当交学费了,直接在我们这买产品,我们可以代购阿里云,也有自己的产品,包维护,支持环境应用技术支持. ------------------------- 回9楼中国舞曲网的帖子 SQL2000这个版本有点低了,几年前我们就不装这种环境了,没有试,是不是阿里系统静象问题也不好说,如果还是那个静象那就是有问题,虽然此前有一个用户和我说同样的静象版本在另一个区购买的高配置就可以安装,这个我没亲自看,所以也不确定他说的是不是真实的,总之吧,服务器系统应用服务器版系统才是专业的,用什么标准,,精简,就是能装上以后也会有各种各样的问题,不专业的表现,配套能装上的也全是一些精简的个人研究之用的数据库版本,所以从专业角度就是系统问题,从相对论上来说,装个个人研究之用的数据库2005我也可以给客户装上,但那是精简的,你懂的! ------------------------- Re使用阿里云ECS无法安装SQL2005系统的问题 好久没来了,今天来看发现自己的贴子又叫顶到首页了,看来好有后来人在受困扰,那就全回复一下吧,另外有一些看了广告就来买阿里云又不会用的,又不会装环境的亲们,来北京亿网寻求帮助吧,提供代维服务. ------------------------- 回7楼ftp4oss的帖子 你要不是提供个截图我还真以为你装了个企业版,我贴子中似乎有讲过在我们遇到这个问题后,也有万网多名技术员测试安装无法成功,并且万网委托的第三方技术公司也未能安装成功,最后认同了我们的结论,他这个静象就不能装企业版2005,用一些方法装上后在以后使用和更新时会更多的麻烦,所以放下研究真的使用这样免强装上是不行的,但你这里还截了图,还安静的讲装上了还用了一年多,,为了不叫看我贴的其他用户叫你误导,本楼主在此有必要回复一下,你讲的可能是一个事实,但你截图的这个版本并不是企业版SQl2005,从你截图显示的版本号1399来看,似乎是开发版,并不是真正的企业版,所以和我讲的阿里云目前的提供的2003系统并不能完美安装SQL2005企业版不是同一个问题.看签名你还是级别: 工具与镜像服务商 ?那就向万网要求提供下服务器版2003静象吧,这样专业一些,能适合不同版SQL2005,就不会有这么多客户的各种问题了,我没有时间在建议这些. ------------------------- 回17楼数据佰度的帖子 17楼看来是真的去安装测试了,看得出 是比较认真的一个人,你的测试是正确的,万网电话客服人员普遍技术水平是零,包括后台技术的回复也是相当不负责,这一点我早早有提出过,但建议是建议,人家还是那样,从你讲的看来他们还是在和客户不停的讲这句,系统工程纯净的,全可以装,看来这个含糊不负责的回答现在想想不是他们不清楚这样回答不负责,这样回签对销量有意义,一些客户就是因为这句回答就买了,买完装不了就郁闷去吧.另外你楼上16楼他没你认真,他装的根本也不是企业版,所以他的测试没意义,你的结论是正确的. ------------------------- 回19楼围观群众1的帖子 只为了装上通过查看系统日志提示,通过结束进程,移队插件,直接用静象文件修复安装等多种方式都能完成安装过程,但这种安装并不是真的成功,特别是配套其他软件使用时,以后在更新升级时问题多多,这些最开始我们公司全有测试过,所以最后才有以上结论,阿里云这个2003系统并不是他们讲的那样可以装企业版2005,如果他们不能提供服务器版2003系统,大家就不要在浪费时间了. ------------------------- 回26楼围观群众1的帖子 这个贴子这么久还有人围观,首先感谢大家的关注和支持! 26楼看得出也是一个热爱技术和喜欢发现问题,研究问题,解决问的人,这很好! 但关于微软的系统版本和数据库版本对应问题,官方版本的划分已经是一个答案了,如果全通用还划分版本做什么,这本不是一个值得讨论的事情,此问题其根本是源于我的客户在咨询阿里售后时得到的精典答复是:系统是纯净的,全可以装"有关这个说法建议可以直接咨询微软方面,本人不过多说明,只是对热爱技术的网友回下贴,感谢关注. 你这种测试是有主观倾向的,什么也证明不了,服务器技术管理人员哪有不打补丁的呢,如果要把补丁移除才能装那本身就是个问题,为了解决一个问题而把一年的补丁移除来说明是补丁问题这相当的不可取,很危险的维护方式.补丁也是系统的一部分,并且不出意外你这种方式 装上了,在以后打补丁还会出问题,到时你来此贴报个道吧,如果只是为了能装上,方法很多,我的贴子中也有提到,但用户他租这个是用来使用的,不是一时研究之用,所以只有根本的解决方法才是真的解决,踏实的按微软的版本对应要求配置安装才是正道,其他全是取巧,如果就是暂时解决,以后服务器也是要升级补下的,如果微软某个补丁就是适于对应版本才可以时,那时才要换成对应版本吗,更何况叫服务商增加服务器版系统对客户是好事,对服务商来说也是更专业,难道租这个不是来当服务器吗 ------------------------- 回29楼兔子王的帖子 感谢围观,你这种租台机器挂QQ用的,是不需要装数据库的,所以你放不放心都没意义,更不会懂技术间讨论的那种乐趣,如果你的水平都可以来判断专业与否了,那会上网打字全是高级技术员了,如果你的乐趣就是用言语挑事,打个嗝都要说所处地气候环境不适合你生长,很不巧我向来以言语犀利 为自我评价。要不你开个贴我可以和你一样不知天高地厚的用敲字来PK下双方的神经反应系统灵敏度。所以不要在我的贴子上面发广告,还留个QQ,还网络公司,先不说你在我贴子下留广告这是一种不尊重,其次你那所谓的解决方式不是误人子弟吗,自己坑了不要急,不能坑了客户,给别人留后患.还某人某人的,如果没有建设性的技术方案要和大这交流的就收起你的广告和管好你地张嘴. ------------------------- 回 17楼(数据佰度) 的帖子 这个人厚道,至少他清楚我发这个贴子在说什么和我的用意,这是广大用户对阿里方面要求提升服务的一种鞭策,阿里方面至少和我直接沟通的人员也很认可我讲的这一点,至少态度是友好的,并且我发这个贴子时离2003官方不在支持还有半年,有一天我们也要给客户最好的支持,这才是服务,现在我们自己都不用2003了,因为官方不支持了,这个是一个硬性依据! ------------------------- 回 29楼(兔子王) 的帖子 对,这种人你得捧,给他勇气,叫他一直傻下去,一个版本对应问题官方都有说明的事,还搞的这么复杂,没人说镜象问题,我一直在说版本,要提供服务器版本,对大众客户来说,用标准版装去装企业版数据库就会碰到这样的问题,他们不是技术人员,你叫他们每个人和你一样去这样弄几天才成就了你的自尊心是吗,你那叫解决了是吗,过了半年你现在还这样想,那你真没救了,你看你已经把这位误导了。自己偶尔的一个测试原因尚不明确就拿 出来当论据了,很不负责任做为一个技术人员! ------------------------- 北京亿网感谢大家的关注,这个贴子很久了,今天上来结下贴的,欢迎大家交流,但希望发表技术类方面的言论时不要给其他人造成误导,否则我讲话可是很直接的叫你不舒服的,为了证明我不是恶意针对某人,在这里结贴时也给感谢一下阿里方面的回复,我今天 才上来看到,这对于个别人来讲,可能看了会感觉打脸,阿里人家不需要你的跪添,所以在讨论技术问题时至少不要在我面前硬装人,看下吧,那位硬说版本没半毛钱关系的那位,顺便说句这个贴子就结了,以后大家关注北京亿网新贴子,我们已经为用户提阿里美国,香港,国内的阿里云空间产品,新加坡的也要上线了,谢谢大家来使用,联系我们吧! 下面是阿里云工程师对我们这个提问的回复,结贴了,大家以后不要在讨论了。 售后工程师 :  您好,从如下微软官方SQL Server安装说明来看,Windows Server 2003标准版确实不支持安装SQL Server 2005企业版。http://technet.microsoft.com/zh-cn/library/ms143506(v=sql.90).aspx 当前查看您已经将服务器系统更换为2008。对于该问题给您带来的不便很抱歉。感谢您的问题反馈和对阿里云的信赖。  2014-12-29 18:35:29 ------------------------- 回 42楼(bjyw用户) 的帖子 用户您好,请别激动,也不要生气了!首先要感谢你告诉我们的账号叫封停了,你不告诉我们都不知道!刚已经联系阿里解封了,那个版主我就不点名了,他自己发的帖子植入广告别人又不是看不出来,估计当这个版主就是为了自己发广告方便才申请的吧,但你自己方便也就算了,怎么还乱用权限了呢, 有点自知之明好不好,我们下边的客户草根站长多的事,全应可以来申请版主,哪轮得到你删贴和禁言的,有事你说事啊,直接封公司的账号你脑子是不是缺点什么? 还有我这个帖子早就结贴了,那个小号上来骂骂咧咧的,某版主没见你一起封啊,用我们用户的话讲你是不是瞎?还有那个小号你也不要在这骂,我也理解你一万年解决了一个问题出来显摆下的心情,这类问题在技术部天天都有的事,我们都表示没什么可说的了,我都结贴了你怎么还没脸没皮的上来发上面的话?阿里工程师都回复,我都贴 出来了,告诉大家不要在讨论了,你看你把我们用户气的!在贴下你看看吧,无知喷人不要紧,但你也看明白人家讲什么你在喷啊,我在这里给大家讨福利的事,你在那折什么台呢,我们客户举的例子你要是看不懂,我给你举个吧:话说一个通道,客户人家就要正常的直接走过去,因为一直这样走,可你一定要来个左三步,右三步,退一步,进两步,搞的和过关一样,最后也能过去,或者叫用户记得这个口决每次也可以过去,你认为这个就不需要解决了是吧?问题是客户为什么要记这些,会这些呢,人家的软件又无问题,人家客户又不想聘个技术人员,如果说一次免费两次免费我们可以帮,但经常的重装我们没事就给处理这个问题吗?为什么不能一劳永逸?明白我发贴的意思了吗?还不理解我也没办法,我承认我嘴比较黑,但对客户这块不含糊,但你看客户有骂我的吗? 下面是阿里云工程师对我们这个提问的回复,结贴了,大家以后不要在讨论了。 售后工程师 :  您好,从如下微软官方SQL Server安装说明来看,Windows Server 2003标准版确实不支持安装SQL Server 2005企业版。 http://technet.microsoft.com/zh-cn/library/ms143506(v=sql.90).aspx 当前查看您已经将服务器系统更换为2008。对于该问题给您带来的不便很抱歉。 感谢您的问题反馈和对阿里云的信赖。  2014-12-29 18:35:29 看到了吧?看清了吗?可能有人会问,你知道这个原因为什么要发求助贴呢,为什么还讨论这么久呢?能这样问的只能说你没认真看我发的相关贴子,我在最开始联系阿里方面时就告诉是这个原因,要提供一个服务器版镜象就没问题了,但阿里后台客服坚持那句话“我们的系统没有问题,可以直接装你的那个企业版2005”并且客户自己也打电话问了,也是那样回答的!所以我们只能把处理记录和进程贴出来,叫客户也看到,最后客户也完全理解我们和阿里方面了不是吗?如果说我们是为了显摆什么技术,那这类问题每天给阿里发来10个贴子, 我们还得聘一个阿里论坛编辑了,所以这个贴子完全是因为用户要看,我们才发的!如果我们经常来,也不会叫某傻X版主封号都不知道了!

北京亿网 2019-12-02 01:11:23 0 浏览量 回答数 0

回答

134题 其实就是水平扩容了,Zookeeper在这方面不太好。两种方式:全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。逐个重启:这是比较常用的方式。 133题 集群最低3(2N+1)台,保证奇数,主要是为了选举算法。一个由 3 台机器构成的 ZooKeeper 集群,能够在挂掉 1 台机器后依然正常工作,而对于一个由 5 台服务器构成的 ZooKeeper 集群,能够对 2 台机器挂掉的情况进行容灾。注意,如果是一个由6台服务器构成的 ZooKeeper 集群,同样只能够挂掉 2 台机器,因为如果挂掉 3 台,剩下的机器就无法实现过半了。 132题 基于“过半”设计原则,ZooKeeper 在运行期间,集群中至少有过半的机器保存了最新的数据。因此,只要集群中超过半数的机器还能够正常工作,整个集群就能够对外提供服务。 131题 不是。官方声明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。一般是客户端执行getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。 130题 数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master 选举,分布式锁,分布式队列 129题 客户端 SendThread 线程接收事件通知, 交由 EventThread 线程回调 Watcher。客户端的 Watcher 机制同样是一次性的, 一旦被触发后, 该 Watcher 就失效了。 128题 1、服务端接收 Watcher 并存储; 2、Watcher 触发; 2.1 封装 WatchedEvent; 2.2 查询 Watcher; 2.3 没找到;说明没有客户端在该数据节点上注册过 Watcher; 2.4 找到;提取并从 WatchTable 和 Watch2Paths 中删除对应 Watcher; 3、调用 process 方法来触发 Watcher。 127题 1.调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象 2.标记请求 request,封装 Watcher 到 WatchRegistration 3.封装成 Packet 对象,发服务端发送 request 4.收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理 5.请求返回,完成注册。 126题 Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变。工作机制:(1)客户端注册 watcher(2)服务端处理 watcher(3)客户端回调 watcher 125题 服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。 LOOKING:寻 找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。 FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。 LEADING:领导者状态。表明当前服务器角色是 Leader。 OBSERVING:观察者状态。表明当前服务器角色是 Observer。 124题 Zookeeper 有三种部署模式:单机部署:一台集群上运行;集群部署:多台集群运行;伪集群部署:一台集群启动多个 Zookeeper 实例运行。 123题 Paxos算法是分布式选举算法,Zookeeper使用的 ZAB协议(Zookeeper原子广播),二者有相同的地方,比如都有一个Leader,用来协调N个Follower的运行;Leader要等待超半数的Follower做出正确反馈之后才进行提案;二者都有一个值来代表Leader的周期。不同的地方在于:ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统。Paxos算法、ZAB协议要想讲清楚可不是一时半会的事儿,自1990年莱斯利·兰伯特提出Paxos算法以来,因为晦涩难懂并没有受到重视。后续几年,兰伯特通过好几篇论文对其进行更进一步地解释,也直到06年谷歌发表了三篇论文,选择Paxos作为chubby cell的一致性算法,Paxos才真正流行起来。对于普通开发者来说,尤其是学习使用Zookeeper的开发者明确一点就好:分布式Zookeeper选举Leader服务器的算法与Paxos有很深的关系。 122题 ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议(paxos算法的一种实现)。ZAB协议包括两种基本的模式:崩溃恢复和消息广播。当整个zookeeper集群刚刚启动或者Leader服务器宕机、重启或者网络故障导致不存在过半的服务器与Leader服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式,首先选举产生新的Leader服务器,然后集群中Follower服务器开始与新的Leader服务器进行数据同步,当集群中超过半数机器与该Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式,Leader服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。 121题 Zookeeper本身也是集群,推荐配置不少于3个服务器。Zookeeper自身也要保证当一个节点宕机时,其他节点会继续提供服务。如果是一个Follower宕机,还有2台服务器提供访问,因为Zookeeper上的数据是有多个副本的,数据并不会丢失;如果是一个Leader宕机,Zookeeper会选举出新的Leader。ZK集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在ZK节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。所以,3个节点的cluster可以挂掉1个节点(leader可以得到2票>1.5),2个节点的cluster就不能挂掉任何1个节点了(leader可以得到1票<=1)。 120题 选完Leader以后,zk就进入状态同步过程。1、Leader等待server连接;2、Follower连接leader,将最大的zxid发送给leader;3、Leader根据follower的zxid确定同步点;4、完成同步后通知follower 已经成为uptodate状态;5、Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。 119题 在zookeeper集群中也是一样,每个节点都会投票,如果某个节点获得超过半数以上的节点的投票,则该节点就是leader节点了。zookeeper中有三种选举算法,分别是LeaderElection,FastLeaderElection,AuthLeaderElection, FastLeaderElection此算法和LeaderElection不同的是它不会像后者那样在每轮投票中要搜集到所有结果后才统计投票结果,而是不断的统计结果,一旦没有新的影响leader结果的notification出现就返回投票结果。这样的效率更高。 118题 zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件;但是nginx的吞吐量比zk大很多,应该说按业务选择用哪种方式。 117题 Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。 116题 有临时节点和永久节点,分再细一点有临时有序/无序节点,有永久有序/无序节点。当创建临时节点的程序结束后,临时节点会自动消失,临时节点上的数据也会一起消失。 115题 在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,这就是主节点存在的意义。 114题 ZooKeeper 实现分布式事务,类似于两阶段提交,总共分为以下 4 步:客户端先给 ZooKeeper 节点发送写请求;ZooKeeper 节点将写请求转发给 Leader 节点,Leader 广播给集群要求投票,等待确认;Leader 收到确认,统计投票,票数过半则提交事务;事务提交成功后,ZooKeeper 节点告知客户端。 113题 ZooKeeper 实现分布式锁的步骤如下:客户端连接 ZooKeeper,并在 /lock 下创建临时的且有序的子节点,第一个客户端对应的子节点为 /lock/lock-10000000001,第二个为 /lock/lock-10000000002,以此类推。客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知后重复此步骤直至获得锁;执行业务代码;完成业务流程后,删除对应的子节点释放锁。 112题 ZooKeeper 特性如下:顺序一致性(Sequential Consistency):来自相同客户端提交的事务,ZooKeeper 将严格按照其提交顺序依次执行;原子性(Atomicity):于 ZooKeeper 集群中提交事务,事务将“全部完成”或“全部未完成”,不存在“部分完成”;单一系统镜像(Single System Image):客户端连接到 ZooKeeper 集群的任意节点,其获得的数据视图都是相同的;可靠性(Reliability):事务一旦完成,其产生的状态变化将永久保留,直到其他事务进行覆盖;实时性(Timeliness):事务一旦完成,客户端将于限定的时间段内,获得最新的数据。 111题 ZooKeeper 通常有三种搭建模式:单机模式:zoo.cfg 中只配置一个 server.id 就是单机模式了,此模式一般用在测试环境,如果当前主机宕机,那么所有依赖于当前 ZooKeeper 服务工作的其他服务器都不能进行正常工作;伪分布式模式:在一台机器启动不同端口的 ZooKeeper,配置到 zoo.cfg 中,和单机模式相同,此模式一般用在测试环境;分布式模式:多台机器各自配置 zoo.cfg 文件,将各自互相加入服务器列表,上面搭建的集群就是这种完全分布式。 110题 ZooKeeper 主要提供以下功能:分布式服务注册与订阅:在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,比较典型的服务注册与订阅,如 Dubbo。分布式配置中心:发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者获取数据,实现配置信息的集中式管理和动态更新。命名服务:在分布式系统中,通过命名服务客户端应用能够根据指定名字来获取资源、服务地址和提供者等信息。分布式锁:这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。 109题 Dubbo是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。而 Spring Cloud诞生于微服务架构时代,考虑的是微服务治理的方方面面,另外由于依托了 Spirng、Spirng Boot的优势之上,两个框架在开始目标就不一致,Dubbo 定位服务治理、Spirng Cloud 是一个生态。 108题 Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。 107题 Dubbo超时时间设置有两种方式: 服务提供者端设置超时时间,在Dubbo的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。 服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。 106题 Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀; RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题; LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求; ConstantHash LoadBalance: 一致性Hash策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动; 缺省时为Random随机调用。 105题 Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心。 注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。 Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。 Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer。 104题 Provider:暴露服务的服务提供方。 Consumer:调用远程服务的服务消费方。 Registry:服务注册与发现的注册中心。 Monitor:统计服务的调用次调和调用时间的监控中心。 Container:服务运行容器。 103题 主要就是如下3个核心功能: Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 102题 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 101题 垂直分表定义:将一个表按照字段分成多表,每个表存储其中一部分字段。水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中。 100题 垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。 99题 QPS:每秒查询数。TPS:每秒处理事务数。Uptime:服务器已经运行的时间,单位秒。Questions:已经发送给数据库查询数。Com_select:查询次数,实际操作数据库的。Com_insert:插入次数。Com_delete:删除次数。Com_update:更新次数。Com_commit:事务次数。Com_rollback:回滚次数。 98题 如果需要跨主机进行JOIN,跨应用进行JOIN,或者数据库不能获得较好的执行计划,都可以自己通过程序来实现JOIN。 例如:SELECT a.,b. FROM a,b WHERE a.col1=b.col1 AND a.col2> 10 ORDER BY a.col2; 可以利用程序实现,先SELECT * FROM a WHERE a.col2>10 ORDER BY a.col2;–(1) 利用(1)的结果集,做循环,SELECT * FROM b WHERE b.col1=a.col1; 这样可以避免排序,可以在程序里控制执行的速度,有效降低数据库压力,也可以实现跨主机的JOIN。 97题 搭建复制的必备条件:复制的机器之间网络通畅,Master打开了binlog。 搭建复制步骤:建立用户并设置权限,修改配置文件,查看master状态,配置slave,启动从服务,查看slave状态,主从测试。 96题 Heartbeat方案:利用Heartbeat管理VIP,利用crm管理MySQL,MySQL进行双M复制。(Linux系统下没有分库的标准方案)。 LVS+Keepalived方案:利用Keepalived管理LVS和VIP,LVS分发请求到MySQL,MySQL进行双M复制。(Linux系统下无分库无事务的方案)。 Cobar方案:利用Cobar进行HA和分库,应用程序请求Cobar,Cobar转发请求道数据库。(有分库的标准方案,Unix下唯一方案)。 95题 聚集(clustered)索引,也叫聚簇索引,数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。但是,覆盖索引可以模拟多个聚集索引。存储引擎负责实现索引,因此不是所有的存储索引都支持聚集索引。当前,SolidDB和InnoDB是唯一支持聚集索引的存储引擎。 优点:可以把相关数据保存在一起。数据访问快。 缺点:聚集能最大限度地提升I/O密集负载的性能。聚集能最大限度地提升I/O密集负载的性能。建立在聚集索引上的表在插入新行,或者在行的主键被更新,该行必须被移动的时候会进行分页。聚集表可会比全表扫描慢,尤其在表存储得比较稀疏或因为分页而没有顺序存储的时候。第二(非聚集)索引可能会比预想的大,因为它们的叶子节点包含了被引用行的主键列。 94题 以下原因是导致mysql 表毁坏的常见原因: 服务器突然断电导致数据文件损坏; 强制关机,没有先关闭mysql 服务; mysqld 进程在写表时被杀掉; 使用myisamchk 的同时,mysqld 也在操作表; 磁盘故障;服务器死机;mysql 本身的bug 。 93题 1.定位慢查询 首先先打开慢查询日志设置慢查询时间; 2.分析慢查询(使用explain工具分析sql语句); 3.优化慢查询 。

游客ih62co2qqq5ww 2020-06-15 13:55:41 0 浏览量 回答数 0

回答

Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱 (IMAP/POP3)代理服务器。它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Windows。根据调查统计,6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同,Nginx不依赖线程来处理请求。相反,它使用了更多的可扩展的事 件驱动(异步)架构。Nginx为一些高流量的网站提供动力,比如WordPress,人人网,腾讯,网易等。这篇文章主要是介绍如何提高运行在 Linux或UNIX系统的Nginx Web服务器的安全性。 默认配置文件和Nginx端口 /usr/local/nginx/conf/ – Nginx配置文件目录,/usr/local/nginx/conf/nginx.conf是主配置文件 /usr/local/nginx/html/ – 默认网站文件位置 /usr/local/nginx/logs/ – 默认日志文件位置 Nginx HTTP默认端口 : TCP 80 Nginx HTTPS默认端口: TCP 443 你可以使用以下命令来测试Nginx配置文件准确性。 /usr/local/nginx/sbin/nginx -t 将会输出: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful 执行以下命令来重新加载配置文件。 /usr/local/nginx/sbin/nginx -s reload 执行以下命令来停止服务器。 /usr/local/nginx/sbin/nginx -s stop 一、配置SELinux 注意:对于云服务器 ECS,参阅 ECS 使用须知 ,基于兼容性、稳定性考虑,请勿开启 SELinux。 安全增强型 Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。它可以防御大部分攻击。下面我们来看如何启动基于centos/RHEL系统的SELinux。 安装SELinux rpm -qa | grep selinux libselinux-1.23.10-2 selinux-policy-targeted-1.23.16-6 如果没有返回任何结果,代表没有安装 SELinux,如果返回了类似上面的结果,则说明系统安装了 SELinux。 布什值锁定 运行命令getsebool -a来锁定系统。 getsebool -a | less getsebool -a | grep off getsebool -a | grep o 二、通过分区挂载允许最少特权 服务器上的网页/html/php文件单独分区。例如,新建一个分区/dev/sda5(第一逻辑分区),并且挂载在/nginx。确保 /nginx是以noexec, nodev and nosetuid的权限挂载。以下是我的/etc/fstab的挂载/nginx的信息: LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2 注意:你需要使用fdisk和mkfs.ext3命令创建一个新分区。 三、配置/etc/sysctl.conf强化Linux安全 你可以通过编辑/etc/sysctl.conf来控制和配置Linux内核、网络设置。 Avoid a smurf attack net.ipv4.icmp_echo_ignore_broadcasts = 1 Turn on protection for bad icmp error messages net.ipv4.icmp_ignore_bogus_error_responses = 1 Turn on syncookies for SYN flood attack protection net.ipv4.tcp_syncookies = 1 Turn on and log spoofed, source routed, and redirect packets net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 No source routed packets here net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 Turn on reverse path filtering net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 Make sure no one can alter the routing tables net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 Don’t act as a router net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 Turn on execshild kernel.exec-shield = 1 kernel.randomize_va_space = 1 Tuen IPv6 net.ipv6.conf.default.router_solicitations = 0 net.ipv6.conf.default.accept_ra_rtr_pref = 0 net.ipv6.conf.default.accept_ra_pinfo = 0 net.ipv6.conf.default.accept_ra_defrtr = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.default.dad_transmits = 0 net.ipv6.conf.default.max_addresses = 1 Optimization for port usefor LBs Increase system file descriptor limit fs.file-max = 65535 Allow for more PIDs (to reduce rollover problems); may break some programs 32768 kernel.pid_max = 65536 Increase system IP port limits net.ipv4.ip_local_port_range = 2000 65000 Increase TCP max buffer size setable using setsockopt() net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 87380 8388608 Increase Linux auto tuning TCP buffer limits min, default, and max number of bytes to use set max to at least 4MB, or higher if you use very high BDP paths Tcp Windows etc net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_window_scaling = 1 四、删除所有不需要的Nginx模块 你需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如,禁用SSL和autoindex模块你可以执行以下命令: ./configure –without-http_autoindex_module –without-http_ssi_module make make install 通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭: ./configure –help | less 禁用你用不到的nginx模块。 (可选项)更改nginx版本名称。 编辑文件/http/ngx_http_header_filter_module.c: vi +48 src/http/ngx_http_header_filter_module.c 找到行: static char ngx_http_server_string[] = “Server: nginx” CRLF; static char ngx_http_server_full_string[] = “Server: ” NGINX_VER CRLF; 按照以下行修改: static char ngx_http_server_string[] = “Server: Ninja Web Server” CRLF; static char ngx_http_server_full_string[] = “Server: Ninja Web Server” CRLF; 保存并关闭文件。现在你可以编辑服务器了。增加以下代码到nginx.conf文件来关闭nginx版本号的显示。 server_tokens off 五、使用mod_security(只适合后端Apache服务器) mod_security为Apache提供一个应用程序级的防火墙。为后端Apache Web服务器安装mod_security,这会阻止很多注入式攻击。 六、安装SELinux策略以强化Nginx Web服务器 默认的SELinux不会保护Nginx Web服务器,但是你可以安装和编译保护软件。 1、安装编译SELinux所需环境支持 yum -y install selinux-policy-targeted selinux-policy-devel 2、下载SELinux策略以强化Nginx Web服务器。 cd /opt wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc’ 3、解压文件 tar -zxvf se-ngix_1_0_10.tar.gz 4、编译文件 cd se-ngix_1_0_10/nginx make 将会输出如下: Compiling targeted nginx module /usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp /usr/bin/checkmodule: policy configuration loaded /usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod Creating targeted nginx.pp policy package rm tmp/nginx.mod.fc tmp/nginx.mod 5、安装生成的nginx.pp SELinux模块: /usr/sbin/semodule -i nginx.pp 七、基于Iptables防火墙的限制 下面的防火墙脚本阻止任何除了允许: 来自HTTP(TCP端口80)的请求 来自ICMP ping的请求 ntp(端口123)的请求输出 smtp(TCP端口25)的请求输出 #!/bin/bash IPT=”/sbin/iptables” IPS Get server public ip SERVER_IP=$(ifconfig eth0 | grep ‘inet addr:’ | awk -F’inet addr:’ ‘{ print $2}’ | awk ‘{ print $1}’) LB1_IP=”204.54.1.1″ LB2_IP=”204.54.1.2″ Do some smart logic so that we can use damm script on LB2 too OTHER_LB=”" SERVER_IP=”" [[ "$SERVER_IP" == "$LB1_IP" ]] && OTHER_LB=”$LB2_IP” || OTHER_LB=”$LB1_IP” [[ "$OTHER_LB" == "$LB2_IP" ]] && OPP_LB=”$LB1_IP” || OPP_LB=”$LB2_IP” IPs PUB_SSH_ONLY=”122.xx.yy.zz/29″ FILES BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt SPOOFIP=”127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32 168.254.0.0/16 224.0.0.0/4 240.0.0.0/5 248.0.0.0/5 192.0.2.0/24″ BADIPS=$( [[ -f ${BLOCKED_IP_TDB} ]] && egrep -v “^#|^$” ${BLOCKED_IP_TDB}) Interfaces PUB_IF=”eth0″ # public interface LO_IF=”lo” # loopback VPN_IF=”eth1″ # vpn / private net start firewall echo “Setting LB1 $(hostname) Firewall…” DROP and close everything $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP Unlimited lo access $IPT -A INPUT -i ${LO_IF} -j ACCEPT $IPT -A OUTPUT -o ${LO_IF} -j ACCEPT Unlimited vpn / pnet access $IPT -A INPUT -i ${VPN_IF} -j ACCEPT $IPT -A OUTPUT -o ${VPN_IF} -j ACCEPT Drop sync $IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -j DROP Drop Fragments $IPT -A INPUT -i ${PUB_IF} -f -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL ALL -j DROP Drop NULL packets $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” NULL Packets “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,RST SYN,RST -j DROP Drop XMAS $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” XMAS Packets “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP Drop FIN packet scans $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” Fin Packets Scan “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP Log and get rid of broadcast / multicast and invalid $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j LOG –log-prefix ” Broadcast “ $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j DROP $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j LOG –log-prefix ” Multicast “ $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j DROP $IPT -A INPUT -i ${PUB_IF} -m state –state INVALID -j LOG –log-prefix ” Invalid “ $IPT -A INPUT -i ${PUB_IF} -m state –state INVALID -j DROP Log and block spoofed ips $IPT -N spooflist for ipblock in $SPOOFIP do $IPT -A spooflist -i ${PUB_IF} -s $ipblock -j LOG –log-prefix ” SPOOF List Block “ $IPT -A spooflist -i ${PUB_IF} -s $ipblock -j DROP done $IPT -I INPUT -j spooflist $IPT -I OUTPUT -j spooflist $IPT -I FORWARD -j spooflist Allow ssh only from selected public ips for ip in ${PUB_SSH_ONLY} do $IPT -A INPUT -i ${PUB_IF} -s ${ip} -p tcp -d ${SERVER_IP} –destination-port 22 -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -d ${ip} -p tcp -s ${SERVER_IP} –sport 22 -j ACCEPT done allow incoming ICMP ping pong stuff $IPT -A INPUT -i ${PUB_IF} -p icmp –icmp-type 8 -s 0/0 -m state –state NEW,ESTABLISHED,RELATED -m limit –limit 30/sec -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -p icmp –icmp-type 0 -d 0/0 -m state –state ESTABLISHED,RELATED -j ACCEPT allow incoming HTTP port 80 $IPT -A INPUT -i ${PUB_IF} -p tcp -s 0/0 –sport 1024:65535 –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -p tcp –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT allow outgoing ntp $IPT -A OUTPUT -o ${PUB_IF} -p udp –dport 123 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${PUB_IF} -p udp –sport 123 -m state –state ESTABLISHED -j ACCEPT allow outgoing smtp $IPT -A OUTPUT -o ${PUB_IF} -p tcp –dport 25 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${PUB_IF} -p tcp –sport 25 -m state –state ESTABLISHED -j ACCEPT add your other rules here ####################### drop and log everything else $IPT -A INPUT -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” DEFAULT DROP “ $IPT -A INPUT -j DROP exit 0 八、控制缓冲区溢出攻击 编辑nginx.conf,为所有客户端设置缓冲区的大小限制。 vi /usr/local/nginx/conf/nginx.conf 编辑和设置所有客户端缓冲区的大小限制如下: Start: Size Limits & Buffer Overflows client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; END: Size Limits & Buffer Overflows 解释: 1、client_body_buffer_size 1k-(默认8k或16k)这个指令可以指定连接请求实体的缓冲区大小。如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。 2、client_header_buffer_size 1k-指令指定客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置。 3、client_max_body_size 1k-指令指定允许客户端连接的最大请求实体大小,它出现在请求头部的Content-Length字段。 如果请求大于指定的值,客户端将收到一个”Request Entity Too Large” (413)错误。记住,浏览器并不知道怎样显示这个错误。 4、large_client_header_buffers-指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回”Request URI too large” (414) 同样,请求的头部最长字段不能大于一个缓冲区,否则服务器将返回”Bad request” (400)。缓冲区只在需求时分开。默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,如果一个连接请求最终将状态转换为keep- alive,它所占用的缓冲区将被释放。 你还需要控制超时来提高服务器性能并与客户端断开连接。按照如下编辑: Start: Timeouts client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10; End: Timeouts 1、client_body_timeout 10;-指令指定读取请求实体的超时时间。这里的超时是指一个请求实体没有进入读取步骤,如果连接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。 2、client_header_timeout 10;-指令指定读取客户端请求头标题的超时时间。这里的超时是指一个请求头没有进入读取步骤,如果连接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。 3、keepalive_timeout 5 5; – 参数的第一个值指定了客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接。参数的第二个值(可选)指定了应答头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应 答头中发送Keep-Alive信息。(但这并不是指怎样将一个连接“Keep-Alive”)参数的这两个值可以不相同。 4、send_timeout 10; 指令指定了发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接。 九、控制并发连接 你可以使用NginxHttpLimitZone模块来限制指定的会话或者一个IP地址的特殊情况下的并发连接。编辑nginx.conf: Directive describes the zone, in which the session states are stored i.e. store in slimits. 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session limit_zone slimits $binary_remote_addr 5m; Control maximum number of simultaneous connections for one session i.e. restricts the amount of connections from a single ip address limit_conn slimits 5; 上面表示限制每个远程IP地址的客户端同时打开连接不能超过5个。 十、只允许我们的域名的访问 如果机器人只是随机扫描服务器的所有域名,那拒绝这个请求。你必须允许配置的虚拟域或反向代理请求。你不必使用IP地址来拒绝。 Only requests to our Host are allowed i.e. nixcraft.in, images.nixcraft.in and www.nixcraft.in if ($host !~ ^(nixcraft.in|www.nixcraft.in|images.nixcraft.in)$ ) { return 444; } 十一、限制可用的请求方法 GET和POST是互联网上最常用的方法。 Web服务器的方法被定义在RFC 2616。如果Web服务器不要求启用所有可用的方法,它们应该被禁用。下面的指令将过滤只允许GET,HEAD和POST方法: Only allow these request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } Do not accept DELETE, SEARCH and other methods 更多关于HTTP方法的介绍 GET方法是用来请求,如文件http://www.moqifei.com/index.php。 HEAD方法是一样的,除非该服务器的GET请求无法返回消息体。 POST方法可能涉及到很多东西,如储存或更新数据,或订购产品,或通过提交表单发送电子邮件。这通常是使用服务器端处理,如PHP,Perl和Python等脚本。如果你要上传的文件和在服务器处理数据,你必须使用这个方法。 十二、如何拒绝一些User-Agents? 你可以很容易地阻止User-Agents,如扫描器,机器人以及滥用你服务器的垃圾邮件发送者。 Block download agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } 阻止Soso和有道的机器人: Block some robots if ($http_user_agent ~* Sosospider|YodaoBot) { return 403; } 十三、如何防止图片盗链 图片或HTML盗链的意思是有人直接用你网站的图片地址来显示在他的网站上。最终的结果,你需要支付额外的宽带费用。这通常是在论坛和博客。我强烈建议您封锁,并阻止盗链行为。 Stop deep linking or hot linking location /images/ { valid_referers none blocked www.example.com example.com; if ($invalid_referer) { return 403; } } 例如:重定向并显示指定图片 valid_referers blocked www.example.com example.com; if ($invalid_referer) { rewrite ^/images/uploads.*.(gif|jpg|jpeg|png)$ http://www.examples.com/banned.jpg last } 十四、目录限制 你可以对指定的目录设置访问权限。所有的网站目录应该一一的配置,只允许必须的目录访问权限。 通过IP地址限制访问 你可以通过IP地址来限制访问目录/admin/: location /docs/ { block one workstation deny 192.168.1.1; allow anyone in 192.168.1.0/24 allow 192.168.1.0/24; drop rest of the world deny all; } 通过密码保护目录 首先创建密码文件并增加“user”用户: mkdir /usr/local/nginx/conf/.htpasswd/ htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd user 编辑nginx.conf,加入需要保护的目录: Password Protect /personal-images/ and /delta/ directories location ~ /(personal-images/.|delta/.) { auth_basic “Restricted”; auth_basic_user_file /usr/local/nginx/conf/.htpasswd/passwd; } 一旦密码文件已经生成,你也可以用以下的命令来增加允许访问的用户: htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName 十五、Nginx SSL配置 HTTP是一个纯文本协议,它是开放的被动监测。你应该使用SSL来加密你的用户内容。 创建SSL证书 执行以下命令: cd /usr/local/nginx/conf openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 编辑nginx.conf并按如下来更新: server { server_name example.com; listen 443; ssl on; ssl_certificate /usr/local/nginx/conf/server.crt; ssl_certificate_key /usr/local/nginx/conf/server.key; access_log /usr/local/nginx/logs/ssl.access.log; error_log /usr/local/nginx/logs/ssl.error.log; } 重启nginx: /usr/local/nginx/sbin/nginx -s reload 十六、Nginx与PHP安全建议 PHP是流行的服务器端脚本语言之一。如下编辑/etc/php.ini文件: Disallow dangerous functions disable_functions = phpinfo, system, mail, exec Try to limit resources Maximum execution time of each script, in seconds max_execution_time = 30 Maximum amount of time each script may spend parsing request data max_input_time = 60 Maximum amount of memory a script may consume (8MB) memory_limit = 8M Maximum size of POST data that PHP will accept. post_max_size = 8M Whether to allow HTTP file uploads. file_uploads = Off Maximum allowed size for uploaded files. upload_max_filesize = 2M Do not expose PHP error messages to external users display_errors = Off Turn on safe mode safe_mode = On Only allow access to executables in isolated directory safe_mode_exec_dir = php-required-executables-path Limit external access to PHP environment safemode_allowed_env_vars = PHP Restrict PHP information leakage expose_php = Off Log all errors log_errors = On Do not register globals for input data register_globals = Off Minimize allowable PHP post size post_max_size = 1K Ensure PHP redirects appropriately cgi.force_redirect = 0 Disallow uploading unless necessary file_uploads = Off Enable SQL safe mode sql.safe_mode = On Avoid Opening remote files allow_url_fopen = Off 十七、如果可能让Nginx运行在一个chroot监狱 把nginx放在一个chroot监狱以减小潜在的非法进入其它目录。你可以使用传统的与nginx一起安装的chroot。如果可能,那使用FreeBSD jails,Xen,OpenVZ虚拟化的容器概念。 十八、在防火墙级限制每个IP的连接数 网络服务器必须监视连接和每秒连接限制。PF和Iptales都能够在进入你的nginx服务器之前阻止最终用户的访问。 Linux Iptables:限制每次Nginx连接数 下面的例子会阻止来自一个IP的60秒钟内超过15个连接端口80的连接数。 /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 15 -j DROP service iptables save 请根据你的具体情况来设置限制的连接数。 十九:配置操作系统保护Web服务器 像以上介绍的启动SELinux.正确设置/nginx文档根目录的权限。Nginx以用户nginx运行。但是根目录(/nginx或者/usr /local/nginx/html)不应该设置属于用户nginx或对用户nginx可写。找出错误权限的文件可以使用如下命令: find /nginx -user nginx find /usr/local/nginx/html -user nginx 确保你更所有权为root或其它用户,一个典型的权限设置 /usr/local/nginx/html/ ls -l /usr/local/nginx/html/ 示例输出: -rw-r–r– 1 root root 925 Jan 3 00:50 error4xx.html -rw-r–r– 1 root root 52 Jan 3 10:00 error5xx.html -rw-r–r– 1 root root 134 Jan 3 00:52 index.html 你必须删除由vi或其它文本编辑器创建的备份文件: find /nginx -name ‘.?’ -not -name .ht -or -name ‘~’ -or -name ‘.bak’ -or -name ‘.old*’ find /usr/local/nginx/html/ -name ‘.?’ -not -name .ht -or -name ‘~’ -or -name ‘.bak’ -or -name ‘.old*’ 通过find命令的-delete选项来删除这些文件。 二十、限制Nginx连接传出 黑客会使用工具如wget下载你服务器本地的文件。使用Iptables从nginx用户来阻止传出连接。ipt_owner模块试图匹配本地产生的数据包的创建者。下面的例子中只允许user用户在外面使用80连接。 /sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT 通过以上的配置,你的nginx服务器已经非常安全了并可以发布网页。可是,你还应该根据你网站程序查找更多的安全设置资料。例如,wordpress或者第三方程序。

KB小秘书 2019-12-02 02:06:56 0 浏览量 回答数 0

问题

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

xiaofanqie 2019-12-01 21:24:21 74007 浏览量 回答数 38
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板