1. 程式人生 > >利用 Aliyun OSS Nginx proxy module 實現OSS 圖片處理回寫功能

利用 Aliyun OSS Nginx proxy module 實現OSS 圖片處理回寫功能

1、主要介紹內容

此篇文章主要利用Aliyun OSS Nginx proxy module 實現OSS 圖片處理回寫功能,藉助OSS Nginx Proxy module 及 OSS 的上傳回調功能實現OSS圖片處理回寫功能,當然文章目的並不在於強調圖片處理回寫功能,而是借實現一個例子來利用Aliyun OSS Nginx proxy module,對Nginx 及 Nginx lua 感興趣的同學可以參照本文描述做出更強大的應用出來,本文如能拋磚引玉的作用那就不枉我花時間寫此部落格了。

2、開始之前

1、開始之前請稍微閱讀下對Aliyun OSS Nginx proxy module 的簡單介紹

2、瞭解下阿里雲OSS 上傳回調功能

3、參考文章

3、主要功能及優勢

本文主要實現的功能是處理回寫,這裡以oss圖片處理回寫為例介紹如何利用阿里雲OSS 提供的callback來進行圖片回寫。現在很多大圖片如果每次都要實時處理那會大大降低使用者體驗(當然可以利用CDN進行快取),那麼可以通過此方法進行處理圖回寫,每次進行上傳請求時帶上callback引數讓oss通知到本文中實現的nginx伺服器,nginx伺服器會自動從oss 拉取經過處理的資料然後再回寫帶oss中,如果確認成功甚至可以將原圖刪掉只保留處理圖,這些都可以依據上傳邏輯進行實現。那麼肯定會有讀者問那費用呢?這個完全不是問題,因為oss按照請求次數收費相當便宜幾乎不要錢,而流量費用也不用擔心,買一臺和OSS同區域的ECS就可以走內網了,內網流量免費。

4、圖片處理回寫處理邏輯程式碼

oss_rewrite.lua

local cjson = require("cjson")

local function get_object_data_from_oss_img(src_object, src_style)
    local res = ngx.location.capture("/" .. src_object .. src_style)
    if res.status ~= ngx.HTTP_OK then
        ngx.log(ngx.ERR, "fetch external url data failed, object :"
, src_object .. src_style, " status:", tostring(res.status)) return res.status, nil end return res.status, res.body end local function get_and_process(json_table) src_object = json_table["src_object"] src_style = json_table["style"] dst_object = json_table["dst_object"] ngx.log(ngx.INFO, "src_object:", src_object, " style:", src_style, " dst_object:", dst_object) if src_object == nil or src_style == nil or dst_object == nil then ngx.log(ngx.ERR, "src_object style and dst_object should be not null") return ngx.HTTP_BAD_REQUEST end -- Get processed img data from oss local status, write_back_body = get_object_data_from_oss_img(src_object, src_style) if status ~= ngx.HTTP_OK then return status end -- Write back local res = ngx.location.capture("/" .. dst_object, { method = ngx.HTTP_PUT, body = write_back_body }) if res.status ~= ngx.HTTP_OK then ngx.log(ngx.ERR, "write back to oss failed, object:", dst_object, "status:", tostring(res.status)) return res.status end return ngx.HTTP_OK end local function parse_and_process_post_body() ngx.req.read_body() local post_json_body = ngx.req.get_body_data() ngx.log(ngx.INFO, post_json_body) if post_json_body == nil then ngx.log(ngx.ERR, "post request body from oss call_back is empty.") return ngx.HTTP_BAD_REQUEST end -- decode json string and catch json errors local succ, json_table = pcall(function() return cjson.decode(post_json_body) end) if succ then return get_and_process(json_table) else ngx.log(ngx.ERR, "post request body from oss call_back is not json.") return ngx.HTTP_BAD_REQUEST end end local method = ngx.req.get_method() if method == 'GET' or method == "POST" then local status = parse_and_process_post_body() if status == ngx.HTTP_OK then ngx.say("{\"success\": \"true\"}") else ngx.log(ngx.ERR, "fail write back to oss") ngx.exit(status) end else ngx.log(ngx.INFO, "do not support this method ", method) ngx.exit(ngx.HTTP_BAD_REQUEST) end

nginx.conf

error_log  logs/error.log  debug;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    lua_package_path "/usr/servers/lualib/?.lua;";
    lua_package_cpath "/usr/servers/lualib/?.so;"; 
    server {
        listen       80;
        server_name  your-server-name; # 注意此項要和CallBack 引數中的Host 保持一致

        resolver 8.8.8.8;
        #lua_code_cache  off; # 加上此配置在每次修改lua 程式碼後無需reload nginx
        location /oss_write_back {
            content_by_lua_file conf/lua/oss_rewrite.lua;
        }

        location / {
            internal;  #只允許內部跳轉
            set $oss_bucket "you-oss-bucket";
            set $oss_auth_id "you-access-key-id";
            set $oss_auth_key "you-access-key-secret";
            rewrite_by_lua_file conf/lua/oss_auth.lua;
        }
        location @oss {
            #eg: bucket-example.oss-cn-qingdao.aliyuncs.com
            proxy_pass http://$oss_bucket.oss-location.aliyuncs.com;
        }
    }
}

5、如何使用上述程式碼及構造OSS call_back 請求

1、準備環境配置檔案

自己搭建openresty 環境或者直接pull docker 官方映象源openresty映象
將oss_rewrite.lua 放到conf/lua/oss_rewrite.lua 中
http://blog.csdn.net/sunrain_chy/article/details/50935681 提到的oss_auth.lua 放到conf/lua/oss_auth.lua 中
配置好nginx.conf 檔案,啟動nginx

2、構造Callback 請求

構造PUT 請求 call back 引數
callback.txt

{
    "callbackUrl":"your-call-back-url/oss_write_back",
    "callbackHost":"your-call-back-host",
    "callbackBody":"{
            \"src_object\":\"your-src-object-name\",
            \"style\":\"style\",
            \"dst_object\": \"your-dst-object-name\"
        }",
        "callbackBodyType":"application/json"
}

注意這裡的your-call-back-host 要與nginx.conf 中的server_name 保持一致,回撥url 的location 要是oss_write_back
src_object 為oss上存在的一張圖片object,通常設定為此次PUT 請求上傳的Object
style 為 oss 圖片處理引數
dst_object 為處理圖回寫到OSS 的objectname
對上述callback.txt 進行base64編碼

$ base64 callback.txt | tr -d '\n'

這裡寫圖片描述

3、構造帶CallBack引數的PUT 請求

PUT /test.jpg HTTP/1.1
Host: bucket-example.oss-ch-qingdao.aliyuncs.com
Accept-ncoding: identity
Content-Length: 0
x-oss-callback-var: eyJ4Om15X3ZhciI6ImZvci1jYWxsYmFjay10ZXN0In0=
x-oss-callback: ewogICAgImNhbGxiYWNrVXJsIjoiMzAuOS4xNjkuNDIvb3NzX3dyaXRlX2JhY2siLAogICAgImNhbGxiYWNrSG9zdCI6IjMwLjkuMTY5LjQyIiwKICAgICJjYWxsYmFja0JvZHkiOiJ7CiAgICAgICAgICAgIFwic3JjX29iamVjdFwiOlwidGVzdC5qcGdcIiwKICAgICAgICAgICAgXCJzdHlsZVwiOlwiQDEwMHdfMTAwaFwiLAogICAgICAgICAgICBcImRzdF9vYmplY3RcIjogXCJ0ZXN0LmpwZ18xMDB4MTAwXCIKICAgICAgICB9IiwKICAgICAgICAiY2FsbGJhY2tCb2R5VHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iCn0K

注意上述x-oss-callback 引數為callback.txt 的base64編碼

4、利用nc 將帶call back 引數的請求發往oss

這裡寫圖片描述

5、結果檢測

在上述引數配置無誤的情況下bucket中會多出來一個名為your-dst-object-name的object,這個object正是由your-src-object-name 帶上style 引數經過OSS圖片處理過的object。

6、程式執行主線

1、使用者傳送帶callback引數的PUT請求到OSS,OSS根據callback提供的引數會呼叫使用者的應用伺服器,也就是我們的nginx

2、nginx 接收到這個請求後解析body引數獲取到 源object 處理引數及回寫object名,這一步走的是nginx conf 中的 location /oss_write_back

3、Nginx 根據解析出來的post 引數發出一個內部跳轉的子請求到 location / 去OSS取出處理引數為style 的處理圖,當然取圖請求會經過oss_auth.lua 走到location @oss進行簽名

4、取出處理圖後nginx lua 發出自請求將處理圖資料回寫到OSS至此回寫完成。

相關推薦

利用 Aliyun OSS Nginx proxy module 實現OSS 圖片處理功能

1、主要介紹內容 此篇文章主要利用Aliyun OSS Nginx proxy module 實現OSS 圖片處理回寫功能,藉助OSS Nginx Proxy module 及 OSS 的上傳回調功能實現OSS圖片處理回寫功能,當然文章目的並不在於強調圖片處理

nginx+nginx-rtmp-module實現直播服務

環境 centos 6.8 nginx 1.10.3 nginx-rtmp-module 下載nginx-rtmp-module 當前目錄/opt git clone https://github.c

通過nginx,nginx-rtmp-module實現流媒體直播

1、 下載nginx http://nginx.org/en/download.html 下載nginx-rtmp-module: nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module

使用Nginx Upload Module實現上傳檔案功能

普通網站在實現檔案上傳功能的時候,一般是使用Python,Java等後端程式實現,比較麻煩。Nginx有一個Upload模組,可以非常簡單的實現檔案上傳功能。此模組的原理是先把使用者上傳的檔案儲存到臨時檔案,然後在交由後臺頁面處理,並且把檔案的原名,上傳後的名稱

nginx rtmp module 程式碼詳解 各模組主要功能

ngx_rtmp_dash_module http模組裡播放MPEG-DASH相關處理 ngx_rtmp_mp4_module 主要支援rtmp MP4這塊點播相關功能,支援seek操作 ngx_rtmp_flv_module 主要是flv檔案格式的點播相關功能,支援seek操作 ng

阿里雲物件儲存OSS之通過URL形式進行圖片處理

文章目錄 1. 什麼是OSS 2. OSS圖片服務 3. 圖片處理訪問規則 4. 通過URL的形式 5. 多個action之間組合形式 5.1 示例 5.2 圖片旋轉 5.3 圖片裁剪

biee功能實現

回寫是把BIEE報表前端的資料寫到ORACLE(以ORACLE資料庫為例),以下是操作步驟: 1.回寫的XML寫法: WriteBack.xml(名字隨便取)放置在\OracleBI\web\msgdb\customMessages路徑下。 內容如下: <?xml version="1.0" enco

前端實現圖片上傳檢視功能(帶UI實現

由於業務需求,需要實現多圖片的上傳,並且能夠實時檢視使用者上傳的圖片列表。因此從網上找了一個不錯的外掛,並和bootstrap UI進行的相容。基本能夠滿足需求。下面就是我的實現過程(PS:本人前端了解不太深,所以基本是實現了功能… UI沒有太多考慮…)

圖片瀏覽器功能實現(一)——圖片放大與縮小功能實現

圖片瀏覽在應用中是一種比較常用的功能,主要包括圖片的放大、縮小、旋轉、上下左右移動圖片。LZ花了一天時間實現了一下這些功能,希望能夠幫到閱讀此部落格的碼農們。 先把前期工作準備一下,建立一個UWP專案。頁面程式碼如下(PS:很簡單就不囉嗦了,直接把程式碼貼出來

吳裕雄 python 神經網絡——TensorFlow實現AlexNet模型處理數字識別MNIST數據集

its iter style 輸出 init 向量 數字 ict sha import tensorflow as tf # 輸入數據 from tensorflow.examples.tutorials.mnist import input_data m

使用nginx image filter實現OSS物件儲存中對圖片的實時處理

使用Nginx image_filter實現類似OSS圖片處理 在家使用自己的電腦做了一個小應用,可檢視照片,按以前的方式,需要在使用者上傳圖片後對進行裁剪壓縮,然後給前段一個縮圖地址與原圖地址。這種方式有兩個弊端磁碟空間的浪費、縮圖尺寸調整不便捷。是否有其他不使用雲OSS儲存的情況下自己實現一

利用nginxnginx-rtmp-module搭建流媒體伺服器實現直播

轉自:https://www.cnblogs.com/suiyuewuxin/p/7256972.html 使用環境是centos 7.0+nginx;可以實現簡單的流媒體服務。 先下載nginx-rtmp-module拓展: nginx-rtmp-module的官方github地址:h

利用aliyun OSS掛載檔案伺服器或session共享

在aliyun 應用市場搜尋cloudfs4oss 購買安裝 root# yum install libcurl libcurl-developenssl-develfuse fuse-libs f

Api接口通用安全策略及實現-OSS.Core

參數 num 我會 信息 簽名 算法 活躍度 webapi 參與   這篇文章一直說寫,遲遲沒有動手,這兩天看到一些應用接口數據被別人爬蟲、短信接口被人高頻率請求攻擊等案列,感覺簡單概述分享一下接口安全驗證還是有必要的。畢竟當下基本都以客戶端應用為主,如果前期疏忽,發布之後

obs nginx-rtmp-module搭建流媒體服務器實現直播 ding

video 接下來 監聽 comm 地址 什麽 ip地址 automake text 接下來我就簡單跟大家介紹一下利用nginx來搭建流媒體服務器。 我選擇的是騰訊雲服務器 1、下載nginx-rtmp-module: nginx-rtmp-module的官方gith

nginx使用replace-filter-nginx-module實現內容替換

http nts fix replace 約定 roo ips 添加 ace 有時候我們想對響應(例如PHP接口)返回的內容做些字符串,雖然可以使用各語言代碼相關方法(例如PHP的str_replace)進行替換,但是在nginx層面替換是更方便的,無需修改代碼。 約定

基於nginx-rtmp-module模塊實現的HTTP-FLV直播模塊(nginx-http-flv-module

發現 app1 多播 git app 命令 避免 put 編譯 本文後續的內容將在這裏更新:《基於nginx-rtmp-module模塊實現的HTTP-FLV直播模塊(nginx-http-flv-module)續》。註意:下文的配置很多已經不能用了,因為現在的實現跟早期

#後端筆記#在CentOS上利用 nginx + nginx-rtmp-module 搭建基於HLS協議的直播伺服器

一、直播協議簡介: 搭建之前,先簡單說說現在網上主流的直播協議: 1、RTMP:      實時訊息傳輸協議,Real Time Messaging Protocol,是 Adobe Systems 公司為 Flash 播放器和伺服器之間音訊、

nginx教程第八篇:用HTTP proxy module配置一個反向代理伺服器

反向代理( reverse proxy) 方式是指用代理伺服器來接受Internet上的連線請求, 然後將 請求轉發給內部網路中的上游伺服器, 並將從上游伺服器上得到的結果返回給Internet上請求 連線的客戶端, 此時代理伺服器對外的表現就是一個Web伺服器

基於nginx-rtmp-module模組實現的HTTP-FLV直播模組nginx-http-flv-module(二)

      由於《基於nginx-rtmp-module模組實現的HTTP-FLV直播模組nginx-http-flv-module(一)》內容已經很長,所以後續的更新將記錄在這兒。非常感謝網友們的測試反饋和程式碼提交!專案地址