MongoDB GridFS圖片文件存儲解決方案
Mongodb GridFS圖片文件存儲解決方案
之前解決方案是接收圖片數據后,將圖片直接存儲到盤陣,然后通過Apache做服務器,將圖片信息存儲到數據庫,并且存儲一個Apache的訪問路徑。
目前需要后臺服務存儲圖片,將圖片存儲到MongoDB集群中,然后通過Nginx中的nginx-gridfs模塊進行訪問,在瀏覽器中通過url訪問,效果與Apache訪問本地文件一樣。
本方案的內容比較基礎,以后會有深入了解和優化,敬請期待!
一、安裝MongoDB
(1)安裝MongoDB
進入計劃安裝目錄:cd /usr/local/
下載mongodb-linux-x86_64-2.6.1.tgz https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
解壓:tar -zxf mongodb-linux-x86_64-2.6.1.tgz
改名:mv mongodb-linux-x86_64-2.6.1 mongodb2.6.1
創建數據目錄和日志目錄: mkdir -p mongodb2.6.1/mongodb_data/mongodb_db
mkdir -p mongodb2.6.1/mongodb_data/mongodb_logs
啟動MongoDB: 進入MongoDB bin目錄執行以下命令:
cd /usr/local/mongodb2.6.1/bin
./mongod --dbpath=/usr/local/mongodb2.6.1/mongodb_data/mongodb_db/ --logpath=/usr/local/mongodb2.6.1/mongodb_data/mongodb_log/mongodb.log --logappend &
檢查啟動狀態:
ps -ef | grep mongo 看到剛才啟動命令就說明在運行了
通過 netstat -ant | grep 27017 還能查看端口靜態狀態
[root@zjhl1 opt]# ps -ef | grep mongo root 16350 10593 1 15:40 pts/1 00:01:11 ./mongod --dbpath=/opt/mongodb2.6.1/mongodb_data/mongodb_db/ --logpath=/opt/mongodb2.6.1/mongodb_data/mongodb_logs/mongodb.log --logappend root 19027 10593 0 17:21 pts/1 00:00:00 grep mongo [root@zjhl1 opt]# [root@zjhl1 opt]# netstat -ant | grep 27017 tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:27017 127.0.0.1:47686 ESTABLISHED tcp 0 0 127.0.0.1:47686 127.0.0.1:27017 ESTABLISHED tcp 0 0 192.168.1.111:27017 192.168.1.100:53462 ESTABLISHED [root@zjhl1 opt]#
(2)安裝MongoVUE客戶端
MongoVUE是類似oracle中PL/SQL Developer 或者MySql中SQLyog的圖形化客戶端。
目前是收費的,下載后Installer.msi后直接安裝就行。至于授權問題自己百度解決。
此工具的功能很多,這里不展開講,有需要的自己百度。
二、安裝Nginx
(1)下載nginx-gridfs插件
網上有傳出使用git安裝此插件的,這個比較麻煩,我在文章的附件中留了下載包。本人測試可用。
下載后還要下載mongo的c語言驅動包,這個也可以在附件中下載。
下載完成后進行解壓:tar -zxf nginx-gridfs.tar.gz
tar -zxf mongo-c-driver-0.94.2.tar.gz
解壓完成后將驅動包內容全部拷貝到nginx-gridfs目錄下的mongo-c-driver目錄中:
mv mongo-c-driver-0.94.2/* nginx-gridfs/mongo-c-driver/
如果有提示已經存在src目錄,沒有關系,忽略。然后就是下載Nginx,編譯安裝的過程了。
(6)下載Nginx1.0.1
Nginx版本太高對支持nginx-gridfs模塊不是很成功,我是使用的Nginx1.7弄了一天都出不來圖片。換成1.0.1就好了。對c不是很熟悉就沒有深究。有那位大拿知道可以告訴我。
wget http://nginx.org/download/nginx-1.0.1.zip
解壓:unzip nginx-1.0.1.zip
配置編譯時設置:./configure --prefix=/usr/local/nginx --with-openssl=/usr/include/openssl --with-http_stub_status_module --add-module=/opt/nginx-gridfs
編譯: make
安裝:make install
配置mogon-gridfs地址:
在vim /usr/local/nginx/conf/nginx.conf配置文件中,增加下面的內容:
location /pics/ {
gridfs pics
field=filename
type=string;
mongo 127.0.0.1:27017;
}
gridfs:nginx識別插件的名字
pics:數據庫名稱
[root_collection]: 選擇collection,如root_collection=blog, mongod就會去找blog.files與blog.chunks兩個塊,默認是fs
[field]:查詢字段,保證mongdb里有這個字段名,支持_id, filename, 可省略, 默認是_id
[type]:解釋field的數據類型,支持objectid, int, string, 可省略, 默認是int
[user]:用戶名, 可省略
[pass]:密碼, 可省略
mongo:mongodb url mongo名稱 地址:端口
#access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /pics/ { gridfs pics field=filename type=string; mongo 127.0.0.1:27017; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html
啟動:/usr/local/nginx/sbin/nginx &
查看日志:tail -f /usr/local/nginx/logs/error.log
檢查: 在瀏覽器輸入: http://192.168.1.111/
當你看到下面的字母就說明nginx啟動成功了。
Welcome to nginx!
三、測試開發
測試例子使用java開發,代碼在附件中
(1)圖片寫入
全部的例子在附件中,GridFSTest.rar,例子還需要mongodb的驅動jar包mongo-java-driver-2.9.3.jar 。
try { Mongo mongo = new Mongo("192.168.100.52", 27017);// 創建連接 DB db = mongo.getDB("pics"); // 選擇數據庫 byte[] files = createImage(800, 600, "800 X 600"); // 創建圖片 save(files, "test3.jpg", db); // 存儲圖片 } catch (Exception e) { e.printStackTrace(); }
(2)文件獲取
通過代碼獲取圖片就不寫了。只寫如何在程序中傳遞文件路徑,然后在前端展示。
存儲圖片信息時,可以加上ip地址:http://192.168.100.52/pics/test3.jpg ,然后前端應用通過給定的URL地址就可以獲取圖片內容了。
在瀏覽器中輸入地址可以獲得相同的效果。