amazon web services - Nginx प्रॉक्सी अमेज़न S3 संसाधन




amazon-web-services amazon-s3 (2)

Nginx के माध्यम से प्रॉक्सी S3 फ़ाइलों के लिए आपका दृष्टिकोण बहुत मायने रखता है। यह समस्याओं की संख्या को हल करता है और अतिरिक्त लाभ जैसे मास्किंग यूआरएल, प्रॉक्सी कैश, ऑफलोड एसएसएल / टीएलएस द्वारा स्थानांतरण में तेजी के साथ आता है। आप इसे लगभग सही करते हैं, मुझे दिखाते हैं कि इसे सही बनाने के लिए क्या बचा है।

नमूना प्रश्नों के लिए, मैं मूल टिप्पणी में सार्वजनिक टिप्पणी में उल्लिखित S3 बाल्टी और एक छवि URL का उपयोग करता हूं।

हम अमेज़न S3 फ़ाइलों के हेडर के निरीक्षण से शुरू करते हैं

curl -I http://yanpy.dev.s3.amazonaws.com/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg

HTTP/1.1 200 OK
Date: Sun, 25 Jun 2017 17:49:10 GMT
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 378843
Server: AmazonS3

हम लापता कैश-कंट्रोल देख सकते हैं लेकिन सशर्त जीईटी हेडर पहले ही कॉन्फ़िगर किए गए हैं। जब हम ई-टैग / लास्ट-मॉडिफाइड (यानी ब्राउज़र का क्लाइंट साइड कैश काम करता है) का पुन: उपयोग करते हैं, तो हमें खाली सामग्री-लंबाई के साथ HTTP 304 मिलता है। क्लाइंट (हमारे मामले में कर्ल) की एक व्याख्या संसाधन पर सवाल उठाते हुए कहती है कि जब तक सर्वर पर फ़ाइल को संशोधित नहीं किया गया है, तब तक किसी भी डेटा स्थानांतरण की आवश्यकता नहीं है:

curl -I http://yanpy.dev.s3.amazonaws.com/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg 
--header "If-None-Match: 37a907fc5dd7cfd0c428af78f09e95a9"

HTTP/1.1 304 Not Modified
Date: Sun, 25 Jun 2017 17:53:33 GMT
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Server: AmazonS3

curl -I http://yanpy.dev.s3.amazonaws.com/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg 
--header "If-Modified-Since: Wed, 21 Jun 2017 07:42:31 GMT"

HTTP/1.1 304 Not Modified
Date: Sun, 25 Jun 2017 18:17:34 GMT
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Server: AmazonS3

"PageSpeed ​​ने ब्राउज़र कैशिंग का लाभ उठाने का सुझाव दिया" जिसका अर्थ है कि कैश = नियंत्रण गायब है। S3 फ़ाइलों के लिए प्रॉक्सी के रूप में Nginx न केवल लापता हेडर के साथ समस्या हल करता है, बल्कि Nginx प्रॉक्सी कैश का उपयोग करके ट्रैफ़िक भी बचाता है।

मैं macOS का उपयोग करता हूं लेकिन Nginx कॉन्फ़िगरेशन लिनक्स पर ठीक उसी तरह काम करता है जैसे संशोधनों के बिना। क्रमशः:

1. इनस्टॉल नग्नेक्स

brew update && brew install nginx

2. Setup Nginx को S3 बाल्टी से प्रॉक्सी तक, नीचे विन्यास देखें

3. Nginx के माध्यम से फ़ाइल को सबसे अधिक। कृपया सर्वर हेडर पर एक नज़र डालें, हम अब अमेज़ॅन एस 3 के बजाय नग्नेक्स देखते हैं:

curl -I http://localhost:8080/s3/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg

HTTP/1.1 200 OK
Server: nginx/1.12.0
Date: Sun, 25 Jun 2017 18:30:26 GMT
Content-Type: binary/octet-stream
Content-Length: 378843
Connection: keep-alive
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Accept-Ranges: bytes
Cache-Control: max-age=31536000

4. सशर्त GET के साथ Nginx प्रॉक्सी का उपयोग करके फ़ाइल को सबसे अधिक देखें:

curl -I http://localhost:8080/s3/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg 
--header "If-None-Match: 37a907fc5dd7cfd0c428af78f09e95a9"

HTTP/1.1 304 Not Modified
Server: nginx/1.12.0
Date: Sun, 25 Jun 2017 18:32:16 GMT
Connection: keep-alive
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Cache-Control: max-age=31536000

5. Nginx प्रॉक्सी कैश का उपयोग करते हुए फ़ाइल को देखें, कृपया X-Cache-Status हैडर पर एक नज़र डालें, इसका मूल्य MISS है जब तक कि पहले अनुरोध के बाद कैश गर्म न हो जाए

curl -I http://localhost:8080/s3_cached/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
HTTP/1.1 200 OK
Server: nginx/1.12.0
Date: Sun, 25 Jun 2017 18:40:45 GMT
Content-Type: binary/octet-stream
Content-Length: 378843
Connection: keep-alive
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Cache-Control: max-age=31536000
X-Cache-Status: HIT
Accept-Ranges: bytes

Nginx आधिकारिक दस्तावेज के आधार पर मैं निम्नलिखित विकल्पों का समर्थन करने वाली अनुकूलित कैशिंग सेटिंग्स के साथ Nginx S3 कॉन्फ़िगरेशन प्रदान करता हूं:

  • प्रॉक्सी_cache_revalidate NGINX को मूल सर्वर से सामग्री ताज़ा करते समय सशर्त GET अनुरोध का उपयोग करने का निर्देश देता है
  • प्रॉक्सी_cache_use_stale को अद्यतन करने वाला पैरामीटर NGINX को निर्देश देता है कि जब ग्राहक सर्वर से बार-बार अनुरोधों को अग्रेषित करने के बजाय मूल सर्वर से अपडेट किया जा रहा हो, तो बासी सामग्री वितरित करने के लिए NGINX को निर्देश दे।
  • प्रॉक्सी_केचे_लॉक सक्षम होने के साथ, यदि कई क्लाइंट एक ऐसी फ़ाइल का अनुरोध करते हैं जो कैश ( एमआईएस) में चालू नहीं होती है, तो उन अनुरोधों में से केवल मूल सर्वर के माध्यम से अनुमति दी जाती है

Nginx कॉन्फ़िगरेशन :

worker_processes  1;
daemon off;

error_log  /dev/stdout info;
pid        /usr/local/var/nginx/nginx.pid;


events {
  worker_connections  1024;
}


http {
  default_type       text/html;
  access_log         /dev/stdout;
  sendfile           on;
  keepalive_timeout  65;

  proxy_cache_path   /tmp/ levels=1:2 keys_zone=s3_cache:10m max_size=500m
                     inactive=60m use_temp_path=off;

  server {
    listen 8080;

    location /s3/ {
      proxy_http_version     1.1;
      proxy_set_header       Connection "";
      proxy_set_header       Authorization '';
      proxy_set_header       Host yanpy.dev.s3.amazonaws.com;
      proxy_hide_header      x-amz-id-2;
      proxy_hide_header      x-amz-request-id;
      proxy_hide_header      x-amz-meta-server-side-encryption;
      proxy_hide_header      x-amz-server-side-encryption;
      proxy_hide_header      Set-Cookie;
      proxy_ignore_headers   Set-Cookie;
      proxy_intercept_errors on;
      add_header             Cache-Control max-age=31536000;
      proxy_pass             http://yanpy.dev.s3.amazonaws.com/;
    }

    location /s3_cached/ {
      proxy_cache            s3_cache;
      proxy_http_version     1.1;
      proxy_set_header       Connection "";
      proxy_set_header       Authorization '';
      proxy_set_header       Host yanpy.dev.s3.amazonaws.com;
      proxy_hide_header      x-amz-id-2;
      proxy_hide_header      x-amz-request-id;
      proxy_hide_header      x-amz-meta-server-side-encryption;
      proxy_hide_header      x-amz-server-side-encryption;
      proxy_hide_header      Set-Cookie;
      proxy_ignore_headers   Set-Cookie;
      proxy_cache_revalidate on;
      proxy_intercept_errors on;
      proxy_cache_use_stale  error timeout updating http_500 http_502 http_503 http_504;
      proxy_cache_lock       on;
      proxy_cache_valid      200 304 60m;
      add_header             Cache-Control max-age=31536000;
      add_header             X-Cache-Status $upstream_cache_status;
      proxy_pass             http://yanpy.dev.s3.amazonaws.com/;
    }

  }
}

मैं कुछ WPO कार्यों का प्रदर्शन कर रहा हूं, इसलिए PageSpeed ​​ने मुझे ब्राउज़र कैशिंग का लाभ उठाने का सुझाव दिया। मैंने अपने Nginx सर्वर की कुछ स्थिर फ़ाइलों के लिए इसे सफलतापूर्वक सुधार लिया है, हालाँकि Amazon S3 सर्वर में संग्रहीत मेरी छवि फ़ाइलें अभी भी गायब हैं।

मैंने कुछ हेडर मेटाटैग्स (एक्सपायर और कैश-कंट्रोल) को शामिल करने के लिए एस 3 में प्रत्येक फाइल को अपडेट करने के बारे में एक दृष्टिकोण पढ़ा है। मुझे लगता है कि यह एक अच्छा तरीका नहीं है। मेरे पास हजारों फाइलें हैं, इसलिए यह मेरे लिए संभव नहीं है।

मुझे लगता है कि S3 फ़ाइलों को प्रॉक्सी करने के लिए मेरा Nginx 1.6.0 सर्वर कॉन्फ़िगर करना सबसे सुविधाजनक तरीका है। मैंने इस बारे में पढ़ा है, लेकिन मैं सर्वर कॉन्फिगर पर बिल्कुल भी कुशल नहीं हूं, इसलिए मुझे इन साइटों से कुछ उदाहरण मिले: https://gist.github.com/benjaminbarbe/1961db5ffbaad57eff12

मैंने अपने nginx config फ़ाइल में इस सर्वर कोड को अपने सर्वर ब्लॉक के अंदर जोड़ा:

#inside server block
location /mybucket.s3.amazonaws.com/ {


        proxy_http_version     1.1;
        proxy_set_header       Host mybucket.s3.amazonaws.com;
        proxy_set_header       Authorization '';
        proxy_hide_header      x-amz-id-2;
        proxy_hide_header      x-amz-request-id;
        proxy_hide_header      Set-Cookie;
        proxy_ignore_headers   "Set-Cookie";
        proxy_buffering        off;
        proxy_intercept_errors on;      
        proxy_pass             http://mybucket.s3.amazonaws.com;
      }

निश्चित रूप से, यह मेरे लिए काम नहीं कर रहा है। कोई भी शीर्ष लेख मेरे अनुरोधों में शामिल नहीं है। इसलिए, पहले मुझे लगता है कि अनुरोध स्थानों से मेल नहीं खा रहे हैं।

Accept-Ranges:bytes
Content-Length:90810
Content-Type:image/jpeg
Date:Fri, 23 Jun 2017 04:53:56 GMT
ETag:"4fd0be549fbcaf9b47c18a15146cdf16"
Last-Modified:Tue, 09 Jun 2015 09:47:13 GMT
Server:AmazonS3
x-amz-id-2:cKsq1qRra74DqVsTewh3P3sgzVUoPR8aAT2NFCuwA+JjCdDZfk7/7x/C0WPjBa51GEb4C8LyAIc=
x-amz-request-id:94EADB4EDD3DE1C1

Nginx को किस मॉड्यूल के साथ संकलित किया गया है, इसके विवरण के बिना, हम सभी फाइलों में एक्सपायर और कैश-कंट्रोल हेडर जोड़ने के दो तरीके कह सकते हैं।

Nginx S3 प्रॉक्सी

यह वही है जिसके बारे में आपने पूछा था - S3 फाइलों पर एक्सपायर, कैश-कंट्रोल हेडर जोड़ने के लिए Nginx का उपयोग करना।

Nginx इस सेट-मिस-नेग्नेक्स-मॉड्यूल को Nginx S3 प्रॉक्सी का समर्थन करने और बदलने / समाप्त करने, मक्खी पर कैश-नियंत्रण जोड़ने की आवश्यकता है। यह संकलन से उपयोग करने के लिए एक मानक पूर्ण मार्गदर्शिका है, यह उबंटू सर्वर के लिए नेग्नेक्स-एक्स्ट्रा के लिए महान मार्गदर्शक है । यह वर्डप्रेस के साथ उदाहरण के साथ पूर्ण गाइड है

अतिरिक्त चीजों के लिए अधिक S3 मॉड्यूल हैं। उन मॉड्यूल के बिना नग्नेक्स समझ नहीं पाएगा और कॉन्फिग टेस्ट ( nginx -t ) गलत कॉन्फिग के साथ टेस्ट पास करेगा। set-misc-nginx-module आपकी आवश्यकता के लिए न्यूनतम है। आप जो चाहते हैं, उसका इस गीथ्ब जिस्ट पर बेहतर उदाहरण है

जैसा कि सभी संकलन के साथ उपयोग नहीं किया जाता है और सेटअप वास्तव में थोड़ा मुश्किल है, मैं एक अमेज़ॅन एस 3 बाल्टी में सभी फाइलों के लिए एक्सपायर और कैश-कंट्रोल हेडर सेट करने का तरीका भी लिख रहा हूं।

अमेज़न S3 बकेट एक्सपायर और कैश-कंट्रोल हैडर

इसके अलावा, स्क्रिप्ट या कमांड लाइन के साथ एक एडब्ल्यूएस एस 3 बाल्टी में सभी वस्तुओं के लिए एक्सपायर और कैश-कंट्रोल हेडर सेट करना संभव है। गिथब पर इस तरह के कई मुफ्त पुस्तकालय और स्क्रिप्ट हैं जैसे एक , बाल्टी एक्सप्लोरर , अमेज़ॅन का उपकरण , अमेज़ॅन का यह डॉक्टर और यह डॉक्टर । कमांड उस cp CLI टूल के लिए इस तरह होगी:

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2027-09-01T00:00:00Z --acl public-read --cache-control max-age=2000000,public




http-headers