RGW靜態(tài)網(wǎng)站托管功能

背景

靜態(tài)網(wǎng)站托管(s3website)相比普通s3請(qǐng)求,多了幾個(gè)核心功能:

  • 默認(rèn)請(qǐng)求頁面。當(dāng)用戶url以"/"結(jié)尾時(shí)返回的頁面。
  • 錯(cuò)誤頁面。當(dāng)用戶請(qǐng)求的url發(fā)生錯(cuò)誤時(shí)返回的頁面。
  • 轉(zhuǎn)發(fā)設(shè)置。針對(duì)一個(gè)bucket或者bucket下某個(gè)對(duì)象設(shè)置請(qǐng)求跳轉(zhuǎn)。

除此之外,s3website模式和s3模式相差不大。

設(shè)置方法

  • 使用s3cmd設(shè)置bucket為靜態(tài)網(wǎng)站托管模式方法如下:
s3cmd ws-create --ws-index=<default.html> --ws-error=<error.html> s3://<bucket-name>

達(dá)到的效果就是當(dāng)用戶訪問http://<endpoint>/<bucket-name>/時(shí),會(huì)返回s3://<bucket-name>/<default.html>對(duì)象,更一般的情況是用戶訪問http://<endpoint>/<bucket-name>/<path>/時(shí),實(shí)際返回s3://<bucket-name>/<path>/<default.html>對(duì)象;如果用戶訪問的url沒有對(duì)應(yīng)的s3 object,則返回s3://<bucket-name>/<error.html>對(duì)象。

  • 使用REST API設(shè)置bucket為靜態(tài)網(wǎng)站托管的方法如下:
#!/bin/bash
host=<ip>:<normal-rgw-port>
resource="/<bucket_name>"
indexPage="<index.html>"
errorPage="<error.html>"
contentType="XXYYZZ"
dateValue=`date -R -u`
stringToSign="PUT

${contentType}
${dateValue}
${resource}"
s3Key=<key>
s3Secret=<secret>
#計(jì)算簽名
signature=`/bin/echo -n "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  -d "<WebsiteConfiguration><IndexDocument><Suffix>${indexPage}</Suffix></IndexDocument><ErrorDocument><Key>${errorPage}</Key></ErrorDocument><RoutingRules><RoutingRule><Condition><KeyPrefixEquals>docs/</KeyPrefixEquals></Condition><Redirect><ReplaceKeyPrefixWith>documents/</ReplaceKeyPrefixWith></Redirect></RoutingRule></RoutingRules></WebsiteConfiguration>" \
  "http://${host}${resource}?website"

注意:相應(yīng)的GET, DEL HTTP方法可用于獲取和清空bucket的靜態(tài)網(wǎng)站托管配置。

接收請(qǐng)求的RGW需要手動(dòng)配置的配置項(xiàng)有:

rgw_enable_apis = "s3, s3website, swift, swift_auth, admin"
rgw_enable_static_website = true

使用靜態(tài)網(wǎng)站托管bucket時(shí)需要向特定的RGW發(fā)送請(qǐng)求,這些RGW的配置和常規(guī)用于s3訪問的RGW不同:

rgw_enable_apis="s3website, s3, swift, swift_auth, admin"

代碼實(shí)現(xiàn)

設(shè)置bucket

將bucket設(shè)置成靜態(tài)網(wǎng)站托管模式時(shí),使用的rgw_api仍然是s3,和常規(guī)對(duì)象存儲(chǔ)相同。
url中的website請(qǐng)求參數(shù)會(huì)標(biāo)識(shí)本次請(qǐng)求是一次“設(shè)置bucket為website模式”的請(qǐng)求:

RGWOp *RGWHandler_REST_Bucket_S3::op_put()
{
 ...
  if (s->info.args.sub_resource_exists("website")) {
    if (!s->cct->_conf->rgw_enable_static_website) {
      return NULL;
    }
    return new RGWSetBucketWebsite_ObjStore_S3;
  }
...

使用bucket

為了以website模式對(duì)一個(gè)bucket進(jìn)行訪問,需要將接收請(qǐng)求的RGW的rgw_api設(shè)置成s3website優(yōu)先。當(dāng)RGW接收到請(qǐng)求后,會(huì)將請(qǐng)求標(biāo)志成s3website模式

int RGWREST::preprocess(struct req_state *s, RGWClientIO* cio)
{
...
    if (s3website_enabled && api_priority_s3website > api_priority_s3) {
      in_hosted_domain_s3website = 1;
    }

    if (in_hosted_domain_s3website) {
      s->prot_flags |= RGW_REST_WEBSITE;
    }
...
}

在隨后的RGWHandler選擇中會(huì)據(jù)此選用相應(yīng)的Handler

RGWHandler_REST* RGWRESTMgr_S3::get_handler(struct req_state *s)
{
  bool is_s3website = enable_s3website && (s->prot_flags & RGW_REST_WEBSITE);
  int ret = RGWHandler_REST_S3::init_from_header(s,
                    is_s3website ? RGW_FORMAT_HTML :
                    RGW_FORMAT_XML, true);
  if (ret < 0)
    return NULL;

  RGWHandler_REST* handler;
  // TODO: Make this more readable
  if (is_s3website) {
    if (s->init_state.url_bucket.empty()) {
      handler = new RGWHandler_REST_Service_S3Website;
    } else if (s->object.empty()) {
      handler = new RGWHandler_REST_Bucket_S3Website;
    } else {
      handler = new RGWHandler_REST_Obj_S3Website;
    }
...

RGWHandler_REST_Service_S3Website, RGWHandler_REST_Bucket_S3WebsiteRGWHandler_REST_Object_S3Website均繼承自RGWHandler_REST_S3Website, 三者在get_obj失敗時(shí)便會(huì)調(diào)用RGWHandler_REST_S3Website::error_handler(),從而實(shí)現(xiàn)錯(cuò)誤界面的返回。
默認(rèn)頁面的返回是由RGWHandler_REST_S3Website::retarget()實(shí)現(xiàn),此函數(shù)在rgw_process.cc中被調(diào)用:

int process_request(RGWRados* store, RGWREST* rest, RGWRequest* req,
            RGWStreamIO* client_io, OpsLogSocket* olog) 
{
...
/**
   * Only some accesses support website mode, and website mode does NOT apply
   * if you are using the REST endpoint either (ergo, no authenticated access)
   */
  req->log(s, "recalculating target");
  ret = handler->retarget(op, &op);
...

因此retarget動(dòng)作永遠(yuǎn)會(huì)執(zhí)行,不論是s3還是s3website。

總結(jié)

在RGW中使用靜態(tài)網(wǎng)站托管功能需要配置兩套R(shí)GW示例,分別用于配置bucket和訪問bucket。且默認(rèn)頁面需要在沒個(gè)“目錄”下放置(這一點(diǎn)可能和其他廠商的對(duì)象存儲(chǔ)服務(wù)有區(qū)別),否則會(huì)導(dǎo)致404,進(jìn)而返回錯(cuò)誤頁面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容

  • https://aws.amazon.com/cn/s3/faqs/#sia_anchor Amazon Simp...
    守望者_(dá)1065閱讀 8,326評(píng)論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,823評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,716評(píng)論 25 708
  • 看到弟弟一天天長大,除了開心之外,還有一種很濃重的無力感。 弟弟不再是那個(gè)小小的肉嘟嘟的兩三歲的小小的孩子了,不...
    西瓜半閱讀 241評(píng)論 0 1
  • 昨天看了電影《滾燙的愛》,全程哭的稀里嘩啦,好久都沒有影視作品這樣讓我有強(qiáng)烈的共鳴。女主雙葉看年級(jí)好像四十歲左右,...
    光年123閱讀 942評(píng)論 0 0