阿里雲OSS圖片文件回源數量限制解決方案

阿里雲OSS圖片文件回源數量限制解決方案

背景

小程序在展現外鏈的源過多,並且地址不必定是https的,而小程序強制要求是https的,考慮使用OSS的回源功能,可是阿里的oss只能設置5個源。因而在中間加了一層將阿里雲OSS 指向一臺 ECS 的 Nginx 上作反向代理,配置以下:html

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  localhost;
        
        # 不加上這句,部分域名會沒法解析
        resolver 119.29.29.29 1.1.1.1;
        
        # 須要經過 –with-http_gunzip_module 參數啓用
        # 加上這句若是圖片被強制 gzip 壓縮,nginx 會解壓再返回解壓後的內容,這樣阿里雲 OSS 不會報「圖片格式不支持」的異常
        gunzip on;
        
        # 關閉 gzip 壓縮
        gzip off;

        location / {
            # 直接取 「 ?」 後面部分當作圖片原來的 url 去請求
            proxy_pass $args;
        }

訪問地址格式以下python

http://{bucket.domain}/{any_filename}.png?http://t07img.yangkeduo.com/images/2018-03-05/7263a4942abe93040c316e99b1044510.png

例子nginx

http://xxxxx.oss-cn-hangzhou.aliyuncs.com/xxxxx.png?http://t07img.yangkeduo.com/images/2018-03-05/7263a4942abe93040c316e99b1044510.png

當咱們訪問阿里雲OSS 的連接時,若是沒有在 Bucket 中找到文件,阿里雲OSS 會在配置好的回源地址中將除本域名之外的路徑部分去訪問回源域名,這裏是咱們的 Nginx 反向代理服務器[好比: 1.1.1.1],阿里雲 OSS 會將地址轉換爲:小程序

http://1.1.1.1/xxxxx.png?http://t07img.yangkeduo.com/images/2018-03-05/7263a4942abe93040c316e99b1044510.png

Nginx 按照配置會取 URL 的 GET 參數部分(或說是 query), 變量爲 $args 部分去訪問圖片的源地址,因而就變成了瀏覽器

http://t07img.yangkeduo.com/images/2018-03-05/7263a4942abe93040c316e99b1044510.png

注意:按照常規GET原本 「 ?」 部分後面應該是 key1=value1&key2=value2 這樣的形式,這裏用法比較另類, url 其實至關於 key 部分,這樣 url 被帶過就能夠直接讓 nginx 在不須要進一步處理就直接反向代理,理論上能夠代理任何域名下的圖片地址。緩存

將獲取到的圖片內容直接返回給 OSS,OSS 存儲後再返回給客戶端。整個過程都是同步的,若是服務器的帶寬容許,延遲會比較小,並且在第二次請求時直接在 OSS 中讀取。bash

這裏遇到部分圖片外鏈域名沒法解析的狀況須要加上服務器

resolver 119.29.29.29 1.1.1.1;

如何在 OSS 回源時或回源後處理圖片

由於已經帶?了因此再使用 ?x-oss-process=style/stylename 就不合適了,若是放在 上一個 ? 以前會讓 Nginx 報 404 由於變成了 ?x-oss-process=style/stylename?http://xxxx.com/img.png 很明顯這不是一個 url 了,若是放在後面會當值圖片處理參數失敗。這時候就須要用到 OSS 的 「規則名稱」 使用形如 !_w100 這樣的完美解決。如此地址就變成了dom

http://{bucket.domain}/{any_filename}.png!_w100?http://t07img.yangkeduo.com/images/2018-03-05/7263a4942abe93040c316e99b1044510.png

回源時源地址開啓了 Gzip 壓縮致使圖片存儲沒法處理

回源時圖片加上圖片處理參數會返回 ‘The Image Fomatter Is Not Supported’ 錯誤,可是查明阿里雲明明是支持的這時就考慮是不是圖片的編碼出現了問題通過排查發現,咱們拿瀏覽器去請求時 Request 頭會帶上 Accept-Encoding: gzip 字段,這是 Response 就會開啓 Content-Encoding: gzip 此時的圖片是被壓縮過的,若是 Nginx 不作處理就會致使 OSS 存儲下來的圖片沒法被處理阿里雲

判斷圖片是否有壓縮, 使用 python-magic 同時在 mac 上用安裝 libmagic,這個庫是用來看文件類型的。

# mac 須要安裝支持庫
brew install libmagic

# python 庫
pip intall python-magic

import magic
magic.from_file('xxxxx.png')
# 'gzip compressed data, last modified: Wed Apr  3 11:34:22 2019, from Unix, original size 55202'

Linux 可使用 file 來判斷文件類型可是沒法判斷是否壓縮文件

file 'xxx.png'

解決方法有二:

  • 在設置回源地址時禁止傳遞 Accept-Encoding 這樣對方服務器可能就不啓用壓縮
  • 若是對方強制啓用壓縮,這時就須要在 Nginx 中啓用 gunzip: on; 同時關閉 gzip: on;

參考

相關文章
相關標籤/搜索