php+gridfs+varnish+nginx 搭建分散式圖片儲存

黎博發表於2012-03-05

優勢

1  資料遷移方便,所有資料基於mongodb-grids儲存,分散式配置,資料遷移等操作非常方便
2  mongodb 穩定性 可靠性 要比其他分散式檔案儲存效能更好
3  基於varnishd做快取,有效解決了 從gridfs讀取資料需要查詢2次的問題,提高了效能
4  使用方便,程式碼行數寥寥無幾,輕鬆搞定,各項配置也很簡單
5  nginx-gridfs 外掛可以基於nginx直接使用,無需再用php從mongodb中讀取資料生成圖片

=============================================

1編譯安裝php的mongodb擴充套件

https://github.com/mongodb/mongo-php-driver/downloads

下載最新版

$ cd mongo-php-driver
$ phpize
$ ./configure --with-php-config=/path/to/php-config
$ make
$ make install

2編譯安裝nginx &nginx-gridfs

https://github.com/mdirolf/nginx-gridfs

下載最新版

$ ./configure --add-module=/path/to/nginx-gridfs/source/
$ make
$ make install

3 安裝varnishd

安裝步驟 參見 http://lnmp.in/install-varnish

PHP測試gridfs寫入

PHP:

$conn = new Mongo();  
$db = $conn->photo;   
$grid = $db->getGridFS();  


$data = file_get_contents("http://xxx.com/20120303/6f73/6a69/6d64597a/1330782227306.1400.467.467.jpg"); 
$id = $grid->storeBytes($data); 

var_dump($id);

nginx 的配置檔案

server
{
    listen       8080;
    server_name  photo.com;
    index index.html index.php index.htm;

    location /photo/
    {
       gridfs photo field=_id type=objectid;
       default_type image/jpeg;
       mongo 127.0.0.1:27017;
    }
}

varnishd 部分配置

backend default {
 .host = "127.0.0.1";
 .port = "8080";
}

sub vcl_recv {
 if (req.http.host ~ "photo.com")
 {
   unset req.http.cookie;
   return (lookup);
 }

}

sub vcl_deliver
{
    set resp.http.Expires = "Sun, 17 Feb 2013 05:00:00 GMT";
    unset resp.http.X-Varnish;
    unset resp.http.Age;
    unset resp.http.Via;
    unset resp.http.Connection;
    set resp.http.Cache-Control = "max-age=2592000";
    set resp.http.Last-Modified = "Sat, 24 Dec 2011 01:24:34 GMT";
    if (obj.hits > 0) 
    {
       set resp.status=304;
    }
 }

啟動varnishd

/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,1G   -a 127.0.0.1:80

本文僅僅是提供了一個示例,全部程式碼要自己根據情況修改哈~ 首次發文,請大牛拍磚

原文來自我的blog http://lnmp.in

我的微博 http://weibo.com/pojaaer 求粉~~~

相關文章