高性能Web伺服器Nginx的配置與部署研究——(13)應用模塊之Memcached模塊+Proxy_Cach

火星人 @ 2014-03-03 , reply:0


高性能Web伺服器Nginx的配置與部署研究——(13)應用模塊之Memcached模塊+Proxy_Cach

高性能Web伺服器Nginx的配置與部署研究——(13)應用模塊之Memcached模塊+Proxy_Cache雙層緩存模式


通過《高性能Web伺服器Nginx的配置與部署研究——(11)應用模塊之Memcached模塊的兩大應用場景》一文,我們知道Nginx從Memcached讀取數據的方式,如果命中,那麼效率是相當高的。那麼:

(轉載請註明來自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891)


1. 如果不命中呢?

我們可以到相應的數據伺服器上讀取數據,然後將它緩存到Nginx伺服器上,然後再將該數據返回給客戶端。這樣,對於該資源,只有穿透Memcached的第一次請求是需要到數據伺服器讀取的,之後在緩存過期時間之內的所有請求,都是讀取Nginx本地的。不過Nginx的proxy_cache是本地硬碟緩存,效率要遠低於Memcached。




2. 應該如何安裝和配置呢?




(1)HttpMemcModule模塊

如果使用Nginx的非核心模塊——HttpMemcModule模塊,則可以下載模塊:

http://github.com/agentzh/memc-nginx-module/tags





view plaincopy to clipboardprint?
michael@dev-machine:~$ tar -zxvf agentzh-memc-nginx-module-a0bc33a.tar.gz  
michael@dev-machine:~$ tar -zxvf nginx-1.1.12.tar.gz  
michael@dev-machine:~$ cd nginx-1.1.12  
michael@dev-machine:~$ ./configure --add-module=/home/michael/agentzh-memc-nginx-module-a0bc33a.tar.gz  
michael@dev-machine:~$ sudo make  
michael@dev-machine:~$ sudo make install  
michael@dev-machine:~$ tar -zxvf agentzh-memc-nginx-module-a0bc33a.tar.gz
michael@dev-machine:~$ tar -zxvf nginx-1.1.12.tar.gz
michael@dev-machine:~$ cd nginx-1.1.12
michael@dev-machine:~$ ./configure --add-module=/home/michael/agentzh-memc-nginx-module-a0bc33a.tar.gz
michael@dev-machine:~$ sudo make
michael@dev-machine:~$ sudo make install
目前驗證發現Nginx 1.0.10版本安裝Nginx時,需要額外通過--add-module來載入upstream-keepalive模塊,請自行google之。其他版本還不確定,猜測是在1.1之後開始自動攜帶upstream-keeplive模塊的。




(轉載請註明來自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891)





然後我們來編輯配置文件吧。如下:


view plaincopy to clipboardprint?http {  
    ...  
    upstream data_server {  
        server  192.168.0.133:1234;  
        server  192.168.0.134:1234;  
        server  192.168.0.135:1234;  
        ip_hash;  
    }  
  
    upstream memc_backend {  
        server  127.0.0.1:11211;  
    }  
    ...  
    server {  
  
        listen      8080;  
        server_name localhost;  
  
        default_type    text/html;  
  
        location / {  
            set     $memc_cmd   get;  
            set     $memc_key   $uri;  
            memc_pass   memc_backend;  
  
            error_page  404 @fallback;  
        }  
  
        location @fallback {  
  
            internal;  
  
            proxy_pass      http://data_server;  
  
            proxy_cache     cache_one;  
            proxy_cache_valid   200 302 1h;  
            proxy_cache_valid   301 1d;  
            proxy_cache_valid   any 1m;  
            expires         30d;  
        }  
    }  
    ...  
}  
http {
        ...
        upstream data_server {
                server        192.168.0.133:1234;
                server        192.168.0.134:1234;
                server        192.168.0.135:1234;
                ip_hash;
        }

        upstream memc_backend {
                server        127.0.0.1:11211;
        }
        ...
        server {

                listen                8080;
                server_name        localhost;

                default_type        text/html;

                location / {
                        set                $memc_cmd        get;
                        set                $memc_key        $uri;
                        memc_pass        memc_backend;

                        error_page        404 @fallback;
                }

                location @fallback {

                        internal;

                        proxy_pass                http://data_server;

                        proxy_cache                cache_one;
                        proxy_cache_valid        200 302 1h;
                        proxy_cache_valid        301 1d;
                        proxy_cache_valid        any 1m;
                        expires                        30d;
                }
        }
        ...
} 從上面的配置文件我們可以看出,一個請求到達后,會其uri作為key去Memcached伺服器127.0.0.1:11211上查找value,如果沒有命中,則返回404。這時通過error_page將404接收轉到@fallback,然後去data_server中取文件,取完后將該文件在本地磁碟緩存,同時用戶的瀏覽器也通過expires設置緩存時間。




這樣絕大多數請求如果被第一層Memcached的內存緩存攔截的話,剩餘的請求可以通過訪問第二層Nginx伺服器的硬碟緩存文件,來減少穿透。




按照上面的方式,客戶端得到的請求響應中雖然包含了正確的文件內容,但狀態碼都是404(可以通過Fiddler來觀察)。這似乎會引起問題。什麼問題呢?絕大多數瀏覽器,即使在404的情況下,也會嘗試去讀取內容,如果有正確的內容,是可以正確顯示的。但是比較常見的可能引起問題的兩種情況是:

(a)、搜索引擎的spider爬到的404時,一般不會收錄該URL,我想這不是你所希望看到的;

(b)、Flash等方式載入時,如果頭是404,可能不予顯示,我想著也不是你所希望看到的。




(轉載請註明來自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891)





那我們把它改成都是200,是不是很好呢?


view plaincopy to clipboardprint?
error_page  404 =200 @fallback;  
error_page        404 =200 @fallback;




非也,這樣404傳遞到fallback處理請求后的狀態如果不是200,就很不一致了,會引起更多問題。所以應該如下配置:

view plaincopy to clipboardprint?
error_page  404 = @fallback;  
error_page        404 = @fallback;
這樣fallback的處理結果狀態是什麼,就用什麼替換404。






(2)Nginx內部的Memcached模塊

如果你想使用Nginx內部的Memcached模塊,配置文件可以結合參考上面的示例和《高性能Web伺服器Nginx的配置與部署研究——(11)應用模塊之Memcached模塊的兩大應用場景》

《解決方案》

謝謝分享



[火星人 via ] 高性能Web伺服器Nginx的配置與部署研究——(13)應用模塊之Memcached模塊+Proxy_Cach已經有220次圍觀

http://www.coctec.com/docs/service/show-post-1190.html