nginx無痛升級並增加nginx-gridfs模組支援
在不影響
Ubuntu系統版本:
cat /etc/issue
Ubuntu 12.10 \n \l
cpu:x86_64nginx版本:原先使用apt-get安裝的,已解除安裝,版本貌似是1.1左右
即將安裝nginx版本1.4.4
升級步驟:
1.首先準備好將要使用的工程,下載nginx相應版本原始碼
2.解壓,進入主目錄 vi nginx-1.4.4/objs/Makefile修改一個小錯誤,把第3行的-Werror錯誤去掉,不然會報一個unused錯誤。
3.檢視現有版本的配置資訊nginx -V,並記錄下來,比如我的是:
sudo ./configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-auth-pam --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-echo --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-upstream-fair --add-module=/build/buildd/nginx-1.1.19/debian/modules/nginx-dav-ext-module
這就是原先編譯的配置引數資訊了,但是升級的時候不能直接拿來用,因為後面的--add-module路徑引數都不對,而且不同版本間的模組叫法等也許不一樣了。
標準模組很多都是必須安裝的,如果不想安裝使用--without開頭的配置。
還有一些可選的模組,看個人的需要添加了,還有郵件模組,另外還有第三方模組,比如nginx-gridfs就屬於第三方的模組。
4.這步驟新增nginx-gridfs,如果不需要可以跳過此步驟。首先從github上下載nginx-gridfs工程,然後按照步驟git submodule init, git submodule update.
5.鑑於nginx已經把很多的模組作為標準模組了,因此,有些模組已經被預設安裝了,我們配置的時候直接使用原先的配置即可。如果不加nginx-gridfs模組,去掉其引數即可。
sudo ./configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/opt/nginx-gridfs/
配置過程中有可能會出現如下一些錯誤:
錯誤提示“
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.
”
apt-get install libxml2
apt-get install libxslt1-dev
錯誤提示“
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
”
apt-get install libgd2-xpm libgd2-xpm-dev
錯誤提示“
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
”
apt-get install libgeoip-dev
錯誤提示:”checking for PCRE library in /usr/include/pcre/ ... not found
“
apt-get install libpcre3-dev libssl-dev
6.make
7.sudo apt-get remove nginx 把原先的nginx相關模組解除安裝掉。或者which nginx,然後找到位置備份之。
8.sudo make install
9. sudo make upgrade 更新
nginx -v檢視當前的版本號是否是1.4.4, which nginx檢視當前nginx的連結位置
nginx -V 檢視引數配置是否正確
sudo ln -s /et/nginx/sbin/nginx /usr/sbin/
-----------------------------------------------------------------------------------------------
昨晚太晚了,沒搞完,今天接著弄!
現在接著配置nginx-grifs,實現nginx-gridfs功能
10. sudo /etc/nginx/nginx.conf 開啟配置,新增如下配置:
location /img/ { #gridfs 資料庫名 gridfs img field=filename type=string; mongo 127.0.0.1:27017; #local }
gridfs:nginx識別外掛的關鍵字
pics:db名
[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
參考於網路 http://www.cnblogs.com/zhangmiao-chp/archive/2011/05/05/2038285.html如果出現:
Starting nginx: nginx: [emerg] "location" directive is not allowed here in /etc/nginx/nginx.conf:10
nginx: configuration file /etc/nginx/nginx.conf test failed
的錯誤,那有可能是你配置錯了,location位於http{}中並且在某server{}中
11.上傳檔案驗證:
sudo mongofiles put --host localhost --port 27017 --db img --local ~/photo.jpg --type jpg
然後瀏覽器訪問 IP/img/xxxname.jpg
如果正確就可以看到圖片了。
專案中使用nginx-gridfs,是為了直接訪問靜態檔案,以提高訪問效率。使用mongodb儲存圖片畢竟不是長久之計,隨著專案的發展也有可能需要單獨做一個圖片伺服器,甚至叢集,不管怎樣,不斷的升級,不斷的重構,不斷的優化將伴隨著專案的整個過程。不用想的太遠,但是也要去預測短期的專案未來,及時做好準備,這樣才能走好腳下的路。
推薦幾篇關於圖片服務的文章 :
----------------------------------------------------------- 2013.12.25再次更新 -------------------------------------------------------------------
原來編譯的過程中忽略了一個小細節,當時我編譯不過,認為是新版本github上提交出現的問題,當時還給其中以為共享者發了郵件,但是沒回我,所以從別的地方下載了一個老的版本。後來,成功之後,我以為是我操作不當導致我當時沒編譯過,所以直接把我的步驟換成了官網的步驟。但是現在我在把程式部署到伺服器上的時候才發現,無法通過網址訪問到圖片,查了一下日誌,只發現當訪問的時候會出現如下log:
[error] 11336#0: *1 Mongo connection dropped, could not reconnect, client: 192.168.1.69, server: img.xxx.com, request: "GET /static/img/test.jpg HTTP/1.1", host: "192.168.1.69"
Mongo連線掉線了,並且無法重連。我開始以為是本地ubuntu和伺服器系統版本之間的問題,但是伺服器升級有風險,遂沒有實施。於是想起這個細節,再次在本地驗證,果不其然。
附件上傳一個我當時下載的經過測試可以正常使用的nginx-gridfs版本。
依然不清楚導致此問題的原因。
資源下載在這裡:點我
把圖片字尾jpg去掉解壓即可。