摘要:我覺(jué)得結(jié)合的反向代理,緩存和圖像過(guò)濾處理三大模塊來(lái)為我托管在上的圖片來(lái)創(chuàng)建一個(gè)縮略圖服務(wù)器會(huì)很優(yōu)雅。后者將作為的反向代理,產(chǎn)生并提供調(diào)整大小后的圖像。它返回有效的響應(yīng),緩存服務(wù)器將緩存該響應(yīng)天,其它任何東西都只緩存秒。
一兩個(gè)月前,我決定從我的站點(diǎn)中移除Varnish ,并用Nginx內(nèi)置的緩存系統(tǒng)替代它。我本來(lái)已經(jīng)在我的python站點(diǎn)上用了nginx來(lái)反向代理,所以擺脫Varnish意味著少了一個(gè)麻煩。我花了好幾天時(shí)間閱讀怎樣配置nginx的緩存,翻遍了我的python站點(diǎn)的不同的配置文件(是的,很諷刺)。在閱讀過(guò)程中我標(biāo)記了一些有趣的nginx的模塊,這中間就有 Image Filter module(圖像過(guò)濾處理模塊)。
我覺(jué)得結(jié)合nginx的反向代理,緩存和圖像過(guò)濾處理三大模塊來(lái)為我托管在S3上的圖片來(lái)創(chuàng)建一個(gè)縮略圖服務(wù)器會(huì)很優(yōu)雅。如果你仔細(xì)的查看下面的(甚至整個(gè)站點(diǎn)的)標(biāo)簽,你就可以看到nginx實(shí)戰(zhàn)了。
在本文中,我將描述我是怎樣配置nginx來(lái)有效安全的為S3上的圖片產(chǎn)生縮略圖。作為額外獎(jiǎng)勵(lì),我也會(huì)描述我是怎樣使用 Secure Links module (安全鏈接模塊)來(lái)防止人們惡意使用該服務(wù)器產(chǎn)生縮略圖。
準(zhǔn)備開(kāi)始為了讓不同部分能協(xié)同工作,你的nginx需要編譯進(jìn)圖像濾波,代理和安全鏈接三個(gè)模塊。你可以通過(guò)nginx –V 來(lái)檢查你所具有的模塊。如果你使用的Ubuntu(Debian也行),你可以很輕易的安裝其它任意的nginx模塊(apt-get install 命令)。
一旦nginx準(zhǔn)備好了,我們可以開(kāi)始配置nginx了。
配置首先需要申明的是我們的代理緩存。這個(gè)申明位于nginx.conf文件的http部分并且描述了基于文件的緩存所在,該緩存將會(huì)存儲(chǔ)我們產(chǎn)生的縮略圖。因?yàn)橐淮尉彺嫖疵屑匆馕吨獜腟3服務(wù)器上獲取完整的圖并且改變它的大小,我們希望配置緩存足夠大以使其能包含我們大部分的縮略圖。對(duì)于我的站點(diǎn),我估計(jì)200MB足夠了。
為了確定你的緩存,把下面的代碼添加到nginx配置文件的http部分的某個(gè)地方:
# Nginx will create a cache capable of storing 16MB of keys and 200MB of data. proxy_cache_path /tmp/nginx-thumbnails levels=1:2 keys_zone=thumbnail_cache:16M inactive=60d max_size=200M;
現(xiàn)在我們需要說(shuō)明兩個(gè)服務(wù)器定義:一個(gè)緩存服務(wù)器和一個(gè)調(diào)整大小服務(wù)器。后者將作為S3的反向代理,產(chǎn)生并提供調(diào)整大小后的圖像。緩存服務(wù)器位于調(diào)整大小服務(wù)器的前面,緩存并提供調(diào)整大小后的圖像。雖然我不認(rèn)為必須要兩個(gè)服務(wù)器,因?yàn)槲业恼军c(diǎn)訪問(wèn)量并不是特別大,但在谷歌了一下后,我看見(jiàn)的一些文章表明,就是應(yīng)該這樣。
緩存服務(wù)器緩存服務(wù)器會(huì)暴露給公共訪問(wèn)(我的位于m.charlesleifer.com)。因?yàn)樵摲?wù)器的唯一任務(wù)就是緩存從調(diào)整大小服務(wù)器獲得的響應(yīng),所以配置相當(dāng)簡(jiǎn)單。下面是我的配置:
server { listen 80; server_name m.charlesleifer.com; location / { proxy_pass http://localhost:10199; proxy_cache thumbnail_cache; proxy_cache_key "$host$document_uri$is_args$arg_key"; proxy_cache_lock on; proxy_cache_valid 30d; # Cache valid thumbnails for 30 days. proxy_cache_valid any 15s; # Everything else gets 15s. proxy_cache_use_stale error timeout invalid_header updating; proxy_http_version 1.1; expires 30d; } }
無(wú)論何時(shí)緩存服務(wù)器得到一個(gè)請(qǐng)求,“thumbnail_cache”將首先被檢測(cè)。如果沒(méi)找到匹配項(xiàng),那就將請(qǐng)求轉(zhuǎn)發(fā)至調(diào)整大小服務(wù)器(運(yùn)行在本地localhost)。它返回有效的響應(yīng),緩存服務(wù)器將緩存該響應(yīng)30天,其它任何東西都只緩存15秒。
調(diào)整大小的服務(wù)器所有有趣的事情都在調(diào)整大小服務(wù)器。它的任務(wù)是從S3上獲得圖片并基于URL上的參數(shù)實(shí)時(shí)調(diào)整圖片大小。另外,該服務(wù)器會(huì)檢查每個(gè)請(qǐng)求的安全秘鑰以防止其他人隨意產(chǎn)生縮略圖。
因?yàn)樵摲?wù)器配置有幾個(gè)不同的部分,所以讓我們從我們已經(jīng)見(jiàn)過(guò)的部分開(kāi)始:代理
server { listen 10199; server_name localhost; set $backend "your.s3.bucket_name.s3.amazonaws.com"; resolver 8.8.8.8; # Use Google for DNS. resolver_timeout 5s; proxy_buffering off; proxy_http_version 1.1; proxy_pass_request_body off; # Not needed by AWS. proxy_pass_request_headers off; # Clean up the headers going to and from S3. proxy_hide_header "x-amz-id-2"; proxy_hide_header "x-amz-request-id"; proxy_hide_header "x-amz-storage-class"; proxy_hide_header "Set-Cookie"; proxy_ignore_headers "Set-Cookie"; proxy_set_header Host $backend; proxy_method GET; }
這里除了告訴我們?cè)摲?wù)器如何與S3通訊外并沒(méi)有多余的其他內(nèi)容,所以我們繼續(xù)看下一部分。接下來(lái)要配置的是nginx的圖像濾波模塊。只需要幾個(gè)指令,其中一些我們會(huì)定義到服務(wù)器級(jí)別。
下面是代理設(shè)置,添加如下的圖像濾波模塊:
server { # ... image_filter_jpeg_quality 85; # Adjust to your preferences. image_filter_buffer 12M; image_filter_interlace on; }
最后,我們定義一個(gè)代碼塊,完成如下功能:
檢查形式合法的URL
校驗(yàn)請(qǐng)求的簽名
從URL中提取圖片大小參數(shù)
從S3獲得圖像并把它載入 image_filter_buffer
調(diào)整圖片大小并響應(yīng)
第二項(xiàng)相當(dāng)有趣。一篇類似的文章的作者使用Lua來(lái)校驗(yàn)請(qǐng)求的簽名,但那樣好像步驟比較繁瑣。 Nginx的 secure_link 擴(kuò)展相當(dāng)容易使用。
secure_link模塊原理是:用被請(qǐng)求的圖片的URL和只有你的app知道的密鑰串連接起來(lái)的串來(lái)產(chǎn)生一個(gè)哈希(hash)。由于hash長(zhǎng)度擴(kuò)展,我們最后附加我們的密鑰而不是預(yù)先考慮它。因?yàn)槟阒烂罔€,所以無(wú)論何時(shí)你想在你的應(yīng)用中展示圖片縮略圖時(shí)你都可以產(chǎn)生有效的hash。
下面是配置的最后一部分:
server { # ... error_page 404 =404 /empty.gif; location ~ ^/t/([d-]+)x([d-]+)/(.*) { secure_link $arg_key; # The hash is stored in the `key` querystring arg. secure_link_md5 "$uri my-secret-key"; if ($secure_link = "") { # The security check failed, invalid key! return 404; } set $image_path "$3"; image_filter resize $1 $2; proxy_pass http://$backend/$3; } }
這就是所有的。
產(chǎn)生hash如果你使用python,下面是我寫(xiě)的代碼用以在特定URI下產(chǎn)生hash:
import base64 import hashlib def thumbnail_url(filename, width, height="-"): uri = "/t/%sx%s/%s" % (width, height, filename) md5_digest = hashlib.md5(uri + " my-secret-key").digest() key = base64.b64encode(md5_digest) # Make the key look like Nginx expects. key = key.replace("+", "-").replace("/", "_").rstrip("=") return "http://m.charlesleifer.com%s?key=%s" % (uri, key)感謝閱讀
感謝你花時(shí)間閱讀這篇文章,我希望你找到了樂(lè)趣。請(qǐng)留下評(píng)論,我會(huì)盡力回答。如果你發(fā)現(xiàn)了我上面的說(shuō)明有什么錯(cuò)誤也請(qǐng)讓我知道,我會(huì)更新本文。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39239.html
摘要:我覺(jué)得結(jié)合的反向代理,緩存和圖像過(guò)濾處理三大模塊來(lái)為我托管在上的圖片來(lái)創(chuàng)建一個(gè)縮略圖服務(wù)器會(huì)很優(yōu)雅。后者將作為的反向代理,產(chǎn)生并提供調(diào)整大小后的圖像。它返回有效的響應(yīng),緩存服務(wù)器將緩存該響應(yīng)天,其它任何東西都只緩存秒。 一兩個(gè)月前,我決定從我的站點(diǎn)中移除Varnish ,并用Nginx內(nèi)置的緩存系統(tǒng)替代它。我本來(lái)已經(jīng)在我的python站點(diǎn)上用了nginx來(lái)反向代理,所以擺脫Varnis...
摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開(kāi)速度前端后端新的技術(shù)如何在內(nèi)完整打開(kāi)網(wǎng)站會(huì)直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項(xiàng)目場(chǎng)景 最近手頭有兩個(gè)項(xiàng)目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺(tái),都需要使用 HTTPS 協(xié)議,因此,這次對(duì) HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問(wèn)題...
摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開(kāi)速度前端后端新的技術(shù)如何在內(nèi)完整打開(kāi)網(wǎng)站會(huì)直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項(xiàng)目場(chǎng)景 最近手頭有兩個(gè)項(xiàng)目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺(tái),都需要使用 HTTPS 協(xié)議,因此,這次對(duì) HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問(wèn)題...
摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開(kāi)速度前端后端新的技術(shù)如何在內(nèi)完整打開(kāi)網(wǎng)站會(huì)直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項(xiàng)目場(chǎng)景 最近手頭有兩個(gè)項(xiàng)目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺(tái),都需要使用 HTTPS 協(xié)議,因此,這次對(duì) HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問(wèn)題...
閱讀 2643·2021-11-23 09:51
閱讀 905·2021-09-24 10:37
閱讀 3627·2021-09-02 15:15
閱讀 1971·2019-08-30 13:03
閱讀 1892·2019-08-29 15:41
閱讀 2637·2019-08-29 14:12
閱讀 1436·2019-08-29 11:19
閱讀 3312·2019-08-26 13:39