• 关于

    管理对象类常见问题及解决方法

    的搜索结果

问题

【精品问答】Java必备核心知识1000+(附源码)

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的如何学Java、实践中遇到的技术问题、RocketMQ面试、Java容器部署实践等维度内容。 我们会以每...
问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

回答

如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。 很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。 并发与并行 线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码: void transferMoney(User from, User to, float amount){ to.setMoney(to.getBalance() + amount); from.setMoney(from.getBalance() - amount); } 同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。如上面的代码简单加入@synchronized关键字。在保证结果准确的同时,提高性能,才是优秀的程序。线程安全的优先级高于性能。 好了,让我们开始吧。我准备分成几部分来总结涉及到多线程的内容: 扎好马步:线程的状态 内功心法:每个对象都有的方法(机制) 太祖长拳:基本线程类 九阴真经:高级多线程控制类 扎好马步:线程的状态 先来两张图: 线程状态 线程状态转换 各种状态一目了然,值得一提的是"blocked"这个状态:线程在Running的过程中可能会遇到阻塞(Blocked)情况 调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。 调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable) 对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。 此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。内功心法:每个对象都有的方法(机制) synchronized, wait, notify 是任何对象都具有的同步工具。让我们先来了解他们 monitor 他们是应用于同步问题的人工线程调度工具。讲其本质,首先就要明确monitor的概念,Java中的每个对象都有一个监视器,来监测并发代码的重入。在非多线程编码时该监视器不发挥作用,反之如果在synchronized 范围内,监视器发挥作用。 wait/notify必须存在于synchronized块中。并且,这三个关键字针对的是同一个监视器(某对象的监视器)。这意味着wait之后,其他线程可以进入同步块执行。 当某代码并不持有监视器的使用权时(如图中5的状态,即脱离同步块)去wait或notify,会抛出java.lang.IllegalMonitorStateException。也包括在synchronized块中去调用另一个对象的wait/notify,因为不同对象的监视器不同,同样会抛出此异常。 再讲用法: synchronized单独使用: 代码块:如下,在多线程环境下,synchronized块中的方法获取了lock实例的monitor,如果实例相同,那么只有一个线程能执行该块内容 复制代码 public class Thread1 implements Runnable { Object lock; public void run() { synchronized(lock){ ..do something } } } 复制代码 直接用于方法: 相当于上面代码中用lock来锁定的效果,实际获取的是Thread1类的monitor。更进一步,如果修饰的是static方法,则锁定该类所有实例。 public class Thread1 implements Runnable { public synchronized void run() { ..do something } } synchronized, wait, notify结合:典型场景生产者消费者问题 复制代码 /** * 生产者生产出来的产品交给店员 */ public synchronized void produce() { if(this.product >= MAX_PRODUCT) { try { wait(); System.out.println("产品已满,请稍候再生产"); } catch(InterruptedException e) { e.printStackTrace(); } return; } this.product++; System.out.println("生产者生产第" + this.product + "个产品."); notifyAll(); //通知等待区的消费者可以取出产品了 } /** * 消费者从店员取产品 */ public synchronized void consume() { if(this.product <= MIN_PRODUCT) { try { wait(); System.out.println("缺货,稍候再取"); } catch (InterruptedException e) { e.printStackTrace(); } return; } System.out.println("消费者取走了第" + this.product + "个产品."); this.product--; notifyAll(); //通知等待去的生产者可以生产产品了 } 复制代码 volatile 多线程的内存模型:main memory(主存)、working memory(线程栈),在处理数据时,线程会把值从主存load到本地栈,完成操作后再save回去(volatile关键词的作用:每次针对该变量的操作都激发一次load and save)。 volatile 针对多线程使用的变量如果不是volatile或者final修饰的,很有可能产生不可预知的结果(另一个线程修改了这个值,但是之后在某线程看到的是修改之前的值)。其实道理上讲同一实例的同一属性本身只有一个副本。但是多线程是会缓存值的,本质上,volatile就是不去缓存,直接取值。在线程安全的情况下加volatile会牺牲性能。太祖长拳:基本线程类 基本线程类指的是Thread类,Runnable接口,Callable接口Thread 类实现了Runnable接口,启动一个线程的方法:  MyThread my = new MyThread();  my.start(); Thread类相关方法:复制代码 //当前线程可转让cpu控制权,让别的就绪状态线程运行(切换)public static Thread.yield() //暂停一段时间public static Thread.sleep() //在一个线程中调用other.join(),将等待other执行完后才继续本线程。    public join()//后两个函数皆可以被打断public interrupte() 复制代码 关于中断:它并不像stop方法那样会中断一个正在运行的线程。线程会不时地检测中断标识位,以判断线程是否应该被中断(中断标识值是否为true)。终端只会影响到wait状态、sleep状态和join状态。被打断的线程会抛出InterruptedException。Thread.interrupted()检查当前线程是否发生中断,返回booleansynchronized在获锁的过程中是不能被中断的。 中断是一个状态!interrupt()方法只是将这个状态置为true而已。所以说正常运行的程序不去检测状态,就不会终止,而wait等阻塞方法会去检查并抛出异常。如果在正常运行的程序中添加while(!Thread.interrupted()) ,则同样可以在中断后离开代码体 Thread类最佳实践:写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理。在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的。 如何获取线程中的异常 不能用try,catch来获取线程中的异常Runnable 与Thread类似Callable future模式:并发模式的一种,可以有两种形式,即无阻塞和阻塞,分别是isDone和get。其中Future对象用来存放该线程的返回值以及状态 ExecutorService e = Executors.newFixedThreadPool(3); //submit方法有多重参数版本,及支持callable也能够支持runnable接口类型.Future future = e.submit(new myCallable());future.isDone() //return true,false 无阻塞future.get() // return 返回值,阻塞直到该线程运行结束 九阴真经:高级多线程控制类 以上都属于内功心法,接下来是实际项目中常用到的工具了,Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。1.ThreadLocal类 用处:保存线程的独立变量。对一个线程类(继承自Thread)当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。常用于用户登录控制,如记录session信息。 实现:每个Thread都持有一个TreadLocalMap类型的变量(该类是一个轻量级的Map,功能与map一样,区别是桶里放的是entry而不是entry的链表。功能还是一个map。)以本身为key,以目标为value。主要方法是get()和set(T a),set之后在map里维护一个threadLocal -> a,get时将a返回。ThreadLocal是一个特殊的容器。2.原子类(AtomicInteger、AtomicBoolean……) 如果使用atomic wrapper class如atomicInteger,或者使用自己保证原子的操作,则等同于synchronized //返回值为booleanAtomicInteger.compareAndSet(int expect,int update) 该方法可用于实现乐观锁,考虑文中最初提到的如下场景:a给b付款10元,a扣了10元,b要加10元。此时c给b2元,但是b的加十元代码约为:复制代码 if(b.value.compareAndSet(old, value)){ return ;}else{ //try again // if that fails, rollback and log} 复制代码 AtomicReference对于AtomicReference 来讲,也许对象会出现,属性丢失的情况,即oldObject == current,但是oldObject.getPropertyA != current.getPropertyA。这时候,AtomicStampedReference就派上用场了。这也是一个很常用的思路,即加上版本号3.Lock类  lock: 在java.util.concurrent包内。共有三个实现: ReentrantLockReentrantReadWriteLock.ReadLockReentrantReadWriteLock.WriteLock 主要目的是和synchronized一样, 两者都是为了解决同步问题,处理资源争端而产生的技术。功能类似但有一些区别。 区别如下:复制代码 lock更灵活,可以自由定义多把锁的枷锁解锁顺序(synchronized要按照先加的后解顺序)提供多种加锁方案,lock 阻塞式, trylock 无阻塞式, lockInterruptily 可打断式, 还有trylock的带超时时间版本。本质上和监视器锁(即synchronized是一样的)能力越大,责任越大,必须控制好加锁和解锁,否则会导致灾难。和Condition类的结合。性能更高,对比如下图: 复制代码 synchronized和Lock性能对比 ReentrantLock    可重入的意义在于持有锁的线程可以继续持有,并且要释放对等的次数后才真正释放该锁。使用方法是: 1.先new一个实例 static ReentrantLock r=new ReentrantLock(); 2.加锁       r.lock()或r.lockInterruptibly(); 此处也是个不同,后者可被打断。当a线程lock后,b线程阻塞,此时如果是lockInterruptibly,那么在调用b.interrupt()之后,b线程退出阻塞,并放弃对资源的争抢,进入catch块。(如果使用后者,必须throw interruptable exception 或catch)     3.释放锁    r.unlock() 必须做!何为必须做呢,要放在finally里面。以防止异常跳出了正常流程,导致灾难。这里补充一个小知识点,finally是可以信任的:经过测试,哪怕是发生了OutofMemoryError,finally块中的语句执行也能够得到保证。 ReentrantReadWriteLock 可重入读写锁(读写锁的一个实现)   ReentrantReadWriteLock lock = new ReentrantReadWriteLock()  ReadLock r = lock.readLock();  WriteLock w = lock.writeLock(); 两者都有lock,unlock方法。写写,写读互斥;读读不互斥。可以实现并发读的高效线程安全代码4.容器类 这里就讨论比较常用的两个: BlockingQueueConcurrentHashMap BlockingQueue阻塞队列。该类是java.util.concurrent包下的重要类,通过对Queue的学习可以得知,这个queue是单向队列,可以在队列头添加元素和在队尾删除或取出元素。类似于一个管  道,特别适用于先进先出策略的一些应用场景。普通的queue接口主要实现有PriorityQueue(优先队列),有兴趣可以研究 BlockingQueue在队列的基础上添加了多线程协作的功能: BlockingQueue 除了传统的queue功能(表格左边的两列)之外,还提供了阻塞接口put和take,带超时功能的阻塞接口offer和poll。put会在队列满的时候阻塞,直到有空间时被唤醒;take在队 列空的时候阻塞,直到有东西拿的时候才被唤醒。用于生产者-消费者模型尤其好用,堪称神器。 常见的阻塞队列有: ArrayListBlockingQueueLinkedListBlockingQueueDelayQueueSynchronousQueue ConcurrentHashMap高效的线程安全哈希map。请对比hashTable , concurrentHashMap, HashMap5.管理类 管理类的概念比较泛,用于管理线程,本身不是多线程的,但提供了一些机制来利用上述的工具做一些封装。了解到的值得一提的管理类:ThreadPoolExecutor和 JMX框架下的系统级管理类 ThreadMXBeanThreadPoolExecutor如果不了解这个类,应该了解前面提到的ExecutorService,开一个自己的线程池非常方便:复制代码 ExecutorService e = Executors.newCachedThreadPool(); ExecutorService e = Executors.newSingleThreadExecutor(); ExecutorService e = Executors.newFixedThreadPool(3); // 第一种是可变大小线程池,按照任务数来分配线程, // 第二种是单线程池,相当于FixedThreadPool(1) // 第三种是固定大小线程池。 // 然后运行 e.execute(new MyRunnableImpl()); 复制代码 该类内部是通过ThreadPoolExecutor实现的,掌握该类有助于理解线程池的管理,本质上,他们都是ThreadPoolExecutor类的各种实现版本。请参见javadoc: ThreadPoolExecutor参数解释 翻译一下:复制代码 corePoolSize:池内线程初始值与最小值,就算是空闲状态,也会保持该数量线程。maximumPoolSize:线程最大值,线程的增长始终不会超过该值。keepAliveTime:当池内线程数高于corePoolSize时,经过多少时间多余的空闲线程才会被回收。回收前处于wait状态unit:时间单位,可以使用TimeUnit的实例,如TimeUnit.MILLISECONDS workQueue:待入任务(Runnable)的等待场所,该参数主要影响调度策略,如公平与否,是否产生饿死(starving)threadFactory:线程工厂类,有默认实现,如果有自定义的需要则需要自己实现ThreadFactory接口并作为参数传入。 阿里云优惠券地址https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=nb3paa5b
景凌凯 2019-12-02 01:40:35 0 浏览量 回答数 0

问题

面向服务的ERP可重构开发模型

一是以业务流程为出发点,以业务流程建模技术和面向对象的方法与技术实现应用系统的分析与设计。业务流程是指企业为完成某一特定目标而进行的一系列逻辑相关的企业活动集合。专注业务流程有利于发现并剔除流程中无效的、不增值的环节ÿ...
hua2012h 2019-12-01 20:13:41 7876 浏览量 回答数 0

回答

概述 本文主要介绍无法远程登录Linux实例的案例和排查方法。 详细信息 本文主要通过如下2个方面解决无法远程登录Linux实例的问题。 常见报错案例 排查方法 常见报错案例 SSH无法远程登录Linux实例的常见案例如下所示,可根据实际报错信息选择不同的方案进行排查和处理。 PAM安全框架 Linux系统环境配置 SSH服务及参数配置 SSH服务关联目录或文件配置 SSH服务密钥配置 PAM安全框架 Linux系统的PAM安全框架可以加载相关安全模块,对云服务器的账户策略、登录策略等进行访问控制。如果相关配置存在异常,或触发了相关策略,就可能会导致SSH登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:pam_listfile(sshd:auth): Refused user root for service sshd SSH登录时出现如下错误:requirement “uid >= 1000” not met by user “root” SSH登录时出现如下错误:Maximum amount of failed attempts was reached SSH登录时出现如下错误:login: Module is unknown Linux系统环境配置 Linux内的系统环境,比如中毒、账户配置、环境变量配置等,如果出现异常,也可能会导致SSH登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:ssh_exchange_identification: read: Connection reset by peer 中毒导致SSH服务运行异常,出现如下错误:fatal: mm_request_send: write: Broken pipe SSH启动时出现如下错误:main process exited, code=exited SSH连接时出现如下错误:pam_limits(sshd:session):could not sent limit for ‘nofile’ SSH连接时出现如下错误:pam_unix(sshdsession) session closed for user SSH连接时出现如下错误:error Could not get shadow infromation for root SSH服务及参数配置 SSH服务的默认配置文件为/etc/ssh/sshd_config。配置文件中的相关参数配置异常,或启用了相关特性或策略,也可能会导致 SSH登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:Disconnected:No supported authentication methods available SSH登录时出现如下错误:User root not allowed because not listed in SSH登录时出现如下错误:Permission denied, please try again SSH登录时出现如下错误:Too many authentication failures for root SSH启动时出现如下错误:error while loading shared libraries SSH启动时出现如下错误:fatal: Cannot bind any address SSH启动时出现如下错误:Bad configuration options 云服务器ECS Linux SSH启用UseDNS导致连接速度变慢 Linux实例中由于SELinux服务开启导致SSH远程连接异常 SSH服务关联目录或文件配置 SSH服务基于安全性考虑,在运行时,会对相关目录或文件的权限配置、属组等进行检查。过高或过低的权限配置,都可能会引发服务运行异常,进而导致客户端登录失败。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:No supported key exchange algorithms SSH启动时出现如下错误:must be owned by root and not group or word-writable SSH服务密钥配置 SSH服务采用非对称加密技术,对所传输的数据进行加密。客户端及服务端会交换和校验相关密钥信息的有效性。根据不同报错信息,可参见如下常见案例进行解决。 SSH登录时出现如下错误:Host key verification failed SSH服务的公私钥异常导致无法SSH登录Linux实例 排查方法 若常见报错案例没有解决问题,可以参考如下流程排查问题。 检查CPU负载、带宽及内存使用情况 客户端排查 中间网络 网络检查 端口检查 安全组检查 示例 提示: 以下操作在CentOS 6.5 64位操作系统中进行过测试,在其他Linux发行版中可能存在差异,具体情况请参阅对应Linux发行版的官方文档。 客户端SSH连接Linux实例是运维操作的主要途径。通过管理终端可以用于临时运维操作,或者在客户端SSH登录异常时,用于问题排查和分析。 下图为SSH登录关联因素示意图。由此可见,通过SSH无法远程登录Linux实例时,可能涉及的关联因素较多。 检查CPU负载、带宽及内存使用情况 确认是否存在CPU负载过高的情况,如果存在,则参考本步骤解决问题,如果不存在,则执行下一步步骤。 提示:您无法主动监控系统内部的程序运行状态,但是可以借助云监控进行查看。 登录云监控控制台,依次选择 主机监控 > 进程监控。 查看应用运行情况,排除CPU负载过高的原因,如何查看CPU负载问题,请参见Linux系统ECS实例CPU使用率较高的排查思路。 提示:在某个时间段CPU负载过高可能导致远程连接失败,建议您查询程序或者实例资源是否不满足现有要求。 无法远程连接可能是公网带宽不足导致的,具体排查方法如下。可通过续费ECS实例,然后重启实例解决。详情参见手动续费或者自动续费。 登录ECS管理控制台。 找到该实例, 单击 管理 进入 实例详情 页面,查看网络监控数据。 检查服务器带宽是否为“1k”或“0k”。如果购买实例时没有购买公网带宽,后来升级了公网带宽,续费的时候没有选择续费带宽,带宽就会变成“1k”。 远程连接输入用户密码登录后,不能正常显示桌面直接退出,也没有错误信息。这种情况可能是服务器内存不足导致的,需要查看一下服务器的内存使用情况。具体操作如下。 使用控制台远程连接功能登录到Linux实例。 查看内存使用情况,具体请参考Linux系统的ECS实例中如何查看物理CPU和内存信息,确认内存不足后,请参考Linux服务器内存消耗过高进行处理。 客户端排查 客户端无法正常登录时,先使用不同的SSH客户端基于相同账户信息进行登录测试。如果能正常登录,则判断是客户端配置问题,需要对客户端配置或软件运行情况做排查分析。关于如何使用客户端SSH登录Linux实例,您可以参考远程连接Linux实例。 步骤一:使用管理终端登录实例 无论何种原因导致无法远程连接实例,请先尝试用阿里云提供的远程连接功能进行连接,确认实例还有响应,没有完全宕机,然后再按原因分类进行故障排查。 登录云服务器管理控制台,单击左侧导航栏中的 实例,然后在目标实例右侧单击 远程连接。 在首次连接或忘记连接密码时,单击 修改远程连接密码,修改远程连接的密码。 然后通过远程连接密码连接实例。 步骤二:检查客户端本地网络是否异常 确认是否存在用户本地无法连接外网的故障。 如果存在,则检查网卡驱动,如果存在异常,则重新安装。使用管理终端登录实例,查看/etc/hosts.deny文件,查看是否存在拦截IP,如果存在则删除此IP配置即可。 如果不存在,则执行下一步步骤。 步骤三:重启实例 在确保登录密码正确的情况下,确认之前是否曾重置过密码。检查重置实例密码后是否未重启实例,如果存在实例密码修改记录,但无重启实例记录,则参考以下操作步骤重启实例。 登录ECS管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。 中间网络 中间网络包括网络检查和端口检查。 网络检查 无法正常远程连接Windows实例时,需要先检查网络是否正常。 用其他网络环境中,不同网段或不同运营商)的电脑连接对比测试,判断是本地网络问题还是服务器端的问题。如果是本地网络问题或运营商问题,请联系本地IT人员或运营商解决。如果是网卡驱动存在异常,则重新安装。排除本地网络故障后进行下一步检查。 在客户端使用ping命令测试与实例的网络连通性。 网络异常时,请参考网络异常时如何抓取数据包进行排查。 当出现ping丢包或ping不通时,请参考使用ping命令丢包或不通时的链路测试方法进行排查。 如果出现间歇性丢包,ECS实例的网络一直处于不稳定状态时,请参考使用ping命令测试ECS实例的IP地址间歇性丢包进行解决。 系统内核没有禁ping的情况下,使用ping命令测试ECS服务器,发现网络不通,请参考Linux系统的ECS中没有禁PING却PING不通的解决方法。 端口检查 网络检查正常后,进一步检查端口是否正常。 使用管理终端登录实例,执行如下命令,编辑SSH配置文件。 vi /etc/ssh/sshd_config 找到“#port 22”所在行,检查默认端口22是否被修改,且前面的“#”是否删除,如果没有删除,可以把前面的“#”删除,然后将22改为其它的端口,再保存退出即可。 注:服务监听能使用的端口范围为0到65535,错误配置监听端口会导致远程桌面服务监听失败。 执行如下命令,重启SSH服务。 /etc/init.d/sshd restart 注:也可执行如下命令,重启SSH服务。 service sshd restart 使用Python自带的Web服务器用于临时创建新的监听端口进行测试。 python -m SimpleHTTPServer [$Port] 如果登录方式改变或者ECS安全组规则中未放行修改后的端口号,则参考如下步骤放行修改后的端口。 注:ECS的安全组规则中默认放行22端口。修改了远程桌面的端口后,需要在安全组规则中放行修改后的端口号。 登录ECS管理控制台。 找到该实例,单击 管理 进入 实例详情 页面,切换到 本实例安全组 标签页,单击 配置规则。 在安全组规则页面,单击 添加安全组规则。 在弹出的页面中,端口范围 输入修改后的远程桌面端口号。授权对象 输入客户端的公网IP地址。比如修改后的远程桌面端口号为2222,则 端口范围 应输入“2222/2222”。填写完成后,单击 确定。 通过上一步获取的端口,参考如下命令,进行端口测试,判断端口是否正常。如果端口测试失败,请参考使用ping命令正常但端口不通时的端口可用性探测说明进行排查。 telnet [$IP] [$Port] 注: [$IP]指Linux实例的IP地址。 [$Port]指Linux实例的SSH端口号。 系统显示类似如下,比如执行telnet 192.168.0.1 22命令,正常情况下,系统会返回服务端中SSH的软件版本号。 安全组检查 检查安全组配置,是否允许远程连接的端口。 参考查询安全组规则,查看安全组规则。如果远程连接端口没有进行配置,则参考Linux实例启用SSH服务后设置对应的安全组策略配置。 确认是否存在无法ping通ECS实例,在排除Iptables和网卡IP配置问题且回滚系统后,仍然无法ping通。可能是ECS实例安全组默认的公网规则被删除,则需要重新配置ECS实例的安全组公网规则,具体操作请参见ECS实例安全组默认的公网规则被删除导致无法ping通。如果不存在,则继续下一步骤检查。 示例 如果根据前述问题场景进行排查和处理后,还是无法正常登录。则建议按照如下步骤逐一排查和分析。 使用不同的客户端SSH及管理终端做对比访问测试,判断是否是个别客户端自身配置或软件运行问题所致。 参阅中间网络问题相关说明,测试网络连通性。 参阅管理终端,登录云服务器,在客户端进行访问测试的同时,执行如下命令,查看相关日志。 tailf /var/log/secure 参考如下命令, 比如ssh -v 192.168.0.1 命令,获取Linux环境中详细的SSH登录交互日志。 ssh -v [$IP] 通过管理终端登录Linux实例,参考如下步骤,检查SSH服务运行状态。 执行如下命令,检查服务运行状态。 service sshd status service sshd restart 正常情况下会返回SSH服务的运行状态及进程PID,系统显示类似如下。 [root@centos ~]# service sshd status openssh-daemon (pid 31350) is running... [root@centos ~]# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] 执行如下命令,检查服务监听状态。 netstat -ano | grep 0.0.0.0:22 正常情况下会返回相应端口监听信息,系统显示类似如下。 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0) 通过管理终端登录Linux实例,执行如下命令。如果能正常登录,则推断是系统防火墙或外部安全组策略等配置异常,导致客户端登录失败。 ssh 127.0.0.1 若用阿里云提供的远程连接功能仍无法成功连接实例,请尝试重启实例。重启操作会使实例停止工作,从而中断业务,请谨慎执行。 提示:重启实例前,需给实例创建快照,用于数据备份或者制作镜像。创建快照的方法请参见创建快照。 登录ECS管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,在目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。
1934890530796658 2020-03-26 09:52:57 0 浏览量 回答数 0

回答

一、内存溢出类型 1、java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况) set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 2、java.lang.OutOfMemoryError: Java heap space 第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。 注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。 垃圾回收GC的角色 JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收: 当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。 根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。 为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收, 一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。 二、JVM内存区域组成 简单的说java中的堆和栈 java把内存分两种:一种是栈内存,另一种是堆内存 1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配; 2。堆内存用来存放由new创建的对象和数组 在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理 堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢; 栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。 java堆分为三个区:New、Old和Permanent GC有两个线程: 新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn java栈存放 栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间 每个线程都有他自己的Stack 三、JVM如何设置虚拟内存 提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。 简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制, 这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了 提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。 提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64; 由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 解决方法:手动设置Heap size 修改TOMCAT_HOME/bin/catalina.bat 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 四、性能检查工具使用 定位内存泄漏: JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。 1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位; 2. 应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次; 3. 应用服务器经常做Full GC(Garbage Collection),而且时间很长,大约需要30-40秒,应用服务器在做Full GC的时候是不响应客户的交易请求的,非常影响系统性能。 因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory,这时应继续跟踪看接下来是否会有下降, 如果一直居高不下这肯定就因为程序的原因导致内存泄漏。 五、不健壮代码的特征及解决办法 1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。 对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率; 2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域; String str = "aaa"; String str2 = "bbb"; String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销; 3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的; 4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。 这是一个案例想定供大家警戒 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误, 检查之后发现问题:组件里的代码 m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes]; 问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。 5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。 6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃 7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!
牧明 2019-12-02 02:16:21 0 浏览量 回答数 0

回答

概述 本文主要介绍无法远程连接Windows实例的排查方法。 详细信息 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 无法远程连接Windows实例的原因较多,可通过以下排查方法,排查并解决无法远程连接Windows实例的问题。 步骤一:使用管理终端登录实例 步骤二:登录密码检查 步骤三:端口及安全组检查 步骤四:远程桌面服务检查 步骤五:网络检查 步骤六:检查CPU负载、带宽及内存使用情况 步骤七:防火墙配置检查 步骤八:系统的安全策略设置 步骤九:远程终端服务的配置检查 步骤十:杀毒软件检查 步骤十一:尝试重启实例 常见报错案例 步骤一:使用管理终端登录实例 无论何种原因导致无法远程连接实例,请先尝试用阿里云提供的远程连接功能进行连接,确认实例还有响应,没有完全宕机,然后再按原因分类进行故障排查。 登录ECS管理控制台,单击左侧导航栏中的 实例,在目标实例右侧单击 远程连接。 在首次连接或忘记连接密码时,单击 修改远程连接密码,修改远程连接的密码。 然后通过远程连接密码连接实例。 步骤二:登录密码检查 在确保登录密码正确的情况下,确认之前是否曾重置过密码。检查重置实例密码后是否未重启实例,如果存在实例密码修改记录,但无重启实例记录,则参考以下操作步骤重启实例。 登录ECS管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。 步骤三:端口及安全组检查 进一步检查端口是否正常,以及安全组规则是否有限制。 参考如何查看和修改Windows实例远程桌面的默认端口,检查实例远程链接的端口是否被修改。如果登录方式改变或者ECS安全组规则中未放行修改后的端口号,则参考如下步骤放行修改后的端口。 注:ECS的安全组规则中默认放行3389端口。修改了远程桌面的端口后,需要在安全组规则中放行修改后的端口号。 登录ECS 管理控制台。 找到该实例,单击 管理 进入 实例详情 页面,切换到 本实例安全组 标签页,单击 配置规则。 在安全组规则页面,单击 添加安全组规则。 在弹出的页面中,端口范围 输入修改后的远程桌面端口号。授权对象 输入客户端的公网IP地址。比如修改后的远程桌面端口号为4389,则 端口范围 应输入“4389/4389”。填写完成后,单击 确定。 通过“IP:端口”的方式进行远程桌面连接。连接方式类似如下。 通过上一步获取的端口,参考如下命令,进行端口测试,判断端口是否正常。如果端口测试失败,请参考使用ping命令正常但端口不通时的端口可用性探测说明进行排查。 telnet [$IP] [$Port] 注: [$IP]指Windows实例的IP地址。 [$Port]指Windows实例的RDP端口号。 系统显示类似如下,比如执行telnet 192.168.0.1 4389命令,正常情况下返回结果类似如下。 Trying 192.168.0.1 ... Connected to 192.168.0.1 4389. Escape character is '^]' 检查Windows远程端口设置是否超出范围,如果超出范围,您需将端口重新修改为0到65535之间,且没有被占用的其它端口,具体操作请参考如下操作。 登录实例,依次选择 开始 > 运行,输入 regedit,然后单击 确认。 打开注册表编辑器,依次选择 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp。 双击 PortNumber,单击 十进制,将原端口由“113322”修改为0到65535之间且不与当前端口冲突的端口,例如5588等端口。 注:“113322”为PortNumber右侧显示的端口号。 再打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Tenninal Server\WinStations\RDP-Tcp。 双击 PortNumber,单击 十进制,将原端口“113322”修改为与第3步一致的端口号。 然后重启主机,确认远程连接成功。 步骤四:远程桌面服务检查 您可以查看Windows服务器的系统是否开启了远程桌面服务。具体操作如下。 使用控制台远程连接功能登录到Windows实例。 右键单击 我的电脑,选择 属性 > 高级系统设置。 在 系统属性 窗口,选择 远程 选项卡,然后勾选 允许运行任意版本远程桌面的计算机连接 即可。 用户为了提高系统安全性,有时错误的将远程桌面服务所依赖的某些关键服务禁用,导致远程桌面服务异常。可通过以下操作进行检查。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 运行。 输入msconfig,单击 确定。 在弹出的窗口中,选择 常规 选项卡,选择 正常启动,然后重启服务器即可。 步骤五:网络检查 无法正常远程连接Windows实例时,需要先检查网络是否正常。 用其他网络环境中(不同网段或不同运营商)的电脑连接对比测试,判断是本地网络问题还是服务器端的问题。如果是本地网络问题或运营商问题,请联系本地IT人员或运营商解决。如果是网卡驱动存在异常,则重新安装。排除本地网络故障后进行下一步检查。 在客户端使用ping命令测试与实例的网络连通性。 网络异常时,请参考网络异常时如何抓取数据包进行排查。 当出现ping丢包或ping不通时,请参考使用ping命令丢包或不通时的链路测试方法进行排查。 如果出现间歇性丢包,ECS实例的网络一直处于不稳定状态时,请参考使用ping命令测试ECS实例的IP地址间歇性丢包进行解决。 在实例中使用ping命令测试与客户端的连通性,提示“一般故障”的错误,请参考Windows实例ping外网地址提示“一般故障”进行解决。 步骤六:检查CPU负载、带宽及内存使用情况 确认是否存在CPU负载过高的情况,如果存在,则参考本步骤解决问题,如果不存在,则执行下一步步骤。 检查CPU负载过高时,通过实例详情页面的终端登录实例,检查后台是否正在执行Windows Update操作。 运行Windows Update来安装最新的微软安全补丁。 若应用程序有大量的磁盘访问、网络访问行为、高计算需求,CPU负载过高是正常结果。您可以尝试升配实例规格来解决资源瓶颈问题。 CPU负载过高的解决方法请参见Windows系统ECS实例的CPU使用率较高的解决方法。 无法远程连接可能是公网带宽不足导致的,具体排查方法如下。可通过续费ECS实例,然后重启实例解决。详情参见手动续费或者自动续费。 登录ECS管理控制台。 找到该实例, 单击 管理 进入 实例详情 页面,查看网络监控数据。 检查服务器带宽是否为“1k”或“0k”。如果购买实例时没有购买公网带宽,后来升级了公网带宽,续费的时候没有选择续费带宽,带宽就会变成“1k”。 远程连接输入用户密码登录后,不能正常显示桌面直接退出,也没有错误信息。这种情况可能是服务器内存不足导致的,需要查看一下服务器的内存使用情况。具体操作如下。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 控制面板 > 管理工具,双击 事件查看器。查看一下是否有内存资源不足的警告日志信息。如有日志信息提示内存不足,具体解决方法参考Windows 虚拟内存不足问题的处理。 步骤七:防火墙配置检查 您只有在已授权可关闭防火墙的情况下,才能进行该项排查。确认防火墙是否已关闭,如果没有关闭,则通过调整防火墙配置策略修复,具体操作请参见如何配置Windows实例远程连接的防火墙。完成操作后,请再进行远程连接,确认连接成功。本文以Windows Server 2012初次登录开启防火墙为例。新购的Windows 2012实例,首次连接服务器是可以的。连接服务器并激活系统后,会提示如下图片中的信息,用户需要单击 是,如果单击 否,服务器会自动开启公网的防火墙,连接会直接断开。此问题可参考以下步骤进行解决。 使用控制台远程连接功能登录到Windows实例。 在菜单栏选择 开始 > 控制面板 。 查看方式 选择 小图标,单击 Windows 防火墙。 在 Windows 防火墙 窗口,单击 高级设置。 在弹出的窗口中,单击 入站规则,在右侧拉至最下方,右键单击 远程桌面-用户模式(TCP-In),选择 启动规则。 返回上一个页面, 单击 Windows 防火墙属性。 选择 启用(推荐),单击 应用。 注意:建议将 域配置文件、专用配置文件、公用配置文件 选项卡下的防火墙全部启用。 更多关于防火墙的设置,请参考设置Windows实例远程连接防火墙。 步骤八:系统的安全策略设置 您可以查看Windows服务器上是否有阻止远程桌面连接的相关安全策略。具体操作如下。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 控制面板 > 管理工具,双击 本地安全策略。 在弹出的窗口中,单击 IP 安全策略,查看是否有相关的安全策略。 如果有,右键单击相关策略,选择 删除,或双击该IP的安全策略来重新配置以允许远程桌面连接。然后再使用远程桌面连接。 步骤九:远程终端服务的配置检查 无法连接Windows实例远程桌面可能是由于以下远程终端服务的配置异常而导致。 异常一:服务器侧自签名证书损坏 客户端如果是Windows 7以上版本的系统,会尝试与服务器建立TLS连接。若服务器侧用于TLS连接的自签名证书损坏,则会导致远程连接失败。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 管理工具 > 远程桌面服务,然后双击 远程桌面会话主机配置。 选择 RDP-Tcp。在RDP-Tcp属性窗口,将 安全层 修改成 RDP安全层。 在操作栏单击 禁用连接,再单击 启用连接 即可。 异常二:远程桌面会话主机配置连接被禁用 使用netstat命令查询,发现端口未正常监听。使用控制台远程连接功能登录到Windows实例后,发现远程桌面RDP连接属性配置文件被禁用。参考服务器侧自签名证书损坏找到RDP连接属性配置文件,如果 RDP-Tcp 被禁用,单击 启用连接 即可。 异常三:终端服务器角色配置 用户在使用远程桌面访问Windows实例时,有时会出现如下提示。这种情况一般是由于在服务器上安装配置了 终端服务器,但是没有配置有效的访问授权导致的。可参见如下两个解决方案处理。 Windows服务器远程桌面提示“没有远程桌面授权服务器可以提供许可证”错误 远程登录Windows实例报“远程桌面用户组没有该权限”错误 步骤十:杀毒软件检查 无法连接远程桌面可能是由于第三方杀毒软件设置导致,可通过以下方法进行解决。此处列举两个安全狗配置导致远程访问失败的解决案例。 如果杀毒软件在后台执行,可通过实例详情页面的终端登录,将杀毒软件升级至最新版本或者直接删除。 请使用商业版杀毒软件,或者使用Microsoft Safety Scanner微软免费安全工具,在安全模式下扫描杀毒,相关信息请访问如下链接。 https://www.microsoft.com/security/scanner/zh-cn/default.aspx 案例一:安全狗黑名单拦截 如果安装了安全狗后,出现如下情况,请确认防护软件中是否做了安全设置或对应的拦截。 客户端本地无法远程桌面连接Windows实例,但其他区域可以远程连接。 无法ping通服务器IP地址,且通过tracert命令跟踪路由,发现无法到达服务器。 云盾未拦截本地公网IP地址。 可打开 服务器安全狗 进行检查,选择 网络防火墙。单击 超级黑名单 的 规则设置,如果黑名单中存在实例公网IP,则将此黑名单规则删除,然后将公网IP添加到 超级白名单。 说明:如果云盾的阈值设置过低,则可能拦截实例公网IP。建议把清洗阈值调高,避免出现拦截实例公网IP的情况发生,具体请参见DDoS基础防护。 案例二:安全狗程序异常 使用控制台远程连接功能登录到Windows实例后,在系统桌面右下角,安全狗弹出错误提示,系统显示类似如下。该问题可能是由于安全狗软件出现异常导致的。可通过Windows系统卸载安全狗软件后,重启服务器,网络即可恢复。 步骤十一:尝试重启实例 若用阿里云提供的远程连接功能仍无法成功连接实例,请尝试重启实例。重启操作会使实例停止工作,从而中断业务,请谨慎执行。 提示:重启实例前,需给实例创建快照,用于数据备份或者制作镜像。创建快照的方法请参见创建快照。 登录ECS 管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,在目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。
1934890530796658 2020-03-25 22:43:56 0 浏览量 回答数 0

问题

【精品问答】Java技术1000问(1)

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的如何学Java、实践中遇到的技术问题、RocketMQ面试、Java容器部署实践等维度内容。 我们会以每...
问问小秘 2019-12-01 21:57:43 39926 浏览量 回答数 17

问题

该来的终于来了:“第一起”基于 IPv6 的 DDoS 攻击

作者介绍 杨彪,蚂蚁金服技术专家,《分布式服务架构:原理、设计与实战》和《可伸缩服务架构:框架与中间件》作者。近10年互联网和游戏行业工作经验,曾在酷我音乐盒、人人游戏...
驻云科技 2019-12-01 21:44:35 4186 浏览量 回答数 1

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)
小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)
小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

问题

【精品问答】python技术1000问(1)

为了方便python开发者快速找到相关技术问题和答案,开发者社区策划了python技术1000问内容,包含最基础的如何学python、实践中遇到的技术问题、python面试等维度内容。 我们会以每天至少50条的...
问问小秘 2019-12-01 21:57:48 456417 浏览量 回答数 22

问题

19年BAT常问面试题汇总:JVM+微服务+多线程+锁+高并发性能

一、Java 并发编程 1、在 java 中守护线程和本地线程区别? 2、线程与进程的区别? 3、什么是多线程中的上下文切换? 4、死锁与活锁的区别,死锁与饥饿的区别ÿ...
游客pklijor6gytpx 2020-01-09 10:31:29 1271 浏览量 回答数 3

回答

详细解答可以参考官方帮助文档 发送访问OSS的请求 您可以直接使用OSS提供的RESTful API接口访问或者使用对API接口进行完整封装的SDK开发包。而每一次向OSS的请求根据当前Bucket权限和操作不同要求用户进行身份验证或者直接匿名访问。对OSS的资源访问的分类如下: 按访问者的角色可分为拥有者访问和第三方用户访问。这里的拥有者指的是Bucket的Owner,也称为开发者。第三方用户是指访问Bucket里资源的用户。 按访问者的身份信息可分为匿名访问和带签名访问。对于OSS来说,如果请求中没有携带任何和身份相关的信息即为匿名访问。带签名访问指的是按照OSS API文档中规定的在请求头部或者在请求URL中携带签名的相关信息。 AccessKey 类型 目前访问 OSS 使用的 AK(AccessKey)有三种类型,具体如下: 阿里云账号AccessKey 阿里云账号AK特指Bucket拥有者的AK,每个阿里云账号提供的AccessKey对拥有的资源有完全的权限。每个阿里云账号能够同时拥有不超过5个active或者inactive的AK对(AccessKeyId和AccessKeySecret)。 用户可以登录AccessKey管理控制台,申请新增或删除AK对。 每个AK对都有active/inactive两种状态。 Active 表明用户的 AK 处于激活状态,可以在身份验证的时候使用。 Inactive 表明用户的 AK 处于非激活状态,不能在身份验证的时候使用。 说明 请避免直接使用阿里云账户的 AccessKey。 RAM子账号AccessKey RAM (Resource Access Management) 是阿里云提供的资源访问控制服务。RAM账号AK指的是通过RAM被授权的AK。这组AK只能按照RAM定义的规则去访问Bucket里的资源。通过RAM,您可以集中管理您的用户(比如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限。比如能够限制您的用户只拥有对某一个Bucket的读权限。子账号是从属于主账号的,并且这些账号下不能拥有实际的任何资源,所有资源都属于主账号。 STS账号AccessKey STS(Security Token Service)是阿里云提供的临时访问凭证服务。STS账号AK指的是通过STS颁发的AK。这组AK只能按照STS定义的规则去访问Bucket里的资源。 身份验证具体实现 目前主要有三种身份验证方式: AK验证 RAM验证 STS验证 当用户以个人身份向OSS发送请求时,其身份验证的实现如下: 用户将发送的请求按照OSS指定的格式生成签名字符串。 用户使用AccessKeySecret对签名字符串进行加密产生验证码。 OSS收到请求以后,通过AccessKeyId找到对应的AccessKeySecret,以同样的方法提取签名字符串和验证码。 如果计算出来的验证码和提供的一样即认为该请求是有效的。 否则,OSS将拒绝处理这次请求,并返回HTTP 403错误。 对于用户来说可以直接使用OSS提供的SDK,配合不同类型的AccessKey即可实现不同的身份验证。 权限控制 针对存放在Bucket的Object的访问,OSS提供了多种权限控制,主要有: Bucket级别权限 Object级别权限 账号级别权限(RAM) 临时账号权限(STS) Bucket级别权限 Bucket权限类型 OSS提供ACL(Access Control List)权限控制方法,OSS ACL提供Bucket级别的权限访问控制,Bucket目前有三种访问权限:public-read-write,public-read和private,它们的含义如下: 权限值 中文名称 权限对访问者的限制 public-read-write 公共读写 任何人(包括匿名访问)都可以对该Bucket中的Object进行读/写/删除操作;所有这些操作产生的费用由该Bucket的Owner承担,请慎用该权限。 public-read 公共读,私有写 只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行写/删除操作;任何人(包括匿名访问)可以对Object进行读操作。 private 私有读写 只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行读/写/删除操作;其他人在未经授权的情况下无法访问该Bucket内的Object。 Bucket权限设定和读取方法 功能使用参考: API:Put BucketACL SDK:Java SDK-设置Bucket ACL 控制台:创建Bucket权限设置 API:Get BucketACL SDK:Java SDK-获取Bucket ACL Object级别权限 Object权限类型 OSS ACL也提供Object级别的权限访问控制。目前Object有四种访问权限:private, public-read, public-read-write, default。Put Object ACL操作通过Put请求中的“x-oss-object-acl”头来设置,这个操作只有Bucket Owner有权限执行。 权限值 中文名称 权限对访问者的限制 public-read-write 公共读写 该ACL表明某个Object是公共读写资源,即所有用户拥有对该Object的读写权限。 public-read 公共读,私有写 该ACL表明某个Object是公共读资源,即非Object Owner只有该Object的读权限,而Object Owner拥有该Object的读写权限。 private 私有读写 该ACL表明某个Object是私有资源,即只有该Object的Owner拥有该Object的读写权限,其他的用户没有权限操作该Object。 default 默认权限 该ACL表明某个Object是遵循Bucket读写权限的资源,即Bucket是什么权限,Object就是什么权限。 说明 如果没有设置Object的权限,即Object的ACL为default,Object的权限和Bucket权限一致。 如果设置了Object的权限,Object的权限大于Bucket权限。举个例子,如果设置了Object的权限是public-read,无论Bucket是什么权限,该Object都可以被身份验证访问和匿名访问。 Object权限设定和读取方法 功能使用参考: API:Put Object ACL SDK:Java SDK-ObjectACL 中设定Object ACL API:Get Object ACL SDK:Java SDK-ObjectACL 中读取Object ACL 账号级别权限(RAM) 使用场景 如果您购买了云资源,您的组织里有多个用户需要使用这些云资源,这些用户只能共享使用您的云账号AccessKey。这里有两个问题: 您的密钥由多人共享,泄露的风险很高。 您无法控制特定用户能访问哪些资源(比如Bucket)的权限。 解决方法:在您的阿里云账号下面,通过RAM可以创建具有自己AccessKey的子用户。您的阿里云账号被称为主账号,创建出来的账号被称为子账号,使用子账号的AccessKey只能使用主账号授权的操作和资源。 具体实现 有关RAM详情,请参考RAM用户手册。 对于授权中需要的Policy的配置方式可以参考本章最后一节:RAM和STS授权策略(Policy)配置。 临时账号权限(STS) 使用场景 对于您本地身份系统所管理的用户,比如您的App的用户、您的企业本地账号、第三方App,也有直接访问OSS资源的可能,将这部分用户称为联盟用户。此外,用户还可以是您创建的能访问您的阿里云资源的应用程序。 对于这部分联盟用户,通过阿里云STS (Security Token Service) 服务为阿里云账号(或RAM用户)提供短期访问权限管理。您不需要透露云账号(或RAM用户)的长期密钥(如登录密码、AccessKey),只需要生成一个短期访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,访问凭证过期后会自动失效。 用户通过STS生成的凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)。使用AccessKey方法与您在使用阿里云账户或RAM用户AccessKey发送请求时的方法相同。此外还需要注意的是在每个向OSS发送的请求中必须携带安全令牌。 具体实现 STS安全令牌、角色管理和使用相关内容详情,请参考RAM用户指南中的角色管理。关键是调用STS服务接口AssumeRole来获取有效访问凭证即可,也可以直接使用STS SDK来调用该方法。 RAM和STS应用场景实践 对于不同的应用场景,涉及到的访问身份验证方式可能存在差异。下面以几种典型的应用场景来说明访问身份验证中几种使用方式。 以一个移动App举例。假设您是一个移动App开发者,打算使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离,防止一个App用户获取到其它App用户的数据。 方式一:使用AppServer来做数据中转和数据隔离如上图所示,您需要开发一个AppServer。只有AppServer能访问云服务,ClientApp的每次读写数据都需要通过AppServer,AppServer来保证不同用户数据的隔离访问。 对于该种使用方式,使用阿里云账号或者RAM账号提供的密钥来进行签名验证访问。建议您尽量不要直接使用阿里云账号(主账号)的密钥访问OSS,避免出现安全问题。 方式二:使用STS让用户直接访问OSS STS方案描述如下图所示:方案的详细描述如下: App用户登录。App用户和云账号无关,它是App的终端用户,AppServer支持App用户登录。对于每个有效的App用户来说,需要AppServer能定义出每个App用户的最小访问权限。 AppServer请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,AppServer需要确定App用户的最小访问权限(用Policy语法描述)以及授权的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌。 STS返回给AppServer一个有效的访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)以及过期时间。 AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证。 ClientApp使用本地缓存的访问凭证去请求Aliyun Service API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,正确响应用户请求。 RAM和STS授权策略(Policy)配置 对于RAM或者STS授权中使用Policy,详细规则如下。 示例 先看下面的一个Policy示例: { "Version": "1", "Statement": [ { "Action": [ "oss:GetBucketAcl", "oss:ListObjects" ], "Resource": [ "acs:oss:*:1775305056529849:mybucket" ], "Effect": "Allow", "Condition": { "StringEquals": { "acs:UserAgent": "java-sdk", "oss:Prefix": "foo" }, "IpAddress": { "acs:SourceIp": "192.168.0.1" } } }, { "Action": [ "oss:PutObject", "oss:GetObject", "oss:DeleteObject" ], "Resource": [ "acs:oss:*:1775305056529849:mybucket/file*" ], "Effect": "Allow", "Condition": { "IpAddress": { "acs:SourceIp": "192.168.0.1" } } } ] } 这是一个授权的Policy,用户用这样的一个Policy通过RAM或STS服务向其他用户授权。Policy当中有一个Statement(一条Policy当中可以有多条Statement)。Statement里面规定了相应的Action、Resource、Effect和Condition。 这条Policy把用户自己名下的mybucket和mybucket/file*这些资源授权给相应的用户,并且支持GetBucketAcl、GetBucket、PutObject、GetObject和DeleteObject这几种操作。Condition中的条件表示UserAgent为java-sdk,源IP为192.168.0.1的时候鉴权才能通过,被授权的用户才能访问相关的资源。Prefix这个Condition是在GetBucket(ListObjects)的时候起作用的,关于这个字段的解释详见OSS的API文档。 配置细则 Version Version定义了Policy的版本,本文档中sw2q的配置方式,设置为1。 Statement 通过Statement描述授权语义,其中可以根据业务场景包含多条语义,每条包含对Action、Effect、Resource和Condition的描述。每次请求系统会逐条依次匹配检查,所有匹配成功的Statement会根据Effect的设置不同分为通过(Allow)、禁止(Deny),其中禁止(Deny)的优先。如果匹配成功的都为通过,该条请求即鉴权通过。如果匹配成功有一条禁止,或者没有任何条目匹配成功,该条请求被禁止访问。 Action Action分为三大类:Service级别操作,对应的是GetService操作,用来列出所有属于该用户的Bucket列表。 Bucket级别操作,对应类似于oss:PutBucketAcl、oss:GetBucketLocation之类的操作,操作的对象是Bucket,它们的名称和相应的接口名称一一对应。 Object级别操作,分为oss:GetObject、oss:PutObject、oss:DeleteObject和oss:AbortMultipartUpload,操作对象是Object。 如想授权某一类的Object的操作,可以选择这几种的一种或几种。另外,所有的Action前面都必须加上oss:,如上面例子所示。Action是一个列表,可以有多个Action。具体的Action和API接口的对应关系如下: Service级别 API Action GetService(ListBuckets) oss:ListBuckets Bucket级别 API Action PutBucket oss:PutBucket GetBucket(ListObjects) oss:ListObjects PutBucketAcl oss:PutBucketAcl DeleteBucket oss:DeleteBucket GetBucketLocation oss:GetBucketLocation GetBucketAcl oss:GetBucketAcl GetBucketLogging oss:GetBucketLogging PutBucketLogging oss:PutBucketLogging DeleteBucketLogging oss:DeleteBucketLogging GetBucketWebsite oss:GetBucketWebsite PutBucketWebsite oss:PutBucketWebsite DeleteBucketWebsite oss:DeleteBucketWebsite GetBucketReferer oss:GetBucketReferer PutBucketReferer oss:PutBucketReferer GetBucketLifecycle oss:GetBucketLifecycle PutBucketLifecycle oss:PutBucketLifecycle DeleteBucketLifecycle oss:DeleteBucketLifecycle ListMultipartUploads oss:ListMultipartUploads PutBucketCors oss:PutBucketCors GetBucketCors oss:GetBucketCors DeleteBucketCors oss:DeleteBucketCors PutBucketReplication oss:PutBucketReplication GetBucketReplication oss:GetBucketReplication DeleteBucketReplication oss:DeleteBucketReplication GetBucketReplicationLocation oss:GetBucketReplicationLocation GetBucketReplicationProgress oss:GetBucketReplicationProgress Object级别 API Action GetObject oss:GetObject HeadObject oss:GetObject PutObject oss:PutObject PostObject oss:PutObject InitiateMultipartUpload oss:PutObject UploadPart oss:PutObject CompleteMultipart oss:PutObject DeleteObject oss:DeleteObject DeleteMultipartObjects oss:DeleteObject AbortMultipartUpload oss:AbortMultipartUpload ListParts oss:ListParts CopyObject oss:GetObject,oss:PutObject UploadPartCopy oss:GetObject,oss:PutObject AppendObject oss:PutObject GetObjectAcl oss:GetObjectAcl PutObjectAcl oss:PutObjectAcl Resource Resource指代的是OSS上面的某个具体的资源或者某些资源(支持*通配),resource的规则是acs:oss:{region}:{bucket_owner}:{bucket_name}/{object_name}。对于所有Bucket级别的操作来说不需要最后的斜杠和{object_name},即acs:oss:{region}:{bucket_owner}:{bucket_name}。Resource也是一个列表,可以有多个Resource。其中的region字段暂时不做支持,设置为*。 Effect Effect代表本条的Statement的授权的结果,分为Allow和Deny,分别指代通过和禁止。多条Statement同时匹配成功时,禁止(Deny)的优先级更高。 例如,期望禁止用户对某一目录进行删除,但对于其他文件有全部权限: { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:*" ], "Resource": [ "acs:oss:*:*:bucketname" ] }, { "Effect": "Deny", "Action": [ "oss:DeleteObject" ], "Resource": [ "acs:oss:*:*:bucketname/index/*", ] } ] } Condition Condition代表Policy授权的一些条件,上面的示例里面可以设置对于acs:UserAgent的检查、acs:SourceIp的检查、还有oss:Prefix这项用来在GetBucket的时候对资源进行限制。 OSS支持的Condition如下: condition 功能 合法取值 acs:SourceIp 指定ip网段 普通的ip,支持*通配 acs:UserAgent 指定http useragent头 字符串 acs:CurrentTime 指定合法的访问时间 ISO8601格式 acs:SecureTransport 是否是https协议 “true”或者”false” oss:Prefix 用作ListObjects时的prefix 合法的object name 更多示例 针对具体场景更多的授权策略配置示例,可以参考教程示例:控制存储空间和文件夹的访问权限和OSS授权常见问题。 Policy在线图形化便捷配置工具,请单击这里。 最佳实践 RAM和STS使用指南
2019-12-01 23:12:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 发送访问OSS的请求 您可以直接使用OSS提供的RESTful API接口访问或者使用对API接口进行完整封装的SDK开发包。而每一次向OSS的请求根据当前Bucket权限和操作不同要求用户进行身份验证或者直接匿名访问。对OSS的资源访问的分类如下: 按访问者的角色可分为拥有者访问和第三方用户访问。这里的拥有者指的是Bucket的Owner,也称为开发者。第三方用户是指访问Bucket里资源的用户。 按访问者的身份信息可分为匿名访问和带签名访问。对于OSS来说,如果请求中没有携带任何和身份相关的信息即为匿名访问。带签名访问指的是按照OSS API文档中规定的在请求头部或者在请求URL中携带签名的相关信息。 AccessKey 类型 目前访问 OSS 使用的 AK(AccessKey)有三种类型,具体如下: 阿里云账号AccessKey 阿里云账号AK特指Bucket拥有者的AK,每个阿里云账号提供的AccessKey对拥有的资源有完全的权限。每个阿里云账号能够同时拥有不超过5个active或者inactive的AK对(AccessKeyId和AccessKeySecret)。 用户可以登录AccessKey管理控制台,申请新增或删除AK对。 每个AK对都有active/inactive两种状态。 Active 表明用户的 AK 处于激活状态,可以在身份验证的时候使用。 Inactive 表明用户的 AK 处于非激活状态,不能在身份验证的时候使用。 说明 请避免直接使用阿里云账户的 AccessKey。 RAM子账号AccessKey RAM (Resource Access Management) 是阿里云提供的资源访问控制服务。RAM账号AK指的是通过RAM被授权的AK。这组AK只能按照RAM定义的规则去访问Bucket里的资源。通过RAM,您可以集中管理您的用户(比如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限。比如能够限制您的用户只拥有对某一个Bucket的读权限。子账号是从属于主账号的,并且这些账号下不能拥有实际的任何资源,所有资源都属于主账号。 STS账号AccessKey STS(Security Token Service)是阿里云提供的临时访问凭证服务。STS账号AK指的是通过STS颁发的AK。这组AK只能按照STS定义的规则去访问Bucket里的资源。 身份验证具体实现 目前主要有三种身份验证方式: AK验证 RAM验证 STS验证 当用户以个人身份向OSS发送请求时,其身份验证的实现如下: 用户将发送的请求按照OSS指定的格式生成签名字符串。 用户使用AccessKeySecret对签名字符串进行加密产生验证码。 OSS收到请求以后,通过AccessKeyId找到对应的AccessKeySecret,以同样的方法提取签名字符串和验证码。 如果计算出来的验证码和提供的一样即认为该请求是有效的。 否则,OSS将拒绝处理这次请求,并返回HTTP 403错误。 对于用户来说可以直接使用OSS提供的SDK,配合不同类型的AccessKey即可实现不同的身份验证。 权限控制 针对存放在Bucket的Object的访问,OSS提供了多种权限控制,主要有: Bucket级别权限 Object级别权限 账号级别权限(RAM) 临时账号权限(STS) Bucket级别权限 Bucket权限类型 OSS提供ACL(Access Control List)权限控制方法,OSS ACL提供Bucket级别的权限访问控制,Bucket目前有三种访问权限:public-read-write,public-read和private,它们的含义如下: 权限值 中文名称 权限对访问者的限制 public-read-write 公共读写 任何人(包括匿名访问)都可以对该Bucket中的Object进行读/写/删除操作;所有这些操作产生的费用由该Bucket的Owner承担,请慎用该权限。 public-read 公共读,私有写 只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行写/删除操作;任何人(包括匿名访问)可以对Object进行读操作。 private 私有读写 只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行读/写/删除操作;其他人在未经授权的情况下无法访问该Bucket内的Object。 Bucket权限设定和读取方法 功能使用参考: API:Put BucketACL SDK:Java SDK-设置Bucket ACL 控制台:创建Bucket权限设置 API:Get BucketACL SDK:Java SDK-获取Bucket ACL Object级别权限 Object权限类型 OSS ACL也提供Object级别的权限访问控制。目前Object有四种访问权限:private, public-read, public-read-write, default。Put Object ACL操作通过Put请求中的“x-oss-object-acl”头来设置,这个操作只有Bucket Owner有权限执行。 权限值 中文名称 权限对访问者的限制 public-read-write 公共读写 该ACL表明某个Object是公共读写资源,即所有用户拥有对该Object的读写权限。 public-read 公共读,私有写 该ACL表明某个Object是公共读资源,即非Object Owner只有该Object的读权限,而Object Owner拥有该Object的读写权限。 private 私有读写 该ACL表明某个Object是私有资源,即只有该Object的Owner拥有该Object的读写权限,其他的用户没有权限操作该Object。 default 默认权限 该ACL表明某个Object是遵循Bucket读写权限的资源,即Bucket是什么权限,Object就是什么权限。 说明 如果没有设置Object的权限,即Object的ACL为default,Object的权限和Bucket权限一致。 如果设置了Object的权限,Object的权限大于Bucket权限。举个例子,如果设置了Object的权限是public-read,无论Bucket是什么权限,该Object都可以被身份验证访问和匿名访问。 Object权限设定和读取方法 功能使用参考: API:Put Object ACL SDK:Java SDK-ObjectACL 中设定Object ACL API:Get Object ACL SDK:Java SDK-ObjectACL 中读取Object ACL 账号级别权限(RAM) 使用场景 如果您购买了云资源,您的组织里有多个用户需要使用这些云资源,这些用户只能共享使用您的云账号AccessKey。这里有两个问题: 您的密钥由多人共享,泄露的风险很高。 您无法控制特定用户能访问哪些资源(比如Bucket)的权限。 解决方法:在您的阿里云账号下面,通过RAM可以创建具有自己AccessKey的子用户。您的阿里云账号被称为主账号,创建出来的账号被称为子账号,使用子账号的AccessKey只能使用主账号授权的操作和资源。 具体实现 有关RAM详情,请参考RAM用户手册。 对于授权中需要的Policy的配置方式可以参考本章最后一节:RAM和STS授权策略(Policy)配置。 临时账号权限(STS) 使用场景 对于您本地身份系统所管理的用户,比如您的App的用户、您的企业本地账号、第三方App,也有直接访问OSS资源的可能,将这部分用户称为联盟用户。此外,用户还可以是您创建的能访问您的阿里云资源的应用程序。 对于这部分联盟用户,通过阿里云STS (Security Token Service) 服务为阿里云账号(或RAM用户)提供短期访问权限管理。您不需要透露云账号(或RAM用户)的长期密钥(如登录密码、AccessKey),只需要生成一个短期访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,访问凭证过期后会自动失效。 用户通过STS生成的凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)。使用AccessKey方法与您在使用阿里云账户或RAM用户AccessKey发送请求时的方法相同。此外还需要注意的是在每个向OSS发送的请求中必须携带安全令牌。 具体实现 STS安全令牌、角色管理和使用相关内容详情,请参考RAM用户指南中的角色管理。关键是调用STS服务接口AssumeRole来获取有效访问凭证即可,也可以直接使用STS SDK来调用该方法。 RAM和STS应用场景实践 对于不同的应用场景,涉及到的访问身份验证方式可能存在差异。下面以几种典型的应用场景来说明访问身份验证中几种使用方式。 以一个移动App举例。假设您是一个移动App开发者,打算使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离,防止一个App用户获取到其它App用户的数据。 方式一:使用AppServer来做数据中转和数据隔离如上图所示,您需要开发一个AppServer。只有AppServer能访问云服务,ClientApp的每次读写数据都需要通过AppServer,AppServer来保证不同用户数据的隔离访问。 对于该种使用方式,使用阿里云账号或者RAM账号提供的密钥来进行签名验证访问。建议您尽量不要直接使用阿里云账号(主账号)的密钥访问OSS,避免出现安全问题。 方式二:使用STS让用户直接访问OSS STS方案描述如下图所示:方案的详细描述如下: App用户登录。App用户和云账号无关,它是App的终端用户,AppServer支持App用户登录。对于每个有效的App用户来说,需要AppServer能定义出每个App用户的最小访问权限。 AppServer请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,AppServer需要确定App用户的最小访问权限(用Policy语法描述)以及授权的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌。 STS返回给AppServer一个有效的访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)以及过期时间。 AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证。 ClientApp使用本地缓存的访问凭证去请求Aliyun Service API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,正确响应用户请求。 RAM和STS授权策略(Policy)配置 对于RAM或者STS授权中使用Policy,详细规则如下。 示例 先看下面的一个Policy示例: { "Version": "1", "Statement": [ { "Action": [ "oss:GetBucketAcl", "oss:ListObjects" ], "Resource": [ "acs:oss:*:1775305056529849:mybucket" ], "Effect": "Allow", "Condition": { "StringEquals": { "acs:UserAgent": "java-sdk", "oss:Prefix": "foo" }, "IpAddress": { "acs:SourceIp": "192.168.0.1" } } }, { "Action": [ "oss:PutObject", "oss:GetObject", "oss:DeleteObject" ], "Resource": [ "acs:oss:*:1775305056529849:mybucket/file*" ], "Effect": "Allow", "Condition": { "IpAddress": { "acs:SourceIp": "192.168.0.1" } } } ] } 这是一个授权的Policy,用户用这样的一个Policy通过RAM或STS服务向其他用户授权。Policy当中有一个Statement(一条Policy当中可以有多条Statement)。Statement里面规定了相应的Action、Resource、Effect和Condition。 这条Policy把用户自己名下的mybucket和mybucket/file*这些资源授权给相应的用户,并且支持GetBucketAcl、GetBucket、PutObject、GetObject和DeleteObject这几种操作。Condition中的条件表示UserAgent为java-sdk,源IP为192.168.0.1的时候鉴权才能通过,被授权的用户才能访问相关的资源。Prefix这个Condition是在GetBucket(ListObjects)的时候起作用的,关于这个字段的解释详见OSS的API文档。 配置细则 Version Version定义了Policy的版本,本文档中sw2q的配置方式,设置为1。 Statement 通过Statement描述授权语义,其中可以根据业务场景包含多条语义,每条包含对Action、Effect、Resource和Condition的描述。每次请求系统会逐条依次匹配检查,所有匹配成功的Statement会根据Effect的设置不同分为通过(Allow)、禁止(Deny),其中禁止(Deny)的优先。如果匹配成功的都为通过,该条请求即鉴权通过。如果匹配成功有一条禁止,或者没有任何条目匹配成功,该条请求被禁止访问。 Action Action分为三大类:Service级别操作,对应的是GetService操作,用来列出所有属于该用户的Bucket列表。 Bucket级别操作,对应类似于oss:PutBucketAcl、oss:GetBucketLocation之类的操作,操作的对象是Bucket,它们的名称和相应的接口名称一一对应。 Object级别操作,分为oss:GetObject、oss:PutObject、oss:DeleteObject和oss:AbortMultipartUpload,操作对象是Object。 如想授权某一类的Object的操作,可以选择这几种的一种或几种。另外,所有的Action前面都必须加上oss:,如上面例子所示。Action是一个列表,可以有多个Action。具体的Action和API接口的对应关系如下: Service级别 API Action GetService(ListBuckets) oss:ListBuckets Bucket级别 API Action PutBucket oss:PutBucket GetBucket(ListObjects) oss:ListObjects PutBucketAcl oss:PutBucketAcl DeleteBucket oss:DeleteBucket GetBucketLocation oss:GetBucketLocation GetBucketAcl oss:GetBucketAcl GetBucketLogging oss:GetBucketLogging PutBucketLogging oss:PutBucketLogging DeleteBucketLogging oss:DeleteBucketLogging GetBucketWebsite oss:GetBucketWebsite PutBucketWebsite oss:PutBucketWebsite DeleteBucketWebsite oss:DeleteBucketWebsite GetBucketReferer oss:GetBucketReferer PutBucketReferer oss:PutBucketReferer GetBucketLifecycle oss:GetBucketLifecycle PutBucketLifecycle oss:PutBucketLifecycle DeleteBucketLifecycle oss:DeleteBucketLifecycle ListMultipartUploads oss:ListMultipartUploads PutBucketCors oss:PutBucketCors GetBucketCors oss:GetBucketCors DeleteBucketCors oss:DeleteBucketCors PutBucketReplication oss:PutBucketReplication GetBucketReplication oss:GetBucketReplication DeleteBucketReplication oss:DeleteBucketReplication GetBucketReplicationLocation oss:GetBucketReplicationLocation GetBucketReplicationProgress oss:GetBucketReplicationProgress Object级别 API Action GetObject oss:GetObject HeadObject oss:GetObject PutObject oss:PutObject PostObject oss:PutObject InitiateMultipartUpload oss:PutObject UploadPart oss:PutObject CompleteMultipart oss:PutObject DeleteObject oss:DeleteObject DeleteMultipartObjects oss:DeleteObject AbortMultipartUpload oss:AbortMultipartUpload ListParts oss:ListParts CopyObject oss:GetObject,oss:PutObject UploadPartCopy oss:GetObject,oss:PutObject AppendObject oss:PutObject GetObjectAcl oss:GetObjectAcl PutObjectAcl oss:PutObjectAcl Resource Resource指代的是OSS上面的某个具体的资源或者某些资源(支持*通配),resource的规则是acs:oss:{region}:{bucket_owner}:{bucket_name}/{object_name}。对于所有Bucket级别的操作来说不需要最后的斜杠和{object_name},即acs:oss:{region}:{bucket_owner}:{bucket_name}。Resource也是一个列表,可以有多个Resource。其中的region字段暂时不做支持,设置为*。 Effect Effect代表本条的Statement的授权的结果,分为Allow和Deny,分别指代通过和禁止。多条Statement同时匹配成功时,禁止(Deny)的优先级更高。 例如,期望禁止用户对某一目录进行删除,但对于其他文件有全部权限: { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:*" ], "Resource": [ "acs:oss:*:*:bucketname" ] }, { "Effect": "Deny", "Action": [ "oss:DeleteObject" ], "Resource": [ "acs:oss:*:*:bucketname/index/*", ] } ] } Condition Condition代表Policy授权的一些条件,上面的示例里面可以设置对于acs:UserAgent的检查、acs:SourceIp的检查、还有oss:Prefix这项用来在GetBucket的时候对资源进行限制。 OSS支持的Condition如下: condition 功能 合法取值 acs:SourceIp 指定ip网段 普通的ip,支持*通配 acs:UserAgent 指定http useragent头 字符串 acs:CurrentTime 指定合法的访问时间 ISO8601格式 acs:SecureTransport 是否是https协议 “true”或者”false” oss:Prefix 用作ListObjects时的prefix 合法的object name 更多示例 针对具体场景更多的授权策略配置示例,可以参考教程示例:控制存储空间和文件夹的访问权限和OSS授权常见问题。 Policy在线图形化便捷配置工具,请单击这里。 最佳实践 RAM和STS使用指南
2019-12-01 23:12:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 发送访问OSS的请求 您可以直接使用OSS提供的RESTful API接口访问或者使用对API接口进行完整封装的SDK开发包。而每一次向OSS的请求根据当前Bucket权限和操作不同要求用户进行身份验证或者直接匿名访问。对OSS的资源访问的分类如下: 按访问者的角色可分为拥有者访问和第三方用户访问。这里的拥有者指的是Bucket的Owner,也称为开发者。第三方用户是指访问Bucket里资源的用户。 按访问者的身份信息可分为匿名访问和带签名访问。对于OSS来说,如果请求中没有携带任何和身份相关的信息即为匿名访问。带签名访问指的是按照OSS API文档中规定的在请求头部或者在请求URL中携带签名的相关信息。 AccessKey 类型 目前访问 OSS 使用的 AK(AccessKey)有三种类型,具体如下: 阿里云账号AccessKey 阿里云账号AK特指Bucket拥有者的AK,每个阿里云账号提供的AccessKey对拥有的资源有完全的权限。每个阿里云账号能够同时拥有不超过5个active或者inactive的AK对(AccessKeyId和AccessKeySecret)。 用户可以登录AccessKey管理控制台,申请新增或删除AK对。 每个AK对都有active/inactive两种状态。 Active 表明用户的 AK 处于激活状态,可以在身份验证的时候使用。 Inactive 表明用户的 AK 处于非激活状态,不能在身份验证的时候使用。 说明 请避免直接使用阿里云账户的 AccessKey。 RAM子账号AccessKey RAM (Resource Access Management) 是阿里云提供的资源访问控制服务。RAM账号AK指的是通过RAM被授权的AK。这组AK只能按照RAM定义的规则去访问Bucket里的资源。通过RAM,您可以集中管理您的用户(比如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限。比如能够限制您的用户只拥有对某一个Bucket的读权限。子账号是从属于主账号的,并且这些账号下不能拥有实际的任何资源,所有资源都属于主账号。 STS账号AccessKey STS(Security Token Service)是阿里云提供的临时访问凭证服务。STS账号AK指的是通过STS颁发的AK。这组AK只能按照STS定义的规则去访问Bucket里的资源。 身份验证具体实现 目前主要有三种身份验证方式: AK验证 RAM验证 STS验证 当用户以个人身份向OSS发送请求时,其身份验证的实现如下: 用户将发送的请求按照OSS指定的格式生成签名字符串。 用户使用AccessKeySecret对签名字符串进行加密产生验证码。 OSS收到请求以后,通过AccessKeyId找到对应的AccessKeySecret,以同样的方法提取签名字符串和验证码。 如果计算出来的验证码和提供的一样即认为该请求是有效的。 否则,OSS将拒绝处理这次请求,并返回HTTP 403错误。 对于用户来说可以直接使用OSS提供的SDK,配合不同类型的AccessKey即可实现不同的身份验证。 权限控制 针对存放在Bucket的Object的访问,OSS提供了多种权限控制,主要有: Bucket级别权限 Object级别权限 账号级别权限(RAM) 临时账号权限(STS) Bucket级别权限 Bucket权限类型 OSS提供ACL(Access Control List)权限控制方法,OSS ACL提供Bucket级别的权限访问控制,Bucket目前有三种访问权限:public-read-write,public-read和private,它们的含义如下: 权限值 中文名称 权限对访问者的限制 public-read-write 公共读写 任何人(包括匿名访问)都可以对该Bucket中的Object进行读/写/删除操作;所有这些操作产生的费用由该Bucket的Owner承担,请慎用该权限。 public-read 公共读,私有写 只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行写/删除操作;任何人(包括匿名访问)可以对Object进行读操作。 private 私有读写 只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行读/写/删除操作;其他人在未经授权的情况下无法访问该Bucket内的Object。 Bucket权限设定和读取方法 功能使用参考: API:Put BucketACL SDK:Java SDK-设置Bucket ACL 控制台:创建Bucket权限设置 API:Get BucketACL SDK:Java SDK-获取Bucket ACL Object级别权限 Object权限类型 OSS ACL也提供Object级别的权限访问控制。目前Object有四种访问权限:private, public-read, public-read-write, default。Put Object ACL操作通过Put请求中的“x-oss-object-acl”头来设置,这个操作只有Bucket Owner有权限执行。 权限值 中文名称 权限对访问者的限制 public-read-write 公共读写 该ACL表明某个Object是公共读写资源,即所有用户拥有对该Object的读写权限。 public-read 公共读,私有写 该ACL表明某个Object是公共读资源,即非Object Owner只有该Object的读权限,而Object Owner拥有该Object的读写权限。 private 私有读写 该ACL表明某个Object是私有资源,即只有该Object的Owner拥有该Object的读写权限,其他的用户没有权限操作该Object。 default 默认权限 该ACL表明某个Object是遵循Bucket读写权限的资源,即Bucket是什么权限,Object就是什么权限。 说明 如果没有设置Object的权限,即Object的ACL为default,Object的权限和Bucket权限一致。 如果设置了Object的权限,Object的权限大于Bucket权限。举个例子,如果设置了Object的权限是public-read,无论Bucket是什么权限,该Object都可以被身份验证访问和匿名访问。 Object权限设定和读取方法 功能使用参考: API:Put Object ACL SDK:Java SDK-ObjectACL 中设定Object ACL API:Get Object ACL SDK:Java SDK-ObjectACL 中读取Object ACL 账号级别权限(RAM) 使用场景 如果您购买了云资源,您的组织里有多个用户需要使用这些云资源,这些用户只能共享使用您的云账号AccessKey。这里有两个问题: 您的密钥由多人共享,泄露的风险很高。 您无法控制特定用户能访问哪些资源(比如Bucket)的权限。 解决方法:在您的阿里云账号下面,通过RAM可以创建具有自己AccessKey的子用户。您的阿里云账号被称为主账号,创建出来的账号被称为子账号,使用子账号的AccessKey只能使用主账号授权的操作和资源。 具体实现 有关RAM详情,请参考RAM用户手册。 对于授权中需要的Policy的配置方式可以参考本章最后一节:RAM和STS授权策略(Policy)配置。 临时账号权限(STS) 使用场景 对于您本地身份系统所管理的用户,比如您的App的用户、您的企业本地账号、第三方App,也有直接访问OSS资源的可能,将这部分用户称为联盟用户。此外,用户还可以是您创建的能访问您的阿里云资源的应用程序。 对于这部分联盟用户,通过阿里云STS (Security Token Service) 服务为阿里云账号(或RAM用户)提供短期访问权限管理。您不需要透露云账号(或RAM用户)的长期密钥(如登录密码、AccessKey),只需要生成一个短期访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,访问凭证过期后会自动失效。 用户通过STS生成的凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)。使用AccessKey方法与您在使用阿里云账户或RAM用户AccessKey发送请求时的方法相同。此外还需要注意的是在每个向OSS发送的请求中必须携带安全令牌。 具体实现 STS安全令牌、角色管理和使用相关内容详情,请参考RAM用户指南中的角色管理。关键是调用STS服务接口AssumeRole来获取有效访问凭证即可,也可以直接使用STS SDK来调用该方法。 RAM和STS应用场景实践 对于不同的应用场景,涉及到的访问身份验证方式可能存在差异。下面以几种典型的应用场景来说明访问身份验证中几种使用方式。 以一个移动App举例。假设您是一个移动App开发者,打算使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离,防止一个App用户获取到其它App用户的数据。 方式一:使用AppServer来做数据中转和数据隔离如上图所示,您需要开发一个AppServer。只有AppServer能访问云服务,ClientApp的每次读写数据都需要通过AppServer,AppServer来保证不同用户数据的隔离访问。 对于该种使用方式,使用阿里云账号或者RAM账号提供的密钥来进行签名验证访问。建议您尽量不要直接使用阿里云账号(主账号)的密钥访问OSS,避免出现安全问题。 方式二:使用STS让用户直接访问OSS STS方案描述如下图所示:方案的详细描述如下: App用户登录。App用户和云账号无关,它是App的终端用户,AppServer支持App用户登录。对于每个有效的App用户来说,需要AppServer能定义出每个App用户的最小访问权限。 AppServer请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,AppServer需要确定App用户的最小访问权限(用Policy语法描述)以及授权的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌。 STS返回给AppServer一个有效的访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)以及过期时间。 AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证。 ClientApp使用本地缓存的访问凭证去请求Aliyun Service API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,正确响应用户请求。 RAM和STS授权策略(Policy)配置 对于RAM或者STS授权中使用Policy,详细规则如下。 示例 先看下面的一个Policy示例: { "Version": "1", "Statement": [ { "Action": [ "oss:GetBucketAcl", "oss:ListObjects" ], "Resource": [ "acs:oss:*:1775305056529849:mybucket" ], "Effect": "Allow", "Condition": { "StringEquals": { "acs:UserAgent": "java-sdk", "oss:Prefix": "foo" }, "IpAddress": { "acs:SourceIp": "192.168.0.1" } } }, { "Action": [ "oss:PutObject", "oss:GetObject", "oss:DeleteObject" ], "Resource": [ "acs:oss:*:1775305056529849:mybucket/file*" ], "Effect": "Allow", "Condition": { "IpAddress": { "acs:SourceIp": "192.168.0.1" } } } ] } 这是一个授权的Policy,用户用这样的一个Policy通过RAM或STS服务向其他用户授权。Policy当中有一个Statement(一条Policy当中可以有多条Statement)。Statement里面规定了相应的Action、Resource、Effect和Condition。 这条Policy把用户自己名下的mybucket和mybucket/file*这些资源授权给相应的用户,并且支持GetBucketAcl、GetBucket、PutObject、GetObject和DeleteObject这几种操作。Condition中的条件表示UserAgent为java-sdk,源IP为192.168.0.1的时候鉴权才能通过,被授权的用户才能访问相关的资源。Prefix这个Condition是在GetBucket(ListObjects)的时候起作用的,关于这个字段的解释详见OSS的API文档。 配置细则 Version Version定义了Policy的版本,本文档中sw2q的配置方式,设置为1。 Statement 通过Statement描述授权语义,其中可以根据业务场景包含多条语义,每条包含对Action、Effect、Resource和Condition的描述。每次请求系统会逐条依次匹配检查,所有匹配成功的Statement会根据Effect的设置不同分为通过(Allow)、禁止(Deny),其中禁止(Deny)的优先。如果匹配成功的都为通过,该条请求即鉴权通过。如果匹配成功有一条禁止,或者没有任何条目匹配成功,该条请求被禁止访问。 Action Action分为三大类:Service级别操作,对应的是GetService操作,用来列出所有属于该用户的Bucket列表。 Bucket级别操作,对应类似于oss:PutBucketAcl、oss:GetBucketLocation之类的操作,操作的对象是Bucket,它们的名称和相应的接口名称一一对应。 Object级别操作,分为oss:GetObject、oss:PutObject、oss:DeleteObject和oss:AbortMultipartUpload,操作对象是Object。 如想授权某一类的Object的操作,可以选择这几种的一种或几种。另外,所有的Action前面都必须加上oss:,如上面例子所示。Action是一个列表,可以有多个Action。具体的Action和API接口的对应关系如下: Service级别 API Action GetService(ListBuckets) oss:ListBuckets Bucket级别 API Action PutBucket oss:PutBucket GetBucket(ListObjects) oss:ListObjects PutBucketAcl oss:PutBucketAcl DeleteBucket oss:DeleteBucket GetBucketLocation oss:GetBucketLocation GetBucketAcl oss:GetBucketAcl GetBucketLogging oss:GetBucketLogging PutBucketLogging oss:PutBucketLogging DeleteBucketLogging oss:DeleteBucketLogging GetBucketWebsite oss:GetBucketWebsite PutBucketWebsite oss:PutBucketWebsite DeleteBucketWebsite oss:DeleteBucketWebsite GetBucketReferer oss:GetBucketReferer PutBucketReferer oss:PutBucketReferer GetBucketLifecycle oss:GetBucketLifecycle PutBucketLifecycle oss:PutBucketLifecycle DeleteBucketLifecycle oss:DeleteBucketLifecycle ListMultipartUploads oss:ListMultipartUploads PutBucketCors oss:PutBucketCors GetBucketCors oss:GetBucketCors DeleteBucketCors oss:DeleteBucketCors PutBucketReplication oss:PutBucketReplication GetBucketReplication oss:GetBucketReplication DeleteBucketReplication oss:DeleteBucketReplication GetBucketReplicationLocation oss:GetBucketReplicationLocation GetBucketReplicationProgress oss:GetBucketReplicationProgress Object级别 API Action GetObject oss:GetObject HeadObject oss:GetObject PutObject oss:PutObject PostObject oss:PutObject InitiateMultipartUpload oss:PutObject UploadPart oss:PutObject CompleteMultipart oss:PutObject DeleteObject oss:DeleteObject DeleteMultipartObjects oss:DeleteObject AbortMultipartUpload oss:AbortMultipartUpload ListParts oss:ListParts CopyObject oss:GetObject,oss:PutObject UploadPartCopy oss:GetObject,oss:PutObject AppendObject oss:PutObject GetObjectAcl oss:GetObjectAcl PutObjectAcl oss:PutObjectAcl Resource Resource指代的是OSS上面的某个具体的资源或者某些资源(支持*通配),resource的规则是acs:oss:{region}:{bucket_owner}:{bucket_name}/{object_name}。对于所有Bucket级别的操作来说不需要最后的斜杠和{object_name},即acs:oss:{region}:{bucket_owner}:{bucket_name}。Resource也是一个列表,可以有多个Resource。其中的region字段暂时不做支持,设置为*。 Effect Effect代表本条的Statement的授权的结果,分为Allow和Deny,分别指代通过和禁止。多条Statement同时匹配成功时,禁止(Deny)的优先级更高。 例如,期望禁止用户对某一目录进行删除,但对于其他文件有全部权限: { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:*" ], "Resource": [ "acs:oss:*:*:bucketname" ] }, { "Effect": "Deny", "Action": [ "oss:DeleteObject" ], "Resource": [ "acs:oss:*:*:bucketname/index/*", ] } ] } Condition Condition代表Policy授权的一些条件,上面的示例里面可以设置对于acs:UserAgent的检查、acs:SourceIp的检查、还有oss:Prefix这项用来在GetBucket的时候对资源进行限制。 OSS支持的Condition如下: condition 功能 合法取值 acs:SourceIp 指定ip网段 普通的ip,支持*通配 acs:UserAgent 指定http useragent头 字符串 acs:CurrentTime 指定合法的访问时间 ISO8601格式 acs:SecureTransport 是否是https协议 “true”或者”false” oss:Prefix 用作ListObjects时的prefix 合法的object name 更多示例 针对具体场景更多的授权策略配置示例,可以参考教程示例:控制存储空间和文件夹的访问权限和OSS授权常见问题。 Policy在线图形化便捷配置工具,请单击这里。 最佳实践 RAM和STS使用指南
2019-12-01 23:12:47 0 浏览量 回答数 0

问题

支付宝的性能测试

       一、性能测试支付宝场景介绍   2013年双11过程当中,促销开启的第一分钟内支付宝的交易总额就突破了一亿元,短时间内大量用户涌入的情况下,如何保证用户的支付顺畅,...
云效平台 2019-12-01 21:47:13 5472 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求
2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求
2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求
2019-12-01 23:24:48 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求
2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求
2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求
2019-12-01 23:24:48 0 浏览量 回答数 0

问题

性能测试:软件测试的重中之重

       性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下&#...
云效平台 2019-12-01 21:45:09 5839 浏览量 回答数 1

问题

网络异常时抓包操作说明

代码如果有偏颇,请以 https://help.aliyun.com/knowledge_detail/40564.htm 为准 如果源服务器访问目标服务器出现异常,而且参阅文档 ping 丢包或不通...
妙正灰 2019-12-01 21:08:50 3968 浏览量 回答数 3

问题

网络异常时抓包怎么操作

如果源服务器访问目标服务器出现异常,而且参阅文档 ping 丢包或不通时链路测试说明 和 能 ping 通但端口不通时端口可用性探测说明 排查分析处理后,还是未能解决问题,则需要通过抓包获取最原...
boxti 2019-12-01 21:48:11 1632 浏览量 回答数 0

问题

Git 改变了分布式 Web 开发规则:报错

版本控制系统是大部分开发项目的核心组件,无论是开发应用程序、网站还是操作系统。大部分项目都涉及多个开发人员,往往位于不同的位置。分布式版本控制系统并不是新事物,但是 Git 版本控制系统为开发人员之...
kun坤 2020-06-08 11:09:24 3 浏览量 回答数 1

回答

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