Show Menu
主題×

將Dispatcher與多個域一起使用

Dispatcher版本獨立於AEM。 如果您遵循內嵌於AEM或CQ檔案中之Dispatcher檔案的連結,您可能會被重新導向至本頁面。
使用Dispatcher可處理多個Web網域中的頁面請求,同時支援下列條件:
  • 兩個網域的Web內容都儲存在單一AEM儲存庫中。
  • Dispatcher快取中的檔案可針對每個域分別失效。
例如,一家公司為其兩個品牌發佈網站:品牌A和品牌B。網站頁面的內容是以AEM編寫,並儲存在相同的儲存庫工作區:
/
| - content  
   | - sitea  
       | - content nodes  
   | - siteb  
       | - content nodes

頁面儲 BrandA.com 存於下 /content/sitea 方。 用戶端對URL的要 https://BrandA.com/en.html 求會傳回節點的轉譯頁 /content/sitea/en 面。 同樣地,頁面 BrandB.com 儲存在下方 /content/siteb
使用Dispatcher快取內容時,必須在用戶端HTTP請求中的頁面URL、快取中對應檔案的路徑,以及儲存庫中對應檔案的路徑之間建立關聯。

用戶端要求

當客戶端向Web伺服器發送HTTP請求時,必須將請求頁面的URL解析為Dispatcher快取中的內容,並最終解析為儲存庫中的內容。
  1. 域名系統發現在HTTP請求中為域名註冊的Web伺服器的IP地址。
  2. HTTP要求會傳送至Web伺服器。
  3. HTTP請求會傳遞至Dispatcher。
  4. Dispatcher確定快取的檔案是否有效。 如果有效,則會將快取的檔案提供給用戶端。
  5. 如果快取的檔案無效,Dispatcher會從AEM發佈例項要求新轉譯的頁面。

快取失效

當Dispatcher Flush複製代理請求Dispatcher使快取檔案失效時,儲存庫中內容的路徑必須解析為快取中的內容。
  1. 頁面會在AEM作者例項上啟動,內容會複製至發佈例項。
  2. Dispatcher Flush Agent調用Dispatcher以使複製內容的快取失效。
  3. Dispatcher會觸及一或多個。stat檔案,使快取檔案無效。
若要搭配多個網域使用Dispatcher,您必須設定AEM、Dispatcher和您的Web伺服器。 本頁所述的解決方案是一般的,適用於大多數環境。 由於某些AEM拓撲的複雜性,您的解決方案可能需要進一步的自訂配置來解決特定問題。 您可能需要調整示例以滿足現有的IT基礎架構和管理策略。

URL對應

若要啟用網域URL和內容路徑以解析為快取檔案,在程式的某個時間點,必須轉換檔案路徑或頁面URL。 提供了以下常見策略的說明,其中路徑或URL轉換在進程中的不同點發生:
一般而言,最好為網頁使用簡短的URL。 通常,頁面URL會鏡像包含Web內容的儲存庫資料夾的結構。 但是,URL不會顯示最上層的儲存庫節點,例如 /content 。 用戶端不一定知道AEM存放庫的結構。

一般需求

您的環境必須實施以下配置,以支援使用多個域的Dispatcher:
  • 每個域的內容駐留在儲存庫的不同分支中(請參見下面的示例環境)。
  • Dispatcher Flush複製代理已設定在AEM發佈例項上。 (請參 閱從發佈實例中使Dispatcher Cache無效 )。
  • 域名系統將域名解析為Web伺服器的IP地址。
  • Dispatcher快取會鏡像AEM內容存放庫的目錄結構。 Web伺服器文檔根目錄下的檔案路徑與儲存庫中檔案的路徑相同。

提供範例的環境

提供的示例解決方案適用於具有以下特徵的環境:
  • AEM作者和發佈例項部署在Linux系統上。
  • Apache HTTPD是部署在Linux系統上的Web伺服器。
  • AEM內容存放庫和Web伺服器的檔案根目錄會使用下列檔案結構(Apache web伺服器的檔案根目錄為/ usr/lib/apache/httpd-2.4.3/htdocs) :
    存放庫
  | - /content  
    | - sitea  
  |    | - content nodes 
    | - siteb  
       | - conent nodes

Web伺服器的文檔根目錄
  | - /usr  
    | - lib  
      | - apache  
        | - httpd-2.4.3  
          | - htdocs  
            | - content  
              | - sitea  
                 | - content nodes 
              | - siteb  
                 | - content nodes

AEM重寫傳入的URL

資源解析度的Sling對應可讓您將傳入的URL與AEM內容路徑產生關聯。 在AEM發佈例項上建立對應,以便從Dispatcher將請求解析為儲存庫中正確的內容。
頁面演算的Dispatcher要求會使用從Web伺服器傳遞的URL來識別頁面。 當URL包含網域名稱時,Sling映射會將URL解析為內容。 下圖說明URL與節 branda.com/en.html 點的映 /content/sitea/en 射。
Dispatcher快取將鏡像儲存庫節點結構。 因此,當頁面啟動時,導致無法編輯快取頁面的請求不需要URL或路徑轉換。

定義Web伺服器上的虛擬主機

定義Web伺服器上的虛擬主機,以便將不同的文檔根目錄分配給每個Web域:
  • Web伺服器必須為每個Web域定義虛擬域。
  • 對於每個域,請將文檔根配置為與包含域Web內容的儲存庫中的資料夾一致。
  • 每個虛擬域還必須包括與Dispatcher相關的配置,如「安裝 Dispatcher 」頁中所述。
以下示例文 httpd.conf 件為Apache web伺服器配置兩個虛擬域:
  • 伺服器名稱(與域名一致)是branda.com(行16)和brandb.com(行30)。
  • 每個虛擬域的文檔根目錄是Dispatcher快取中包含站點頁面的目錄。 (第17和31行)
使用此配置時,Web伺服器在收到請求時將執行以下操作 https://branda.com/en/products.html :
  • 將URL與具有下列項目的虛擬主 ServerName branda.com.
  • 將URL轉發到Dispatcher。

httpd.conf

# load the Dispatcher module
LoadModule dispatcher_module modules/mod_dispatcher.so
# configure the Dispatcher module
<IfModule disp_apache2.c>
 DispatcherConfig conf/dispatcher.any
 DispatcherLog    logs/dispatcher.log  
 DispatcherLogLevel 3
 DispatcherNoServerHeader 0 
 DispatcherDeclineRoot 0
 DispatcherUseProcessedURL 0
 DispatcherPassError 0
</IfModule>

# Define virtual host for brandA.com
<VirtualHost *:80>
  ServerName branda.com
  DocumentRoot /usr/lib/apache/httpd-2.4.3/htdocs/content/sitea
   <Directory /usr/lib/apache/httpd-2.4.3/htdocs/content/sitea>
     <IfModule disp_apache2.c>
       SetHandler dispatcher-handler
       ModMimeUsePathInfo On
     </IfModule>
     Options FollowSymLinks
     AllowOverride None
   </Directory>
</VirtualHost>

# define virtual host for brandB.com
<VirtualHost *:80>
  ServerName brandB.com
  DocumentRoot /usr/lib/apache/httpd-2.4.3/htdocs/content/siteb
   <Directory /usr/lib/apache/httpd-2.4.3/htdocs/content/siteb>
     <IfModule disp_apache2.c>
       SetHandler dispatcher-handler
       ModMimeUsePathInfo On
     </IfModule>
     Options FollowSymLinks
     AllowOverride None
   </Directory>
</VirtualHost>

# document root for web server
DocumentRoot "/usr/lib/apache/httpd-2.4.3/htdocs"

請注意,虛擬主機繼承 在主伺服器部分中配置的DispatcherConfig 屬性值。 虛擬主機可以包含其自己的DispatcherConfig屬性,以覆蓋主伺服器配置。

配置Dispatcher以處理多個域

要支援包含域名及其相應虛擬主機的URL,請定義以下Dispatcher場:
  • 為每個虛擬主機配置Dispatcher群。 這些場會處理來自網頁伺服器的每個網域要求、檢查快取檔案,以及從轉譯中要求頁面。
  • 配置Dispatcher群,該群用於使快取的內容失效,而不管內容屬於哪個域。 此群處理來自刷新Dispatcher複製代理的檔案失效請求。

為虛擬主機建立Dispatcher場

虛擬主機的場必須具有以下配置,以便將客戶端HTTP請求中的URL解析為Dispatcher快取中的正確檔案:
  • /virtualhosts 性被設定為域名。 此屬性使Dispatcher能夠將群與域關聯。
  • 此屬 /filter 性可讓存取在網域名稱部分之後截斷的請求URL路徑。 例如,對於 https://branda.com/en.html URL,路徑會解譯為 /en.html ,因此篩選器必須允許存取此路徑。
  • /docroot 性設定為Dispatcher快取中域站點內容的根目錄的路徑。 此路徑會用作原始請求串連URL的首碼。 例如,docroot會 /usr/lib/apache/httpd-2.4.3/htdocs/sitea 將要求解 https://branda.com/en.html 析至檔 /usr/lib/apache/httpd-2.4.3/htdocs/sitea/en.html 案。
此外,AEM發佈例項必須指定為虛擬主機的演算。 根據需要配置其他場屬性。 以下代碼是branda.com域的縮寫群配置:
/farm_sitea  {     
    ...
    /virtualhosts { "branda.com" }
    /renders {
      /rend01  { /hostname "127.0.0.1"  /port "4503" }
    }
    /filter {
      /0001 { /type "deny"  /glob "*" }
      /0023 { /type "allow" /glob "*/en*" }  
      ...
     }
    /cache {
      /docroot "/usr/lib/apache/httpd-2.4.3/htdocs/content/sitea"
      ...
   }
   ...
}

建立快取失效的Dispatcher群

處理取消快取檔案的請求時,需要Dispatcher群。 此群必須能夠訪問每個虛擬主機的docroot目錄中的。stat檔案。
下列屬性設定可讓Dispatcher從快取中的檔案解析AEM內容存放庫中的檔案:
  • /docroot 性會設為Web伺服器的預設Docroot。 通常,此為建立資料夾 /content 的目錄。 在Linux上,Apache的示例值為 /usr/lib/apache/httpd-2.4.3/htdocs
  • 該屬 /filter 性允許訪問目錄下的 /content 檔案。
/statfileslevel 屬性必須足夠高,以便在每個虛擬主機的根目錄中建立。stat檔案。 此屬性使每個域的快取分別失效。 對於示例設定, /statfileslevel 值為 2 在目錄和目錄中創 *docroot*/content/sitea 建。stat *docroot*/content/siteb 檔案。
此外,必須將發佈實例指定為虛擬主機的渲染。 根據需要配置其他場屬性。 以下代碼是用於使快取失效的群的縮寫配置:
/farm_flush {  
    ...
    /virtualhosts   { "invalidation_only" }
    /renders  {
      /rend01  { /hostname "127.0.0.1" /port "4503" }
    }
    /filter   {
      /0001 { /type "deny"  /glob "*" }
      /0023 { /type "allow" /glob "*/content*" } 
      ...
      }
    /cache  {
       /docroot "/usr/lib/apache/httpd-2.4.3/htdocs"
       /statfileslevel "2"
       ...
   }
   ...
}

啟動Web伺服器時,Dispatcher日誌(在調試模式下)指示所有場的初始化:
Dispatcher initializing (build 4.1.2)
[Fri Nov 02 16:27:18 2012] [D] [24974(140006182991616)] farms[farm_sitea].cache.docroot = /usr/lib/apache/httpd-2.4.3/htdocs/content/sitea
[Fri Nov 02 16:27:18 2012] [D] [24974(140006182991616)] farms[farm_siteb].cache.docroot = /usr/lib/apache/httpd-2.4.3/htdocs/content/siteb
[Fri Nov 02 16:27:18 2012] [D] [24974(140006182991616)] farms[farm_flush].cache.docroot = /usr/lib/apache/httpd-2.4.3/htdocs
[Fri Nov 02 16:27:18 2012] [I] [24974(140006182991616)] Dispatcher initialized (build 4.1.2)

設定Sling Mapping的資源解析度

使用Sling對應來解析資源,讓網域型URL解析為AEM發佈例項上的內容。 資源映射將Dispatcher(最初是從客戶端HTTP請求)傳入的URL轉換為內容節點。
若要瞭解Sling資源對應,請參閱Sling 檔案中的Mappings for Resource Resolution
通常,以下資源需要映射,但可能需要其他映射:
  • 內容頁面的根節點(下 /content )
  • 頁面使用的設計節點(下 /etc/designs )
  • 資料 /libs
建立內容頁面的對應後,若要探索其他必要的對應,請使用網頁瀏覽器在網頁伺服器上開啟頁面。 在發佈實例的error.log檔案中,找到有關未找到的資源的消息。 以下示例消息表示需要映射 /etc/clientlibs :
01.11.2012 15:59:24.601 *INFO* [10.36.34.243 [1351799964599] GET /etc/clientlibs/foundation/jquery.js HTTP/1.1] org.apache.sling.engine.impl.SlingRequestProcessorImpl service: Resource /content/sitea/etc/clientlibs/foundation/jquery.js not found

預設Apache Sling重寫程式的linkchecker變數會自動修改頁面中的超連結,以防止中斷的連結。 但是,只有當連結目標是HTML或HTM檔案時,才會執行連結重寫。 若要更新其他檔案類型的連結,請建立變壓器元件並將它新增至HTML重新寫入器管線。

資源映射節點示例

下表列出了為branda.com域實現資源映射的節點。 類似節點會為網域 brandb.com 建立,例如 /etc/map/http/brandb.com 。 在所有情況下,當頁面HTML中的參考無法在Sling內容中正確解析時,都需要映射。
節點路徑
類型
屬性
/etc/map/http/branda.com
sling:Mapping
名稱:sling:internalRedirect Type:字串值:/content/sitea
/etc/map/http/branda.com/libs
sling:Mapping
名稱:sling:internalRedirect
Type:字串
值:/libs
/etc/map/http/branda.com/etc
sling:Mapping
/etc/map/http/branda.com/etc/designs
sling:Mapping
名稱:sling:internalRedirect
VType:字串
值:/etc/designs
/etc/map/http/branda.com/etc/clientlibs
sling:Mapping
名稱:sling:internalRedirect
VType:字串
值:/etc/clientlibs

配置Dispatcher Flush複製代理

AEM發佈例項上的Dispatcher Flush複製代理必須將失效請求傳送至正確的Dispatcher群。 要定位群,請使用Dispatcher Flush複製代理的URI屬性(在「傳輸」頁籤上)。 包含配置為使緩 /virtualhost 存失效的Dispatcher群的屬性值:
https://*webserver_name*:*port*/*virtual_host*/dispatcher/invalidate.cache
例如,若要使用上 farm_flush 一個範例的場,URI為 https://localhost:80/invalidation_only/dispatcher/invalidate.cache

Web伺服器重寫傳入的URL

使用Web伺服器的內部URL重寫功能,將網域型URL轉譯為Dispatcher快取中的檔案路徑。 例如,用戶端對頁面的 https://brandA.com/en.html 要求會轉譯為網 content/sitea/en.html 頁伺服器檔案根目錄中的檔案。
Dispatcher快取將鏡像儲存庫節點結構。 因此,當頁面啟動時,產生的取消驗證快取頁面的要求不需要URL或路徑轉換。

在Web伺服器上定義虛擬主機和重寫規則

在Web伺服器上配置以下方面:
  • 為每個Web網域定義虛擬主機。
  • 對於每個域,請將文檔根配置為與包含域Web內容的儲存庫中的資料夾一致。
  • 針對每個虛擬網域,建立URL重新命名規則,將傳入的URL轉譯為快取檔案的路徑。
  • 每個虛擬域還必須包括與Dispatcher相關的配置,如「安裝 Dispatcher 」頁中所述。
  • 必須將Dispatcher模組配置為使用Web伺服器已重寫的URL。 (請參閱「安 DispatcherUseProcessedURL 裝Dispatcher 」中的屬性 。)
以下示例httpd.conf檔案為Apache web伺服器配置兩個虛擬主機:
  • 伺服器名稱(與域名一致) brandA.com 是(行16) brandB.com 和(行32)。
  • 每個虛擬域的文檔根目錄是Dispatcher快取中包含站點頁面的目錄。 (第20和33行)
  • 每個虛擬網域的URL重寫規則是規則運算式,用於將請求頁面的路徑與快取中頁面的路徑作為前置詞。 (第19和35行)
  • DispatherUseProcessedURL 性設定為 1 。 (第10行)
例如,Web伺服器在收到具有 https://brandA.com/en/products.html URL的請求時,會執行下列動作:
  • 將URL與具有下列項目的虛擬主 ServerName brandA.com.
  • 將URL重寫為 /content/sitea/en/products.html.
  • 將URL轉發到Dispatcher。

httpd.conf

# load the Dispatcher module
LoadModule dispatcher_module modules/mod_dispatcher.so
# configure the Dispatcher module
<IfModule disp_apache2.c>
 DispatcherConfig conf/dispatcher.any
 DispatcherLog    logs/dispatcher.log  
 DispatcherLogLevel 3
 DispatcherNoServerHeader 0 
 DispatcherDeclineRoot 0
 DispatcherUseProcessedURL 1
 DispatcherPassError 0
</IfModule>

# Define virtual host for brandA.com
<VirtualHost *:80>
  ServerName branda.com
  DocumentRoot /usr/lib/apache/httpd-2.4.3/htdocs/content/sitea
  RewriteEngine  on
  RewriteRule    ^/(.*)\.html$  /content/sitea/$1.html [PT]
   <Directory /usr/lib/apache/httpd-2.4.3/htdocs/content/sitea>
     <IfModule disp_apache2.c>
       SetHandler dispatcher-handler
       ModMimeUsePathInfo On
     </IfModule>
     Options FollowSymLinks
     AllowOverride None
   </Directory>
</VirtualHost>

# define virtual host for brandB.com
<VirtualHost *:80>
  ServerName brandB.com
  DocumentRoot /usr/lib/apache/httpd-2.4.3/htdocs/content/siteb
  RewriteEngine  on
  RewriteRule    ^/(.*)\.html$  /content/siteb/$1.html [PT]
   <Directory /usr/lib/apache/httpd-2.4.3/htdocs/content/siteb>
     <IfModule disp_apache2.c>
       SetHandler dispatcher-handler
       ModMimeUsePathInfo On
     </IfModule>
     Options FollowSymLinks
     AllowOverride None
   </Directory>
</VirtualHost>

# document root for web server
DocumentRoot "/usr/lib/apache/httpd-2.4.3/htdocs"

配置Dispatcher Farm

當Web伺服器重寫URL時,Dispatcher需要根據「配置Dispatcher」定義的 單個群 。 支援Web伺服器虛擬主機和URL更名規則需要以下配置:
  • /virtualhosts 性必須包含所有VirtualHost定義的ServerName值。
  • /statfileslevel 屬性必須足夠高,才能在包含每個域內容檔案的目錄中建立。stat檔案。
以下示例配置檔案基於隨Dispatcher一起安 dispatcher.any 裝的示例檔案。 需要進行以下更改以支援上一個檔案的Web伺服器配 httpd.conf 置:
  • 該屬 /virtualhosts 性使Dispatcher能夠處理對和域的 brandA.com brandB.com 求。 (第12行)
  • /statfileslevel 性設定為2,以便在包含域Web內容的每個目錄中建立stat檔案(第41行): /statfileslevel "2"
和往常一樣,快取的檔案根目錄與網頁伺服器的檔案根目錄相同(第40行): /usr/lib/apache/httpd-2.4.3/htdocs

dispatcher.any

/name "testDispatcher"
/farms
  {
  /dispfarm0
    {  
    /clientheaders
      {
      "*"
      }      
    /virtualhosts
      {
      "brandA.com" "brandB.com"
      }
    /renders
      {
      /rend01    {  /hostname "127.0.0.1"   /port "4503"  }
      }
    /filter
      {
      /0001 { /type "deny"  /glob "*" }
      /0023 { /type "allow" /glob "*/content*" }  # disable this rule to allow mapped content only
      /0041 { /type "allow" /glob "* *.css *"   }  # enable css
      /0042 { /type "allow" /glob "* *.gif *"   }  # enable gifs
      /0043 { /type "allow" /glob "* *.ico *"   }  # enable icos
      /0044 { /type "allow" /glob "* *.js *"    }  # enable javascript
      /0045 { /type "allow" /glob "* *.png *"   }  # enable png
      /0046 { /type "allow" /glob "* *.swf *"   }  # enable flash
      /0061 { /type "allow" /glob "POST /content/[.]*.form.html" }  # allow POSTs to form selectors under content
      /0062 { /type "allow" /glob "* /libs/cq/personalization/*"  }  # enable personalization
      /0081 { /type "deny"  /glob "GET *.infinity.json*" }
      /0082 { /type "deny"  /glob "GET *.tidy.json*"     }
      /0083 { /type "deny"  /glob "GET *.sysview.xml*"   }
      /0084 { /type "deny"  /glob "GET *.docview.json*"  }
      /0085 { /type "deny"  /glob "GET *.docview.xml*"  }      
      /0086 { /type "deny"  /glob "GET *.*[0-9].json*" }
      /0090 { /type "deny"  /glob "* *.query.json*" }
      }
    /cache
      {
      /docroot "/usr/lib/apache/httpd-2.4.3/htdocs"
      /statfileslevel "2"
      /allowAuthorized "0"
      /rules
        {
        /0000  { /glob "*"     /type "allow"  }
        }
      /invalidate
        {
        /0000  {   /glob "*" /type "deny"  }
        /0001 {  /glob "*.html" /type "allow"  }
        }
      /allowedClients
        {
        }     
      }
    /statistics
      {
      /categories
        {
        /html  { /glob "*.html" }
        /others  {  /glob "*"  }
        }
      }
    }
  }

由於已定義單一Dispatcher群,因此AEM發佈例項上的Dispatcher Flush複製代理不需要特殊組態。