程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Magento資源問題上CDN方案研究,magento資源cdn方案

Magento資源問題上CDN方案研究,magento資源cdn方案

編輯:關於PHP編程

Magento資源問題上CDN方案研究,magento資源cdn方案


  通過對Magento的了解,發現Magento的資源文件主要分布在media、js、skin三個文件夾裡,media文件夾主要包括了系統自帶編輯器WYSIWYG Editor 所有編輯器涉及到的資源(Static Blocks、Pages、Product Intro、Product Images)以及Magento自主生成的媒體資源  (包含了我們允許用戶上傳文件的文件夾);skin文件夾主要是模板提供的樣式、圖片、js資源(一般我們對模板再次改造時會改到這個文件夾裡的資源);js文件夾包括Magento官方的prototype、varien、scriptaculous、mage等js庫以及附屬資源(一般我們不會去動這個文件夾),這三個文件夾所包含的全部都是靜態資源(圖片、js、css、字體、文檔等) 也就是我們可以CDN的文件

  通過對Magento源碼的觀察,網站公開方法getBaseUrl  AT  app/core/Mage/Core/Model/Store.php

public function getBaseUrl($type = self::URL_TYPE_LINK, $secure = null)
{
    $cacheKey = $type . '/' . (is_null($secure) ? 'null' : ($secure ? 'true' : 'false'));
    if (!isset($this->_baseUrlCache[$cacheKey])) {
        switch ($type) {
            case self::URL_TYPE_WEB:
                $secure = is_null($secure) ? $this->isCurrentlySecure() : (bool)$secure;
                $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_url');
                break;

            case self::URL_TYPE_LINK:
                $secure = (bool) $secure;
                $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_link_url');
                $url = $this->_updatePathUseRewrites($url);
                $url = $this->_updatePathUseStoreView($url);
                break;

            case self::URL_TYPE_DIRECT_LINK:
                $secure = (bool) $secure;
                $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_link_url');
                $url = $this->_updatePathUseRewrites($url);
                break;

            case self::URL_TYPE_SKIN:
            case self::URL_TYPE_JS:
                $secure = is_null($secure) ? $this->isCurrentlySecure() : (bool) $secure;
                $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_' . $type . '_url');
                break;

            case self::URL_TYPE_MEDIA:
                $url = $this->_updateMediaPathUseRewrites($secure);
                break;

            default:
                throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid base url type'));
        }

        if (false !== strpos($url, '{{base_url}}')) {
            $baseUrl = Mage::getConfig()->substDistroServerVars('{{base_url}}');
            $url = str_replace('{{base_url}}', $baseUrl, $url);
        }

        $this->_baseUrlCache[$cacheKey] = rtrim($url, '/') . '/';
    }

    return $this->_baseUrlCache[$cacheKey];
}

 

URL_TYPE_MEDIA的獲取方式更復雜些 我們也看看寫了什麼

protected function _updateMediaPathUseRewrites($secure = null, $type = self::URL_TYPE_MEDIA)
{
    $secure = is_null($secure) ? $this->isCurrentlySecure() : (bool) $secure;
    $secureStringFlag = $secure ? 'secure' : 'unsecure';
    $url = $this->getConfig('web/' . $secureStringFlag . '/base_' . $type . '_url');
    if (!$this->getConfig(self::XML_PATH_USE_REWRITES)
        && Mage::helper('core/file_storage_database')->checkDbUsage()
    ) {
        $urlStart = $this->getConfig('web/' . $secureStringFlag . '/base_url');
        $url = str_replace($urlStart, $urlStart . self::MEDIA_REWRITE_SCRIPT, $url);
    }
    return $url;
}

 

我們可以發現所有$type 類型的 始終會從 getConfig(string configPath)  中獲得,所獲得保存數據庫 在後台 configuration -> general Web -> Unsecure & Secure 裡可以配置修改。

假設把Magento整站當做CDN源服務器,再把BASE_MEDIA_URL、BASE_SKIN_URL、BASE_JS_URL的值改成CDN的地址,是不是就對Magento的資源進行了CDN處理了呢,於是我就先把本地的機器裝上了Magento來測試一番(俗話說實踐是檢驗真理的唯一方法),由於CDN需要域名解析,我們暫時不理會也不去搞CDN,但是我們可以用重定向一個新域名來代表這個CDN,比如 hosts裡加兩個域名用來測試

  127.0.0.1       magento.yourdomain.com
  127.0.0.1       mage-cdn.yourdomain.com

Nginx裡把原來magento.yourdomain.com的配置復制一份並刪除php解析那一段保證安全。順便在資源那加入盡可能多的資源類型(以後不夠還可以再加)

重啟nginx,然後登陸Magento後台 把 BASE_MEDIA_URL、BASE_SKIN_URL、BASE_JS_URL 中原來的 {{base_unsecure_url}} 都改成 http://mage-cdn.yourdomain.com/ 、{{base_secure_url}} 都改成 https://mage-cdn.yourdomain.com/ 然後保存設置  重新刷下Magento緩存 OK 大功告成。

打開http://magento.yourdomain.com/ 試試,诶 假設你用了別的模板,裡面加了很多字體,你可能會看到有跨域訪問的錯誤提示:

Font from origin 'https://mage-cdn.yourdomain.com' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://magento.yourdomain.com' is therefore not allowed access.

他告訴你magento的站點想訪問mage-cdn的一些資源但是由於沒有Access-Control-Allow-Origin 頭,所以我們在nginx配置mage-cdn站點裡資源文件訪問時統一加上 add_header Access-Control-Allow-Origin https://magento.yourdomain.com. 為什麼不用*呢,假如你很大方的想別的網站也能跨域訪問你的資源那你就使用*吧,我是建議那裡用的綁哪裡,呵呵

然後我們在打開Magento站點 進行各種測試 注冊 登陸 下單 上傳 後台各種編輯 OK 這次我們真的大功告成了。

加下來就是部署CDN了,登陸CDN服務商,直接將源站點設置為你的 magento.yourdomain.com  一般CDN都提供CNAME服務,那麼你大方的解析一個cdn.yourdomain.com CNAME給 CDN服務商提供給你的地址 abcd.xxxx.com ,一般CDN服務商也同樣提供headers 的添加 你可以為這個CDN添加需要headers,就是我們需要的跨域請求。再就是配置Magento 然後blablabla 最後你想辦法讓CDN服務商用你的crt證書。OK 這下可以搞定了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved