從七牛上線的時候就開始使用七牛云存儲的服務(wù),對于其中的圖片處理一直比較好奇皆看,只需要簡單的在圖片的訪問鏈接上加上參數(shù)龙誊,就可以按照定義的功能,得到裁剪或者處理好的圖片春哨。
對于實現(xiàn)的機制荆隘,也不能說是完全沒有概念,只是從來沒有認(rèn)真的思考或者嘗試著動手實現(xiàn)一下赴背。所以一直只是一個當(dāng)作縮放工具來用的普通用戶椰拒;最近正好看到一個使用nginx和libgb實現(xiàn)的圖片處理服務(wù),感覺非常簡單就可以搭建凰荚,果斷嘗試了之后燃观,確實get了一項很實用的技能或者說是工具。
運行原理和機制
實現(xiàn)一個圖片處理服務(wù)器本身如果不去自己實現(xiàn)web服務(wù)器和圖片處理的核心程序的話便瑟,只是以使用功能為目的的話缆毁,圖片處理功能更多在于技術(shù)選型和運維。定義好資源訪問的路由規(guī)則和調(diào)用圖片處理的語法之后到涂,簡單的運行原理應(yīng)該包含以下步驟:
- web服務(wù)器將資源請求轉(zhuǎn)發(fā)給有處理能力并且已經(jīng)注冊的應(yīng)用服務(wù)器或者調(diào)用本地程序脊框;
- 應(yīng)用服務(wù)器(例如PHP)根據(jù)路由規(guī)則,和應(yīng)用程序本身的設(shè)計养盗,定位到路由對應(yīng)的圖片二進(jìn)制文件缚陷;
3 根據(jù)路由,或者其他http header信息往核,解析要對圖片進(jìn)行的解析操作箫爷; - 應(yīng)用服務(wù)器自己實現(xiàn),或者調(diào)用其他的圖片處理庫,或者調(diào)用其他程序(例如ImageMagick)虎锚,對二進(jìn)制文件進(jìn)行處理硫痰,獲得處理好的圖片;
- 將圖片按照http協(xié)議窜护,返回請求的客戶端效斑。
自己設(shè)計實現(xiàn)對ImageMagick、GD的封裝柱徙,或者是嘗試自己編寫處理圖片的程序缓屠,都是很有趣的事情,應(yīng)該找機會親自動手實踐护侮。
解決方案
最近偶然看到的一個方案是敌完,使用nginx提供的nginx-module-image-filter,nginx的擴展模塊羊初,就可以提供最基礎(chǔ)的圖片裁剪服務(wù)器滨溉,簡單了解之后,馬上著手使用docker開始搭建nginx圖片處理服務(wù)器长赞。
安裝nginx晦攒,并開啟image-filter模塊
本例中使用centos安裝nginx,要使用image-filter模塊得哆,首先需要安裝gd脯颜,實際上gd是真正處理圖片等程序,使用yum安裝yum install -y gd-devel
贩据。
參看nginx的官方文檔之后伐脖,知道image-filter這個module默認(rèn)不會自己編譯到安裝包中的,所以需要自己手動安裝乐设,下載nginx源碼,解壓縮之后進(jìn)入目錄绎巨,執(zhí)行./configure --prefix=/usr/local/nginx --with-http_image_filter_module
近尚,然后make編譯。
編譯成功之后curl http://localhost:8080/
场勤,檢查安裝是否成功戈锻。
下面是完整的Dockerfile文件,為了提高下載速度和媳,使用的是時速云提供的centos鏡像格遭。
FROM index.tenxcloud.com/tenxcloud/docker-centos
#FROM centos
RUN yum install -y gd-devel wget \
&& yum -y install gcc gcc-c++ kernel-devel make \
&& wget http://nginx.org/download/nginx-1.11.7.tar.gz \
&& tar -xzvf nginx-1.11.7.tar.gz \
&& wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz \
&& tar -xzvf pcre-8.39.tar.gz \
&& cd nginx-1.11.7 \
&& ./configure --prefix=/usr/local/nginx --with-http_image_filter_module --with-pcre=../pcre-8.39 \
&& make \
&& make install
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/nginx/sbin
WORKDIR /var/www
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
nginx配置,啟用image filter
安裝完nginx之后留瞳,直接設(shè)置image filter的規(guī)則就可以使用圖片處理功能拒迅。
location /img/ {
proxy_pass http://backend;
image_filter resize 150 100;
image_filter rotate 90;
error_page 415 = /empty;
}
location = /empty {
empty_gif;
}
通過設(shè)置proxy_pass
,我們要對某個網(wǎng)站上的圖片進(jìn)行裁剪,只需要將代理設(shè)置到指向該網(wǎng)站就可以了璧微。
image_filter resize 150 100;
就是重新調(diào)整圖片的尺寸作箍。
image_filter off;
配置可以關(guān)閉image filter。
通過結(jié)合nginx的解析規(guī)則前硫,我們就可以根據(jù)url鏈接的參數(shù)胞得,動態(tài)的制定要縮放圖片的大小。
location ~* (.*\.(jpg|gif|png))!/w/(.*)/h/(.*)$ {
set $width $3;
set $height $4;
rewrite "(.*\.(jpg|gif|png))(.*)$" $1;
}
location ~* /static/.*\.(jpg|gif|png)$ {
proxy_pass http://www.liuwill.com;
image_filter resize $width $height;
}
配置完成之后屹电,調(diào)用nginx -s reload
加載新的配置文件阶剑,然后輸入鏈接http://localhost/static/image_url.png/w/100/h/100
,查看效果危号。
詳細(xì)說明可以參看nginx提供的image filter官方文檔牧愁。
github地址:https://github.com/liuwill-projects/docker-nginx-img