欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何打造基于s3cmd的短地址服務

這篇文章主要講解了“如何打造基于s3cmd的短地址服務”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何打造基于s3cmd的短地址服務”吧!

為攀枝花等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及攀枝花網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為做網(wǎng)站、成都網(wǎng)站設計、攀枝花網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

需求描述

有線上項目使用S3去發(fā)布移動端APP,因為需要做權限認證所以對應的Object無法開“public-read”權限,嘗試使用Presign方式生成的簽名URL存在以下問題

  • 生成的簽名URL地址包含敏感信息,會暴露bucket名稱和accesskey,帶來安全隱患。

  • 生成的簽名URL地址太長,影響用戶體驗。

  • 生成的地址有效時間內(nèi)可以任意訪問,無法做到比較嚴格的反盜鏈。

解決方案

使用openresty實現(xiàn)對S3數(shù)據(jù)訪問流程的封裝,客戶端的數(shù)據(jù)下載全部走openresty上面搭建的服務,該服務提供一次性的短地址生成服務(訪問幾次以后對應短地址失效),具體流程如下:
1. 用戶數(shù)據(jù)上傳到S3,并設置相應Object權限為“public-read”,取得對應的對外訪問URL。
2. 以之前生成的對外訪問URL為基礎,生成對應的短地址服務。
3. 客戶端使用短地址進行訪問,超出訪問次數(shù)則無法訪問。

如果想進一步提升安全性,可以將RGW和Openresty通過內(nèi)網(wǎng)互聯(lián),數(shù)據(jù)上傳全部走內(nèi)部網(wǎng)絡,外部訪問走外網(wǎng)。

具體實現(xiàn)

1. Openresty安裝

2.安裝依賴lua庫文件

默認openresty的lib路徑為/usr/local/openresty/lualib
需要依賴兩個lua文件,其中url.lua主要用于url地址的解析,redis_iresty.lua用于redis的連接

將下面的源碼文件保存為 /usr/local/openresty/lualib/resty/url.lua
https://github.com/golgote/neturl/blob/master/lib/net/url.lua

將下面的源碼文件保存為 /usr/local/openresty/lualib/resty/redis_iresty.lua
https://gist.github.com/moonbingbing/9915c66346e8fddcefb5

3. RGW服務配置

root@demohost:/etc/openresty# cat /etc/ceph/ceph.conf

...

[client.radosgw.demo]
     rgw DNS name = s3.cephbook.com #S3 endpoint對應的域名
     rgw frontends = "civetweb port=7480"
     host = demohost
     keyring = /etc/ceph/ceph.client.radosgw.keyring
     log file = /home/ceph/log/radosgw.log

4. Openresty配置

root@demohost:/etc/openresty# cat /etc/openresty/nginx.conf

...

server {
        listen       80;
        server_name  ceph.vip; #短地址主機頭設置
        location = /url { #生成短地址入口
             content_by_lua_file /etc/openresty/url.lua;
         }
         location / { #提供短地址對應的數(shù)據(jù)訪問
             proxy_http_version 1.1;
             proxy_set_header Host $host;
             access_by_lua_file /etc/openresty/access.lua;
             proxy_pass http://127.0.0.1:7480; #對應后端的radosgw服務入口
         }
     }

生成短地址服務的源碼如下

root@demohost:/etc/openresty# cat url.lua
local request_method = ngx.var.request_method
local url_ = require "resty.url" #對應之前的url庫
local redis = require "resty.redis_iresty" #對應之前的redis_iresty庫
local s3_endpoint = "s3.cephbook.com" #這里設置只允許生成與S3 endpoint相關的短地址
local endpoint = s3_endpoint .. "$"

local charset = {}
for i = 48,  57 do table.insert(charset, string.char(i)) end
for i = 65,  90 do table.insert(charset, string.char(i)) end
for i = 97, 122 do table.insert(charset, string.char(i)) end

function string.random(length)
  local urandom = assert(io.open('/dev/urandom','rb'))
  local a, b, c, d = urandom:read(4):byte(1,4)
  urandom:close()

  local seed = a*0x1000000 + b*0x10000 + c *0x100 + d
  math.randomseed(seed)

  if length > 0 then
    return string.random(length - 1) .. charset[math.random(1, #charset)]
  else
    return ""
  end
end


function genera_url(red,url_id,host,path)
    -- counts表示短地址最大訪問次數(shù),current表示當前次數(shù)
    ok, err = red:hmset(url_id,'host',host,'uri',path,'counts',3,'current',1)
    if not ok then
        ngx.status = ngx.HTTP_METHOD_NOT_IMPLEMENTED
        ngx.say("failed to hmset: ", err)
        return ngx.exit(ngx.HTTP_METHOD_NOT_IMPLEMENTED)
    end
    -- 設置短地址記錄最多能夠在redis里面存儲的時長,避免資源耗盡
    ok, err = red:expire(url_id,3600) 
    if not ok then
        ngx.status = ngx.HTTP_METHOD_NOT_IMPLEMENTED
        ngx.say("failed to set expire: ", err)
        return ngx.exit(ngx.HTTP_METHOD_NOT_IMPLEMENTED)
    end
end

function get_info_by_id(red,url_id)
    ok, err = red:hgetall(url_id)
    if not ok then
        ngx.status = ngx.HTTP_SERVICE_UNAVAILABLE
        ngx.say("failed to getall : ", err)
        return ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
    end
    local h = red:array_to_hash(ok)
    return h
end

if request_method == "POST" then
    ngx.req.read_body()
    local data = ngx.req.get_body_data()
    local u = url_.parse(data)
    local hostname_check, hostname_err = ngx.re.match(u.host,endpoint)
    if not hostname_check then
        ngx.status = ngx.HTTP_BAD_REQUEST
        ngx.say("not a available s3_endpoint")
        ngx.exit(ngx.HTTP_BAD_REQUEST)
    end
    if u.host then
        if string.len(u.path) > 1  then
            local url_id = string.random(7)
            local red = redis:new()
            genera_url(red,url_id,u.host,u.path)
            local h = get_info_by_id(red,url_id)
            ngx.status = ngx.HTTP_CREATED
            ngx.say("ShortURL: ",ngx.var.scheme,"://",ngx.var.host,"/",url_id)
            ngx.say("host: ", h.host)
            ngx.say("uri: ", h.uri)
            ngx.say("counts: ", h.counts)
            ngx.say("current: ", h.current)
            ngx.exit(ngx.HTTP_CREATED)
        else
            ngx.status = ngx.HTTP_BAD_REQUEST
            ngx.say("path err")
            ngx.exit(ngx.HTTP_BAD_REQUEST)
        end
    else
        ngx.status = ngx.HTTP_BAD_REQUEST
        ngx.say("not a available url")
        ngx.exit(ngx.HTTP_BAD_REQUEST)
    end
end

訪問短地址數(shù)據(jù)服務的源碼如下

root@demohost:/etc/openresty# cat /etc/openresty/access.lua
local redis = require "resty.redis_iresty"
local red = redis:new()
local uri =  ngx.var.uri
local url_id = string.sub(uri,2,string.len(uri))
res, err = red:hgetall(url_id)
if not res then
    ngx.exit(ngx.HTTP_NOT_FOUND)
else
    local h = red:array_to_hash(res)
    -- 超出訪問次數(shù)則拒絕訪問,如果考慮資源占用可以自己加上刪除對應redis記錄操作
    if h.counts < h.current then
        ngx.status = ngx.HTTP_GONE
        ngx.say("current=",h.current," > counts=",h.counts)
        ngx.exit(ngx.HTTP_GONE)
    end
    ngx.req.set_header("host", h.host)
    ngx.req.set_uri(h.uri, false)
    ok, err = red:hincrby(url_id,'current',1)
    if not ok then
        ngx.status = ngx.HTTP_METHOD_NOT_IMPLEMENTED
        ngx.say("incrby key failed: ", err)
        ngx.exit(ngx.HTTP_METHOD_NOT_IMPLEMENTED)
        return
    end
end

https://github.com/openresty/lua-nginx-module#http-status-constants

5. 使用流程

上傳數(shù)據(jù)

使用s3cmd或者是其他方式上傳文件,并設置對應的Object訪問權限為"public-read"。

root@demohost:/tmp# s3cmd put myfile s3://demo --acl-public
'myfile' -> 's3://demo/myfile'  [1 of 1]
 21577 of 21577   100% in    0s   227.71 kB/s  done
'myfile' -> 's3://demo/myfile'  [1 of 1]
 21577 of 21577   100% in    0s   203.11 kB/s  done
Public URL of the object is: http://demo.s3.cephbook.com/myfile
生成短地址
root@demohost:/tmp# curl ceph.vip/url  -d "http://demo.s3.cephbook.com/myfile" -v
* Hostname was NOT found in DNS cache
* Connected to ceph.vip  port 80 (#0)
> POST /url HTTP/1.1
> User-Agent: curl/7.38.0
> Host: ceph.vip
> Accept: */*
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 29 out of 29 bytes
< HTTP/1.1 201 Created
* Server openresty/1.11.2.5 is not blacklisted
< Server: openresty/1.11.2.5
< Date: Wed, 15 Nov 2017 09:56:14 GMT
< Content-Type: application/octet-stream
< Transfer-Encoding: chunked
< Connection: keep-alive
<
ShortURL: http://ceph.vip/Vo3t5Ex #生成的短地址
host: demo.s3.cephbook.com
uri: /myfile
counts: 3
current: 1
* Connection #0 to host ceph.vip left intact
測試訪問
#訪問3次
root@demohost:/tmp# curl http://ceph.vip/Vo3t5Ex -v
...
root@demohost:/tmp# curl http://ceph.vip/Vo3t5Ex -v
...
root@demohost:/tmp# curl http://ceph.vip/Vo3t5Ex -v
...


#第四次以后就不能訪問了

root@demohost:/tmp# curl http://ceph.vip/Vo3t5Ex -v
* Hostname was NOT found in DNS cache
*   Trying ceph.vip...
* Connected to ceph.vip (ceph.vip) port 80 (#0)
> GET /Vo3t5Ex HTTP/1.1
> User-Agent: curl/7.38.0
> Host: ceph.vip
> Accept: */*
>
< HTTP/1.1 410 Gone
* Server openresty/1.11.2.5 is not blacklisted
< Server: openresty/1.11.2.5
< Date: Wed, 15 Nov 2017 10:00:46 GMT
< Content-Type: application/octet-stream
< Transfer-Encoding: chunked
< Connection: keep-alive
<
current=4 > counts=3
* Connection #0 to host ceph.vip left intact

感謝各位的閱讀,以上就是“如何打造基于s3cmd的短地址服務”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對如何打造基于s3cmd的短地址服務這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

網(wǎng)頁標題:如何打造基于s3cmd的短地址服務
地址分享:http://aaarwkj.com/article20/pccpjo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、關鍵詞優(yōu)化、小程序開發(fā)、虛擬主機、網(wǎng)站策劃、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
日韩欧美日日夜夜精品| 西西美女掰开阴让你看| 国产一区精品在线免费看| 国产一区二区三区自拍| 黄色亚洲日本欧美在线观看| 91亚洲自偷观看高清| 亚洲一区二区三区免费在线视频| 亚洲福利影院一区久久| 国产激情视频在线观看你懂的 | 尤物视频在线观看羞羞| 国产黄色av片免费| 亚洲一区二区三区小蜜桃| 人妖伪娘在线观看一区二区三区| 精品国产第一区二区三区| 91九色国产老熟女乱子| 日韩精品欧美中文字幕| 亚洲精品一区二区99| 91在线视频欧美国产| 日本午夜理论视频在线播放 | 日本加勒比中文在线观看| 亚洲av精二区三区四区| 中文字幕久久亚洲一区| 成人午夜欧美熟妇小视频| 国产三级自拍视频在线观看网站 | 精品国产一区二区三区精品日韩| 亚洲国产成人久久综合区| 日本中文字幕黄色人妻| 国产三级国产精品国产专播| 91九色在线精品一区| 久久国产福利一区二区| 日韩国产欧美亚洲一区| 久久精品免成人费电影| 97青青草免费在线视频| 亚洲国产精品视频中文字幕| 国产91日韩欧美在线观看| 少妇人妻系列中文在线| 国产91高清免费视频| 久久精人妻一区二区三区| 五月婷婷六月丁香免费视频| 国产三级视频在线2022| 国产熟女精品自拍嫩草|