ceph s3cmd的命令
問題:
- 1. 使用access_key和secret_key獲取的對象url,會緩存在瀏覽器disk cache中,導致每次第二次訪問資源的時候,會報no-cors的錯誤
- 2. 瀏覽器獲取數據時,會顯示(from disk cache)
針對問題2,調研強緩存
強緩存
強緩存:不會向服務器發送請求,直接從緩存中讀取資源,在 chrome 控制台的 Network 選項中可以看到該請求返回 200 的狀態碼,並且 Size 顯示 from disk cache 或 from memory cache。強緩存可以通過設置兩種 HTTP Header 實現:Expires 和 Cache-Control。
1.Expires
緩存過期時間,用來指定資源到期的時間,是服務器端的具體的時間點。也就是說,Expires=max-age + 請求時間,需要和 Last-modified 結合使用。Expires 是 Web 服務器響應消息頭字段,在響應 http 請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據,而無需再次請求。
Expires 是 HTTP/1 的產物,受限於本地時間,如果修改了本地時間,可能會造成緩存失效。Expires: Wed, 22 Oct 2018 08:41:00 GMT表示資源會在 Wed, 22 Oct 2018 08:41:00 GMT 后過期,需要再次請求。
2.Cache-Control
在 HTTP/1.1 中,Cache-Control 是最重要的規則,主要用於控制網頁緩存。比如當Cache-Control:max-age=300時,則代表在這個請求正確返回時間(瀏覽器也會記錄下來)的 5 分鍾內再次加載資源,就會命中強緩存。
Cache-Control 可以在請求頭或者響應頭中設置,並且可以組合使用多種指令:
-
深入理解瀏覽器的緩存機制
-
public:所有內容都將被緩存(客戶端和代理服務器都可緩存)。具體來說響應可被任何中間節點緩存,如 Browser <-- proxy1 <-- proxy2 <-- Server,中間的 proxy 可以緩存資源,比如下次再請求同一資源 proxy1 直接把自己緩存的東西給 Browser 而不再向 proxy2 要。
-
private:所有內容只有客戶端可以緩存,Cache-Control的默認取值。具體來說,表示中間節點不允許緩存,對於 Browser <-- proxy1 <-- proxy2 <-- Server,proxy會老老實實把 Server 返回的數據發送給 proxy1, 自己不緩存任何數據。當下次 Browser 再次請求時 proxy 會做好請求轉發而不是自作主張給自己緩存的數據。
-
no-cache:客戶端緩存內容,是否使用緩存則需要經過協商緩存來驗證決定。表示不使用 Cache-Control 的緩存控制方式做前置驗證,而是使用 Etag 或者 Last-Modified 字段來控制緩存。需要注意的是,no-cache 這個名字有一點誤導。設置了 no-cache 之后,並不是說瀏覽器就不再緩存數據,只是瀏覽器在使用緩存數據時,需要先確認一下數據是否還跟服務器保持一致。
-
no-store:所有內容都不會被緩存,即不使用強制緩存,也不使用協商緩存
max-age:max-age=xxx (xxx is numeric) 表示緩存內容將在 xxx 秒后失效
s-maxage(單位為 s):同 max-age 作用一樣,只在代理服務器中生效(比如 CDN 緩存)。比如當 s-maxage=60 時,在這 60 秒中,即使更新了 CDN 的內容,瀏覽器也不會進行請求。max-age 用於普通緩存,而 s-maxage 用於代理緩存。s-maxage 的優先級高於 max-age。如果存在 s-maxage,則會覆蓋掉 max-age 和 Expires header。
max-stale:能容忍的最大過期時間。max-stale 指令標示了客戶端願意接收一個已經過期了的響應。如果指定了 max-stale 的值,則最大容忍時間為對應的秒數。如果沒有指定,那么說明瀏覽器願意接收任何 age 的響應(age 表示響應由源站生成或確認的時間與當前時間的差值)。
min-fresh:能夠容忍的最小新鮮度。min-fresh 標示了客戶端不願意接受新鮮度不多於當前的 age 加上 min-fresh 設定的時間之和的響應。
深入理解瀏覽器的緩存機制
從圖中我們可以看到,我們可以將多個指令配合起來一起使用,達到多個目的。比如說我們希望資源能被緩存下來,並且是客戶端和代理服務器都能緩存,還能設置緩存失效時間等等。
3.Expires 和 Cache-Control 兩者對比
其實這兩者差別不大,區別就在於 Expires 是 http1.0 的產物,Cache-Control 是 http1.1 的產物,兩者同時存在的話,Cache-Control 優先級高於 Expires;在某些不支持 HTTP1.1 的環境下,Expires 就會發揮用處。所以 Expires 其實是過時的產物,現階段它的存在只是一種兼容性的寫法。
強緩存判斷是否緩存的依據來自於是否超出某個時間或者某個時間段,而不關心服務器端文件是否已經更新,這可能會導致加載文件不是服務器端最新的內容,那我們如何獲知服務器端內容是否已經發生了更新呢?此時我們需要用到協商緩存策略。
針對問題1,
對於縮略圖的權限放低,讓任意用戶獲取,這樣生成的url就沒有Expires參數
設置ceph中對應桶的policy
#cat policy.json
{
"Statement": [{
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": "*"
}]
}
# s3cmd setpolicy policy.json s3://metadatabucket --acl-public //設置策略
# s3cmd delpolicy s3://metadatabucket //刪除策略
# s3cmd info s3://metadatabucket //查看策略
其中:
- Resource參數匹配某一種文件:
Resource:["*.jpg","*.png"]
- Action可以設置較多參數,詳情參考:
https://docs.ceph.com/docs/master/radosgw/bucketpolicy/
python代碼生成url的代碼如下:
def get_object_url(bucket_name, object_name):
try:
bucket = conn.get_bucket(bucket_name)
plans_key = bucket.get_key(object_name)
plans_url = plans_key.generate_url(0, query_auth=False,
force_http=False)
return plans_url
except Exception as e:
print("get {} error:{}".format(object_name, e))
return False
設置Cors
[root@t32 rootbak]# cat rules.xml
<CORSConfiguration>
<CORSRule>
<ID>Allow everything</ID>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>30</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>
# s3cmd setcors rules.xml s3://metadatabucket