在 Azure 網站服務上使用 Drupal CMS 的最佳實踐

原文發佈於 Best Practices for Drupal CMS on Azure Websites

Drupal CMS 是一個用 PHP 及 MySQL 編寫的開放原始碼的內容管理系統(Content management system,CMS)。Drupal 提供開發者優美的程式編寫介面,就算不會寫程式也可以做出一個基本的網站,像是個人部落格或企業應用程式等等,就算用來搭建政府或組織的網站也是個很適合的框架。這篇文章會教您如何在 Azure 上運行 Drupal CMS 的網站,看完之後您便能學會:

  • 如何將現有的 Drupal 網站搬到 Azure 網站服務上。
  • 如何使用 Azure 儲存體來儲存多媒體檔案。
  • 如何使用 Memcached 來作快取。
  • 最佳的 Drupal CMS 架設技巧。
  • 跨區域擴展。

如何將現有的 Drupal 網站搬到 Azure 網站服務上

將 Drupal 網站搬到 Azure 上非常簡單,照著下面步驟做,一個小時內就可以完成了! 

建立一個Azure網站及 MySQL資料庫

您可以看之前寫過的 step-by-step 教學,學習如何建立一個網站及MySQL資料庫,這個教學教的是建立免費的 MySQL 資料庫,適合純粹以開發為目的的網站,若您是作為商業用途的網站,建議您在 Azure 市集上購買 ClearDB,它提供很多不同的共享資料庫的方案,更多詳細資訊請至 ClearDB from Azure Store 查看。若這些方案都不符合您的需求,您可以選擇自訂 MySQL 資料庫,更多詳細資訊請至 ClearDB mission critical database plans 查看。 

如果您打算使用 Git 來發布您的 Drupal 網站,下面會教您如何配置一個 Git repository。請務必遵循取得遠端MySQL連接資訊的指示,稍後您將會需要這些資訊。您可以忽略本教學中部署 Drupal 網站的部分,但如果您是第一次使用Azure(或Git),您可以從中獲得更多資訊。

建立完一個新的 Azure 網站及 MySQL 資料庫後,現在您有了 MySQL 資料庫的連接資訊及一個 Git repository(選擇性),下一步將您的資料庫複製到 Azure 上的 MySQL 資料庫。

複製資料庫到 Azure 上的 MySQL 資料庫

有很多種方法可以將資料庫搬到Azure上,其中,使用 [MySqlDump] 這個工具是最適合MySQL資料庫的方法。下面的指令將示範如何從本地端複製到Azure上:

 mysqldump -u local_username --password=local_password drupal | mysql -h remote_host -u remote_username --password=remote_password remote_db_name

首先,您需要提供您現有的 Drupa 資料庫用戶名稱及密碼,此外,您還必須提供您建立的 MySQL 資料庫的主機名稱、用戶名稱、密碼以及資料庫名稱,您可以在先前的連接字串訊息中取得這些資訊。連接字串的格式應該像下面這樣:

 Database=remote_db_name;Data Source=remote_host;User Id=remote_username;Password=remote_password

根據資料庫的大小,複製過程可能會需要幾分鐘。

現在,您的 Drupal 資料庫已經搬到 Azure 上了。在部署您的 Drupal 程式之前,您必須先稍作修改,讓它可以連接到新的資料庫。 

在 settings.php 修改資料庫連接資訊

在這裡,您會再次需要新的資料庫連接資訊。首先,在文字編輯器中打開 <drupalsite>/sites/default/setting.php 這個檔案,將 $databases 陣列中 ‘database’, ‘username’, ‘password’, 以及 ‘host’ 的值修改成您的新資料庫中對應的值。完成後,您應該會看到類似下面的樣子:

 $databases = array ('default'=>array ('default'=>array ('database'=>'remote_db_name','username'=>'remote_username',
'password'=>'remote_password','host'=>'remote_host','port'=>'',
'driver'=>'mysql','prefix'=>'',),),);

注意: 若您的 settings.php 中有 $base_url 這個配置參數,請將它註解掉,因為 Drupal CMS 會從 $base_url 的值建立 URLs。一旦您 Azure 的配置是使用自定網域名稱,像是 www.exmaple.com,您則可以使用 $base_url 這個參數來設定。設定完後記得將 settings.php 存檔。 

現在,您已經準備好部署了!

使用 Git 或 FTP 部署您的Drupal code

最後一步是使用 Git 或 FTP 將程式碼部署到 Azure。

  • 若您是使用 FTP,您必須先從網站後台取得 FTP 主機名稱及用戶名稱,接著使用 FTP 軟體上傳 Drupal 檔案到  /site/wwwroot 遠端的資料夾。
  • 若您是使用 Git,您在先前的步驟應該已經建立 Git repository了。您必須先安裝 Git 在本地端機器,接著遵照您建立完 repository 的指示。若您不知道如何配置 Git,可以參考這篇文章

如何使用 Azure 儲存體來儲存多媒體檔案

安裝完 Drupal 後,您若要儲存多媒體檔案,必須先使用 Windows Azure blob storage 來啟用、配置 blob storage 模組。現在就按照下面步驟來配置吧!首先,以管理員的身份登入,點擊 modules tab 並啟用 Azure Storage 模組,如果該模組不存在,請從這裡安裝。

點擊 Configuration,接著點選 Media section 裡的 Azure Storage

點選 Add 按鈕來新增一個專屬您 Drupal 網站的儲存體帳戶。在欄位裡填寫以下資訊:儲存體帳戶名稱、現有容器的名稱(容器必須是公開的)、blob 儲存體網址、主要驗證碼。如果你的儲存體有連接到 CDN,請在 custom URL 那欄填入 CDN URL。如果您沒有使用CDN那就留空。

再次點擊 Configuration 以及 Media section 內的 File System。勾選 Files stored on Azure Blob Storage 這個選項,接著點 Save Configuration 按鈕。

點選 Structure 內的 Content Type,接著點 Article 裡的 manager fields。在 manage fields 視窗裡,檢查您是否已經有 Image label,如果有的話,當您建立新的文章時會出現 Image Upload 這個選項。如果您想要支援上傳檔案的功能(不包含圖檔),那您要新增一個 File Upload 的標籤(如下圖所示的 Upload 標籤): 

在 Image 那欄點選 edit,接著在 Upload destination 下勾選 Azure Storage。如果您還有其他 File uploads 的標籤,作法同上(field type為 FILE)。

其他支援圖片或檔案上傳的 Content Type 也是跟上面一樣的做法。

如何使用 Memcached 來作快取

註冊一個 Memcached Cloud 的帳戶‵,Memcached Cloud 目前只有在美東及美西的 Azure上提供服務。如果您想要管理您自己的 memcached 伺服器,您必須先在 Azure 虛擬機器上安裝,因為 Azure 有提供 Linux 發行版。在這篇文章中我會您如何使用 Memcached Cloud。

登入 Redis labs portal,點選 New Memcached Subscription

選擇您要使用的雲端平台/地區及方案。其中免費方案(25MB)可以提供您很好的開發測試,但無法達到商業需求。點選 Select ,建立一個新的 memcached endpoint。

輸入基本資料。範例中使用的 Drupal 模組不支援 SASL (Simple Authentication and Security Layer),它可以新增到您的 memcached 伺服器,因此我決定在這個步驟退出 SASL。輸入Resource name 後點擊 Activate。如果您已經有支持memcached 安全層的模組,您可以在建立 memcached endpoint 的過程中啟用它。

上述步驟完成後,您現在可以在 Redis Labs portal 管理您的 memcached service。

點擊您剛剛建立的 Resource Name 來連結到 server 端。請記下 Endpoint,您在配置 Drupal 時將會需要使用。

這裡下載和複製 memcached PECL擴充套件,請注意這個擴充是針對PHP5.4 (32 bit)。如果您的網站是使用不同的配置,請從這裡選擇適當的 DLL,為您的 Drupal 網站的 Drupal.In 網頁 dashboard 安裝 memcached module。在後台的設定內應用程式設定的部分,請設定 PHP_EXTENSIONS,其值為 “bin\php_memcache.dll”

settings.php 裡,在 $conf 變數中加入 memcached 伺服器。如果您沒有指定要哪一個伺服器,memcache.inc 會假設你有 memcached instance 運行在本地端機器上的 port 11211(127.0.0.1:11211 或 localhost:11211),但它假設的memcached instance 根本不存在,因此您的應用程式會被中斷。

該array應該照下面的格式:

 $conf['memcache_servers'] = array(
'pub-memcache-10939.us-east-1.1.azure.garantiadata.com:
10939' => 'default'
);

欲看更詳細的說明請至 Memcache API for Drupal。整個 Drupal 配置操作只需要一個 server bucket 就夠了,但如果您想將您的資料分散到數個 Memcached 伺服器,您可以很容易的從 Azure Store 新增Memcached server endpoint 。下面是示範設置 Memcached 伺服器的一個簡單例子,除了 ‘pages’ 緩存在 Bucket 2 外,其他所有資料都是緩存在 Bucket 1。

  $conf['memcache_servers'] = array(
 'server1_hostname:server1_port' => 'default',
 'server2_hostname:server2_port' => 'pages'
 );
 $conf['memcache_bins'] = array(
 'cache_page' => 'pages',
 );

一般快取的方法都是用 Content delivery network (CDN) 和 Memcached service 混合。Drupal 使用資料庫來存儲緩存,如果有任何內容被修改,Drupal 會偵測到並將有關的快取清除,以保持內容的一致性。Memcached 會取代 Drupal 內部的快取系統。

最佳的 Drupal CMS 架設技巧

一般雲端網站的操作方法:

  1. 為未來做好準備: 您必須追蹤網站的效能及需求、觀察用戶流量,來計畫哪些需要擴展、哪些要縮減,或改變硬體來達到您的需求。
  2. 備份網站: 備份您的網站及資料庫,記得測試備份和還原備份資料是否正常。

我們接著會針對 Drupal CMS 來學習在 Azure 上建立及管理 Drupal CMS 的最佳技巧。

安全性設定:

  1. 首先先刪除暫存檔。當你在編輯檔案時,系統或許會建立一些暫時備份檔,例如檔名最後為 .bak 或 ~ 的檔案或是像 settings.php.orig 這樣的檔案。如果您沒有在 web.config 用 URL 重寫規則來限制檔案的話,檔案都可以在瀏覽器中看見。如果您沒限制檔案的話,可能會讓駭客獲得重要資訊。為了保護重要資訊,您必須刪除在網頁上看的到的文件。以上的問題可以用下列方法解決:在 web.config 裡加入 URL 重寫規則來禁止別人取得檔案,或者您可以寫一個簡單的程式來找這些檔案並讓它自動刪除。
  2. 登入時,啟用 SSL loginDrupal 不需要使用 Secure sockets layer(SSL),因此,駭客可以更容易獲得您的網站管理權限。為了解決以上的問題,您必須到 drupal.org 裡安裝及開啟 Secure Pages 模組。這個模組可以確保任何/用戶的URL 使用 SSL 服務。
  3. 禁止使用者上傳不安全的檔案,惡意使用者可以透過上傳檔案來操控您的網站、侵占您的系統。限制上傳的檔案類型,排除一些潛在的惡意檔案類型,例如:.exe, .swf,.flv,.htm,.php,.vb,.vbs。
  4. 啟用 Security Kit 模組:Security Kit 模組可以為您的網站提供有用的安全性增強功能,例如 Clickjacking、Cross-Site Request Forgery (CSRF) 、Cross-Site Scripting (XSS)。一般我們會建議使用模組的預設格式,但它或許會阻擋您網站的一些特殊需求,因此您可以針對您的網站去做適當的調整。欲看更詳細的說明請至 Security Kit module
  5. 不要使用太常見的用戶名稱,像是 admin, administrator 以及 root,這可能會使您網站的安全性出現漏洞。
  6. 不要讓網站的錯誤訊息出現在使用者端,這可能會讓使用者知道一些網站的漏洞資訊。您可以在 /admin/config/development/logging 中打開 Logging and errors page,選擇 None from the Error messages to display,儲存。
  7. 啟用 Password policy 模組,避免使用者設定過於簡單的密碼,這也會讓駭客有機會攻擊您的網站。

效能設定:

  1. 讓cache週期的最小值少於 5 分鐘來增強網站的效能,最小快取週期可以預防 Drupal 在節點或 block 改變後清除頁面及快取。因為快取週期的最小值少於 5 分鐘,因此伺服器必須更常更新內容。您可以在 /admin/config/development/performance 打開 Performance 頁面,接著在最小快取週期下拉一個新的值。最小快取生命週期愈高愈好,這樣既有的頁面就會在快取中,但更動的內容又會在合理的時間內更新。
  2. 若您的頁面快取週期最大值小於 5 分鐘,因此伺服器必須經常重新生成頁面,這會降低您網站的效能。您可以在 /admin/config/development/performance 打開 Performance 頁面,接著在最大頁面 cache 週期下拉一個新的值,來設定最大頁面 cache 週期大於5分鐘。
  3. 若沒有啟用 CSS/JS 優化,瀏覽您網站的使用者會打開頁面時會比較慢,而且伺服器的負載量會較大。您可以在 /admin/config/development/performance 打開 Performance 頁面,接著選擇 Aggregate and compress CSS files 及Aggregate JavaScript files。
  4. 若沒有啟用頁面壓縮,使用者會花較多時間在加載頁面及資料檢索上。在存入快取前先壓縮頁面,可以讓 TCP/IP 到 MySQL 或 Memcache 後端的時間減少。您可以在 /admin/config/development/performance 打開 Performance 頁面,確認在 Caching 部分的匿名用戶的快取頁面有被勾選(若沒有勾選,勾完後按下儲存在繼續),接著選取 Compress cached pages。

Azure 網站設定:

  1. 啟用 Web server logging、使用儲存體帳戶來儲存這些資訊,儲存體帳戶可以跟儲存媒體資料用同一個。欲看更詳細的說明請至 Azure website diagnostics
  2. 設定 auto-scale,它可以依網站流量及負載量來自動調節您的網站,欲看更詳細的說明請至 Auto-scale Configuration
  3. 使用基本或標準模式,它會提供您專用的 VM instances,讓您的網站運行時有更好的效能,並能獲得 SLA 支援。欲看更詳細的說明請至 Features by tiers
  4. 設定網站至少使用2個中型或大型instances(instances指的是將網站抽象化的虛擬機器),若您只使用單一 instance,當它出錯時您的網站也會跟著一起掛掉。使用2個以上的 instances可以降低網站掛掉的風險。
  5. 使用 Visual Studio 負載測試工具來測試您的網站,確保您的網站規模可以負載網站流量。
  6. 啟用 Auto-healing,在某些情況下會自動回收您的 VM instances。欲看更詳細的說明請至 How to Auto-heal your website

程式碼撰寫技巧

  1. 盡可能避免更改到Drupal core。Drupal Core改變的話,會讓它更難管理您的網站上的版本更新,當您的網站成長時會很難維持正常運作。

  2. 避免使用過多模組。Drupal 提供您彈性地增加模組來擴充CMS的功能集。但過多的模組會使您的網站效能變慢。

  3. 運行在Azure網站上時要包含 web.config。Azure 網站服務使用 IIS,因此新增一個 web.config 可以保護未經授權的文件侵入以及管理 URL。這邊提供一個 Drupal 網站上的 web.config 簡單範例。您應該禁止 Application Request Routing  cookie,它可能會牽制使用者之後對特定 instance 的請求。禁用它可以讓你的網站正常負載,欲看更詳細的說明請至 Disable ARR Cookie。在 web.config 檔案的 <system.webserver> 下添加以下字串:

      <httpProtocol>
          <customHeaders>
            <add name="Arr-Disable-Session-Affinity" value="True" />
          </customHeaders>
        </httpProtocol>
    

跨區域擴展

當您在一個資料中心運行網站時,將 Drupal 放在多個區域可以避免在單一區域處理時遇到的單一點故障風險。雲端解決方案最重要的一點就是,您要假設每個元件(網站、資料庫、 cache等等)可能會失敗以及使您的解決方案有彈性,這會減少服務中斷所導致的營運成本。

在這種情況下,您必須將您的 Drupal 網站放在至少兩個以上的地區,例如放在美東及美西。下列顯示出 Drupal 網站上 Active-Active (Master-Master) 的網站配置:

  1. 兩個 Azure 網站連接他們各自的 MySQL 資料庫。
  2. 兩個 MySQL 資料庫與資料庫同步複製。
  3. Azure流量管理員基於效能,使用 Failover 或 Round robin 方法來平衡最終用戶流量。
  4. 啟用故障轉移來管理 Memcached 服務。
  5. 使用 Azure 儲存體 (地理複本備援) 搭配 Azure CDN。

建立這個架構是非常簡單的,但如果您的應用程式有一些特殊需求,您可以調整上述配置來達到您的需求。您可以更新配置:

  1. 建立一個主從關係的網站配置。
  2. 建立一主多從關係的網站配置。
  3. 使用Web Jobs來自定複製流程。
  4. 使用Web Jobs自動化管理流程。

擴展網站

擴充 Azure 網站包含這兩個操作:改變 Web Hosting Plan 模式來獲得更高的服務水平。切換到較高的服務水平後,在調整一些設定。這兩個操作都包含在本文中。高階的服務水平像是標準模式,讓您的資料在 Azure上更強大且彈性。欲看更詳細的說明請至 How to scale Azure website

擴展資料庫

Azure 網站及資料庫對您的應用程式來說是非常重要的。能否擴展資料庫的高可用性與故障回復全在於您如何建立資料庫。例如,以下有兩種情況:

  1. 如果您使用Clear DB服務,您必須配置 ClearDB high availability routing (CDBR),Clear DB提供跨區域複製資料庫(如東美及西美)。但您可以用 Azure Web Jobs來自訂複製資料庫的工具。
  2. 您也可以設置 MySQL Cluster CGE,它提供所有可以在 Azure 虛擬機器服務上管理 MySQL Cluster 的工具。請注意,在這種情況下,您將手動管理所有的 MySQL Cluster、資料庫複製和規模化經營。

擴展您的 Memcached Cache

在 Redis Labs Managed solution 中,Memcached Cloud 提供高可用性及故障修復。若您的網站規模很大,單一 memcached 端的故障修復是不夠的,您可以跨區域擴展 memcached cloud。欲看更詳細的說明請至 Memcached Cloud Features

針對您的用戶流量來設置流量管理器

Azure traffic manager 讓您可以對不同的端點分配不同的流量,這也包含網站。Traffic Manager 運作原理是藉由 intelligent policy engine 到 Domain Name System (DNS) 查詢網際網路資源的 domain 名稱。

您的雲端或網站可以運作在相同或世界各地不同的資料中心上。Traffic Manager 提供了3個方法:

  • 故障修復: 當您有端點在相同或不同的 Azure資料中心(即在Management Portal的區域),並且想要所有流量用一個主要的終點端,選取故障修復,但這不提供主要端或備份端點備份。欲看更詳細的說明請至 Failover load balancing method
  • Round Robin: 當你想在相同或不同的資料中心平均分配負載給一組端點,選擇 Round Robin。欲看更詳細的說明請至 Round Robin load balancing method
  • 效能: 當您有終點端在不同地方時,您想要求客戶端在最低延遲方面使用“最近”端點,選取效能。欲看更詳細的說明請至 Performance load balancing method

從 Azure 管理介面建立一個新的 Azure Traffic Manager 服務端點。

進入您流量管理端的後台,點擊 ADD to configure it to use the websites you want to route the traffic to. 如下圖:

Add 視窗中,服務類型選取 Web Site ,以及選擇您想要發送用戶流量的網站。

現在您可以看到,兩個端點都加入了流量管理,當您瀏覽此URL時,您可以看到流量會根據您的配置來分配。

總結

文章中我們主要是教各位如何簡單地把 Drupal 網站搬到 Azure 上,現在就讓我們在 Azure 平台上建立和擴充 Drupal 網站吧!