摘要:我覺得結合的反向代理,緩存和圖像過濾處理三大模塊來為我托管在上的圖片來創建一個縮略圖服務器會很優雅。后者將作為的反向代理,產生并提供調整大小后的圖像。它返回有效的響應,緩存服務器將緩存該響應天,其它任何東西都只緩存秒。
一兩個月前,我決定從我的站點中移除Varnish ,并用Nginx內置的緩存系統替代它。我本來已經在我的python站點上用了nginx來反向代理,所以擺脫Varnish意味著少了一個麻煩。我花了好幾天時間閱讀怎樣配置nginx的緩存,翻遍了我的python站點的不同的配置文件(是的,很諷刺)。在閱讀過程中我標記了一些有趣的nginx的模塊,這中間就有 Image Filter module(圖像過濾處理模塊)。
我覺得結合nginx的反向代理,緩存和圖像過濾處理三大模塊來為我托管在S3上的圖片來創建一個縮略圖服務器會很優雅。如果你仔細的查看下面的(甚至整個站點的)標簽,你就可以看到nginx實戰了。
在本文中,我將描述我是怎樣配置nginx來有效安全的為S3上的圖片產生縮略圖。作為額外獎勵,我也會描述我是怎樣使用 Secure Links module (安全鏈接模塊)來防止人們惡意使用該服務器產生縮略圖。
準備開始為了讓不同部分能協同工作,你的nginx需要編譯進圖像濾波,代理和安全鏈接三個模塊。你可以通過nginx –V 來檢查你所具有的模塊。如果你使用的Ubuntu(Debian也行),你可以很輕易的安裝其它任意的nginx模塊(apt-get install 命令)。
一旦nginx準備好了,我們可以開始配置nginx了。
配置首先需要申明的是我們的代理緩存。這個申明位于nginx.conf文件的http部分并且描述了基于文件的緩存所在,該緩存將會存儲我們產生的縮略圖。因為一次緩存未命中即意味著要從S3服務器上獲取完整的圖并且改變它的大小,我們希望配置緩存足夠大以使其能包含我們大部分的縮略圖。對于我的站點,我估計200MB足夠了。
為了確定你的緩存,把下面的代碼添加到nginx配置文件的http部分的某個地方:
# 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;
現在我們需要說明兩個服務器定義:一個緩存服務器和一個調整大小服務器。后者將作為S3的反向代理,產生并提供調整大小后的圖像。緩存服務器位于調整大小服務器的前面,緩存并提供調整大小后的圖像。雖然我不認為必須要兩個服務器,因為我的站點訪問量并不是特別大,但在谷歌了一下后,我看見的一些文章表明,就是應該這樣。
緩存服務器緩存服務器會暴露給公共訪問(我的位于m.charlesleifer.com)。因為該服務器的唯一任務就是緩存從調整大小服務器獲得的響應,所以配置相當簡單。下面是我的配置:
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; } }
無論何時緩存服務器得到一個請求,“thumbnail_cache”將首先被檢測。如果沒找到匹配項,那就將請求轉發至調整大小服務器(運行在本地localhost)。它返回有效的響應,緩存服務器將緩存該響應30天,其它任何東西都只緩存15秒。
調整大小的服務器所有有趣的事情都在調整大小服務器。它的任務是從S3上獲得圖片并基于URL上的參數實時調整圖片大小。另外,該服務器會檢查每個請求的安全秘鑰以防止其他人隨意產生縮略圖。
因為該服務器配置有幾個不同的部分,所以讓我們從我們已經見過的部分開始:代理
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; }
這里除了告訴我們該服務器如何與S3通訊外并沒有多余的其他內容,所以我們繼續看下一部分。接下來要配置的是nginx的圖像濾波模塊。只需要幾個指令,其中一些我們會定義到服務器級別。
下面是代理設置,添加如下的圖像濾波模塊:
server { # ... image_filter_jpeg_quality 85; # Adjust to your preferences. image_filter_buffer 12M; image_filter_interlace on; }
最后,我們定義一個代碼塊,完成如下功能:
檢查形式合法的URL
校驗請求的簽名
從URL中提取圖片大小參數
從S3獲得圖像并把它載入 image_filter_buffer
調整圖片大小并響應
第二項相當有趣。一篇類似的文章的作者使用Lua來校驗請求的簽名,但那樣好像步驟比較繁瑣。 Nginx的 secure_link 擴展相當容易使用。
secure_link模塊原理是:用被請求的圖片的URL和只有你的app知道的密鑰串連接起來的串來產生一個哈希(hash)。由于hash長度擴展,我們最后附加我們的密鑰而不是預先考慮它。因為你知道秘鑰,所以無論何時你想在你的應用中展示圖片縮略圖時你都可以產生有效的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; } }
這就是所有的。
產生hash如果你使用python,下面是我寫的代碼用以在特定URI下產生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)感謝閱讀
感謝你花時間閱讀這篇文章,我希望你找到了樂趣。請留下評論,我會盡力回答。如果你發現了我上面的說明有什么錯誤也請讓我知道,我會更新本文。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39239.html
摘要:我覺得結合的反向代理,緩存和圖像過濾處理三大模塊來為我托管在上的圖片來創建一個縮略圖服務器會很優雅。后者將作為的反向代理,產生并提供調整大小后的圖像。它返回有效的響應,緩存服務器將緩存該響應天,其它任何東西都只緩存秒。 一兩個月前,我決定從我的站點中移除Varnish ,并用Nginx內置的緩存系統替代它。我本來已經在我的python站點上用了nginx來反向代理,所以擺脫Varnis...
摘要:服務教程在它提出十多年后的今天,已經成為最重要的應用技術之一。全方位提升網站打開速度前端后端新的技術如何在內完整打開網站會直接影響用戶的滿意度及留存率,在前端后端數據緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項目場景 最近手頭有兩個項目,XX 導航和 XX 產業平臺,都需要使用 HTTPS 協議,因此,這次對 HTTPS 協議做一次整理與分享。 使用緩存應該注意哪些問題...
閱讀 2627·2021-11-23 09:51
閱讀 861·2021-09-24 10:37
閱讀 3612·2021-09-02 15:15
閱讀 1962·2019-08-30 13:03
閱讀 1881·2019-08-29 15:41
閱讀 2624·2019-08-29 14:12
閱讀 1424·2019-08-29 11:19
閱讀 3301·2019-08-26 13:39