配置rgw域名信息
rgw会根据自己配置的domain信息对用户的host进行解析,这个domain信息是一个域名列表,列表包括rgw可以识别的domain,由于存在常规s3和s3website两种访问方式因此会有两个domain信息配置列表。
列表初始化时会加载rgw_dns_name和rgw_dns_s3website配置项,但此配置项只能配置一条domain,因此如果需要增加多条domain,需要修改zonegroup的hostnames和hostnames_s3website配置。
radosgw-admin zonegroup get >zonegroup.json
radosgw-admin zonegroup set --infile zonegroup.json
支持的访问方式
常规path-style访问,例如http://s3.amazonaws.com/jbarr-public,其中amazonaws.com需能够精确匹配上述域名列表中的某个域名,bucket name也就是jbarr-public。
bucket-domain访问,即virtual-hosted-style访问。例如http://jbarr-public.s3.amazonaws.com,jbarr-public.s3.amazonaws.com需能够以后缀匹配的方式匹配上域名列表中的某个域名,bucket name为jbarr-public。
CName访问
精确匹配,例如存在一条CNAME记录,bucket.com. IN CNAME s3.amazonaws.com.若是在rgw的域名列表中已经配置了s3.amazonaws.com,在使用http://www.bucket.com访问时,rgw通过域名解析,能够在域名列表中精确匹配到www.bucket.com的别名s3.amazonaws.com,此时将bucket name视为www.bucket.com。
后缀匹配,例如存在一条CNAME记录,bucket.com. IN CNAME www.bucket.com.s3.amazonaws.com. 若是在域名列表中已经配置了s3.amazonaws.com,在使用http://www.bucket.com访问时,其别名能够以后缀匹配的方式匹配到域名列表中的一个域名,bucket name为www.bucket.com。另一种情况为存在CNAME记录,demo.bucket.com. IN CNAME www.bucket.com.s3.amazonaws.com.,可使用http://demo.bucket.com进行访问,bucket name为www.bucket.com。
既非精确匹配也非后缀匹配,同样无法找到CNAME记录。例如存在一条A记录,bucket.com IN A 1.2.3.4,其中1.2.3.4也就是s3.amazonaws.com的IP。在使用http://www.bucket.com访问时,会直接将主机名www.bucket.com作为存储桶进行访问。
处理细节
第3小节中前两种访问方式的实现。当HTTP请求到达rgw后,请求中会携带初始host请求信息,即<bucket-name>和<endpoint>,rgw会根据配置的domain信息,将这个host信息解析成subdomain和domain两部分,分别对应bucket-name和endpoint,随后重新构造一个request url path,格式为/<bucket-name>,至此,整个逻辑回到了最原始的以http://<endpoint>/<bucket-name>访问时的状态。
第3小节中CName访问方式的实现。首先需要在域名配置一条CNAME记录,使对域名的请求跳转到<endpoint>或<bucket-name><endpoint>。当HTTP请求到达rgw后,请求中携带的host信息是自己定义的域名。rgw首先查询自己的domain配置信息,若未找到和这个域名相关的内容,则向DNS服务器请求,期待返回一个自己能使用的CNAME domain。
先按照4-1小节的方式进行处理,解析失败后尝试请求DNS,得到CNAME后使用CNAME重新解析。在解析成功后,后面的逻辑又回到了重新构建request uri,然后进入了常规处理阶段。
第3小节中最后一种访问方式的实现。当HTTP请求到达rgw后,请求中携带的host信息既未在domain配置信息中查找到相关内容,也未能找到CNAME信息,则将请求中的host name当作subdomain,随后构建request uri进入常规处理阶段。
静态网站托管与普通s3请求
接收请求的rgw需要手动配置的配置项有
rgw_enable_apis = s3, s3website, swift, swift_auth, admin, sts, iam, pubsub
rgw_enable_static_website = true
rgw_dns_name = s3.amazonaws.com
rgw_dns_s3website_name = s3-website.amazonaws.com
实现细节
将bucket设置成静态网站托管模式时,使用的rgw_api是s3,和常规对象存储相同。url中的website请求参数会标识本次请求是一次“设置bucket为website模式”的请求。
因此,在将bucket设置成静态网站托管模式之前,需要将rgw_enable_static_website设置为true。为了以website模式对一个bucket进行访问,需要将接受请求的rgw的rgw_api设置成s3website优先。当rgw接收到请求后,会将请求标志置成s3website模式。
在rgw_enable_apis中配置了s3website且s3website相比s3更靠前,也就是优先级更高时,会在s->prot_flags中配置website标志位,在随后的RGWHandler选择中会根据s->prot_flags的值选用相应的Handler。
若要rgw同时支持s3和s3website域名访问,则可在单节点创建两个rgw进程分别处理s3和s3website请求,按照如下进行配置
因为若是使用单rgw实例,将rgw_dns_name和rgw_dns_s3website_name配置到一起,
rgw使用api的类别完全由rgw_enable_apis中的s3和s3website的优先顺序有关。s3在前面,则当作s3 api来处理,否则s3website在前面,则按s3website api来处理。