RGW域名訪問bucket

背景

RGW處理的報文本質上是一個HTTP報文,通常情況下使用http://<rgw-ip>:<rgw-port>/<bucket-name>的方式來訪問一個bucket。實際應用尤其是公有云環境中,通常要在rgw前架設Haproxy等負載均衡設備,且將Haproxy的ip:port映射成一個域名,方便用戶使用,這個域名也叫Endpoint

在擁有Endpoint后,訪問一個bucket的url變成了http://<endpoint>/<bucket-name>形式。不過這也只是一個ip到域名映射,和RGW關系不大,但后面要說的功能就和RGW密切相關了。

使用url方式訪問bucket主要用于靜態網站托管,既然是網站,當然就要盡量滿足常規網站訪問形式。為此出現了兩個需求:

需求1:bucket-domain方式訪問

bucket-domain方式是指以http://<bucket-name>.<endpoint>形式訪問bucket。
如果用戶在公有云上托管了一個網站,以http://<myblog>.aws-s3.com形式訪問肯定要好于http://aws-s3.com/myblog,前者域名看起來更像是一個獨立網站。

需求2:private-domain

private-domain方式是指使用自己的域名訪問特定bucket。
如果用戶自己已經有了現成的域名,那直接使用肯定是更接地氣,而且訪問者完全不知道這個網站到底是托管在公有云上還是使用的獨立主機。

細說

bucket-domain方式代碼實現

首先,對象存儲服務提供方需要設置DNS,將<endpoint>下的子域解析到RGW或其前端的負載均衡設備。
當HTTP請求到達RGW后,請求中會攜帶初始host請求信息,即<bucket-name>.<endpoint>,RGW會根據配置的domain信息,將這個host信息解析成subdomain和domain兩部分,分別對應bucket-name和endpoint,隨后重新構造一個request url path,格式為/<bucket-name>,至此,整個邏輯回到了最原始的以http://<endpoint>/<bucket-name>訪問時的狀態。

int RGWREST::preprocess(struct req_state *s, RGWClientIO* cio)
{
  req_info& info = s->info;  //info中存有此次請求相關的信息
...
  if (info.host.size()) {        // info.host中存放的就是用戶請求的url domain部分
    ldout(s->cct, 10) << "host=" << info.host << dendl;
    string domain;
    string subdomain;
    bool in_hosted_domain_s3website = false;
    bool in_hosted_domain = rgw_find_host_in_domains(info.host, &domain, &subdomain, hostnames_set);
...
    if (in_hosted_domain && !subdomain.empty()) {  //重新構建request uri
      string encoded_bucket = "/";
      encoded_bucket.append(subdomain);
      if (s->info.request_uri[0] != '/')
        encoded_bucket.append("/");
      encoded_bucket.append(s->info.request_uri);
      s->info.request_uri = encoded_bucket;
    }
...

private-domain方式代碼實現

首先,用戶需要將自己的域名配置一條CNAME,使對域名的請求跳轉到<bucket-name>.<endpoint>
當HTTP請求到達RGW后,請求中攜帶當host信息是<private-domain>,RGW首先查詢自己的domain配置信息,如果沒有找到和這個域名相關的內容,則向DNS服務器請求,期待返回一個自己能使用的CNAME domain。

int RGWREST::preprocess(struct req_state *s, RGWClientIO* cio)
{
  req_info& info = s->info;
...
/* 這一段和bucket-domain一樣,首先嘗試在rgw已配置的domain信息中進行解析 */
  if (info.host.size()) {
    ldout(s->cct, 10) << "host=" << info.host << dendl;
    string domain;
    string subdomain;
    bool in_hosted_domain_s3website = false;
    bool in_hosted_domain = rgw_find_host_in_domains(info.host, &domain, &subdomain, hostnames_set);

    string s3website_domain;
    string s3website_subdomain;

    if (s3website_enabled) {
      in_hosted_domain_s3website = rgw_find_host_in_domains(info.host, &s3website_domain, &s3website_subdomain, hostnames_s3website_set);
      if (in_hosted_domain_s3website) {
    in_hosted_domain = true; // TODO: should hostnames be a strict superset of hostnames_s3website?
        domain = s3website_domain;
        subdomain = s3website_subdomain;
      }
    }
...
/*解析失敗后嘗試請求DNS,得到CNAME后使用CNAME重新解析*/
    if (g_conf->rgw_resolve_cname
    && !in_hosted_domain
    && !in_hosted_domain_s3website) {
      string cname;
      bool found;
      int r = rgw_resolver->resolve_cname(info.host, cname, &found);
      if (r < 0) {
    ldout(s->cct, 0)
      << "WARNING: rgw_resolver->resolve_cname() returned r=" << r
      << dendl;
      }

      if (found) {
    ldout(s->cct, 5) << "resolved host cname " << info.host << " -> "
             << cname << dendl;
    in_hosted_domain =
      rgw_find_host_in_domains(cname, &domain, &subdomain, hostnames_set);
...
/* 解析成功后,后面的邏輯就又回到了bucket-domain上,即重新構建request uri,然后就進入了常規處理階段。*/
...

配置RGW domain信息

前面提到RGW會根據自己配置的domain信息對用戶的host進行解析,這個domain信息是一個域名列表,列表包括RGW可以識別的domain,由于存在常規s3和s3website兩種訪問方式,因此會有兩個domain信息配置列表

//file: src/rgw/rgw_rest.cc
static set<string> hostnames_set;
static set<string> hostnames_s3website_set;

列表初始化時會加載rgw_dns_name配置項,但此配置項只能配置一條domain,因此如果需要增加多條domain(比如使用private-domain方式,但RGW又無法和解析private-domain的DNS通信的情況下),需要修改zonegroup的hostnames和hostnames_s3website配置。

radosgw-admin zonegroup get > zonegroup.conf
按需修改 zonegroup.conf文件中的hostnames和hostnames_s3website
radosgw-admin zonegroup set --infile=zonegroup.conf

總結

域名訪問分三個方式

  • 初級方式:http://<public-cloud-domain>/<bucket-name>
  • 中級方式:http://<bucket-name>.<public-cloud-domain>
  • 高級方式:http://<private-domain>

前兩種方式比較簡單,無需用戶進行額外操作。

第三種方式需要用戶配置DNS CNAME,將請求轉發到http://<bucket-name>.<public-cloud-domain>上。這種場景需要注意的是,RGW要能夠訪問到用戶配置了CNAME的DNS服務器,否則只能通過增加RGW domain配置信息的方式來進行彌補。

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

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,823評論 18 139
  • 1. 概述 在網絡環境中一般用戶只需要在瀏覽器中輸入url如www.sunny.com就可以到對應服務器獲取相應的...
    ghbsunny閱讀 2,934評論 0 7
  • DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能...
    一直在努力hard閱讀 4,668評論 3 19
  • 域名(Domain Name),是由一串用 點 分隔的名字 組成的 Internet 上某一臺計算機或計算機組的名...
    茉上心弦閱讀 2,145評論 1 11
  • 14.1 引言 域名系統(DNS)是一種用于TCP/IP應用程序的分布式數據庫,它提供主機名字和IP地址之間的轉換...
    張芳濤閱讀 1,912評論 0 8