इसे छोड़कर कंटेंट पर जाएं

NGINX कॉन्फ़िगरेशन

cloud-init प्रोविज़निंग एक पूरी तरह से परफ़ॉर्मेंस-ऑप्टिमाइज़्ड NGINX CDN एज कॉन्फ़िगरेशन डिप्लॉय करती है। यह पेज कर्नेल ट्यूनिंग से लेकर कैश व्यवहार और वेंडर हेडर इंजेक्शन तक हर कॉन्फ़िगरेशन लेयर का दस्तावेज़ीकरण करता है। सभी सेटिंग्स 172,540 req/s पर पीक करने वाले 48-घंटे के निरंतर लोड टेस्ट में सत्यापित की गई थीं।

कॉन्फ़िगरेशन फ़ाइलें

Section titled “कॉन्फ़िगरेशन फ़ाइलें”
फ़ाइलउद्देश्य
/etc/sysctl.d/99-cdn-tuning.confLinux कर्नेल नेटवर्क ट्यूनिंग
/etc/systemd/system/nginx.service.d/override.confNGINX के लिए फ़ाइल डिस्क्रिप्टर सीमाएँ
/etc/security/limits.d/99-nginx.confwww-data उपयोगकर्ता के लिए OS-स्तरीय सीमाएँ
/etc/nginx/nginx.confNGINX मुख्य कॉन्फ़िग (वर्कर्स, बफ़र्स, gzip, लॉगिंग)
/etc/nginx/conf.d/cdn-edge.confCDN प्रॉक्सी कॉन्फ़िग (कैश, अपस्ट्रीम, हेडर्स)

कर्नेल ट्यूनिंग

Section titled “कर्नेल ट्यूनिंग”

बूट समय पर /etc/sysctl.d/99-cdn-tuning.conf के माध्यम से लागू।

पैरामीटरमानडिफ़ॉल्टउद्देश्य
net.core.somaxconn655354096लिसन बैकलॉग क्यू आकार
net.core.netdev_max_backlog655351000प्रति-CPU इनकमिंग पैकेट बैकलॉग
net.ipv4.tcp_max_syn_backlog65535256SYN अनुरोध क्यू (बर्स्ट के दौरान ड्रॉप रोकता है)
net.ipv4.tcp_tw_reuse12आउटगोइंग कनेक्शन के लिए TIME_WAIT सॉकेट पुन: उपयोग
net.ipv4.ip_local_port_range1024-6553532768-60999एफ़ेमरल पोर्ट रेंज (64K बनाम 28K)
net.core.rmem_max16 MB212 KBअधिकतम रिसीव सॉकेट बफ़र
net.core.wmem_max16 MB212 KBअधिकतम सेंड सॉकेट बफ़र
net.ipv4.tcp_rmem4K/87K/16M4K/131K/6Mप्रति-सॉकेट रिसीव बफ़र (न्यूनतम/डिफ़ॉल्ट/अधिकतम)
net.ipv4.tcp_wmem4K/65K/16M4K/16K/4Mप्रति-सॉकेट सेंड बफ़र (न्यूनतम/डिफ़ॉल्ट/अधिकतम)
net.ipv4.tcp_fin_timeout1560FIN_WAIT_2 टाइमआउट (तेज़ सॉकेट क्लीनअप)
net.ipv4.tcp_keepalive_time30072005 मिनट आइडल रहने के बाद keepalive प्रोब शुरू करें
net.ipv4.tcp_slow_start_after_idle01आइडल कनेक्शन पर कंजेशन विंडो वार्म रखें
net.ipv4.tcp_max_tw_buckets2000000~65536अधिकतम TIME_WAIT सॉकेट
fs.file-max2097152भिन्नसिस्टम-व्यापी फ़ाइल डिस्क्रिप्टर सीमा
vm.swappiness1060कैश डेटा के लिए स्वैप से RAM को प्राथमिकता

NGINX मुख्य कॉन्फ़िग

Section titled “NGINX मुख्य कॉन्फ़िग”

वर्कर्स और कनेक्शन

Section titled “वर्कर्स और कनेक्शन”
worker_processes auto; # 4 workers on D4s_v5 (1 per vCPU)
worker_rlimit_nofile 65535; # Per-worker file descriptor limit
events {
use epoll; # Linux-optimized event model
worker_connections 8192; # 4 workers x 8192 = 32,768 max concurrent
multi_accept on; # Accept all pending connections per event loop
accept_mutex off; # Not needed with epoll + reuseport
}

/etc/systemd/system/nginx.service.d/override.conf पर Systemd ओवरराइड मैच करने के लिए LimitNOFILE=65535 सेट करता है।

प्रॉक्सी बफ़र्स

Section titled “प्रॉक्सी बफ़र्स”
proxy_buffering on;
proxy_buffer_size 16k; # Header buffer (handles large CDN headers)
proxy_buffers 64 16k; # 1 MB per connection (64 x 16k)
proxy_busy_buffers_size 256k; # Can send 256k to client while still reading

256k बिज़ी बफ़र साइज़ महत्वपूर्ण है — यह सबसे बड़ी कैश्ड रिस्पॉन्स (Juice Shop 75 KB है) से अधिक होना चाहिए। मूल 64k सेटिंग ने लोड के अंतर्गत सीरियलाइज़ेशन का कारण बना।

gzip on;
gzip_comp_level 4; # Balance: ~85% of max compression at ~40% CPU
gzip_min_length 256; # Skip tiny responses (gzip header overhead)
gzip_vary on; # Vary: Accept-Encoding for correct caching
gzip_proxied any; # Compress all proxied responses
gzip_types text/plain text/css text/javascript text/xml
application/json application/javascript application/xml
application/xml+rss application/atom+xml
application/ld+json application/manifest+json
image/svg+xml;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

कैश्ड ऑब्जेक्ट्स के लिए फ़ाइल डिस्क्रिप्टर और मेटाडेटा कैश करता है, हॉट फ़ाइलों पर stat() और open() syscalls को समाप्त करता है।

keepalive_timeout 65;
keepalive_requests 100000; # Was 1000 — caused connection recycling at 90K req/s

90K req/s पर keepalive_requests 1000 के साथ, कनेक्शन हर 11 सेकंड में रिसाइकल होते थे, जिससे TIME_WAIT सॉकेट उत्पन्न होते थे। 100,000 तक बढ़ाने से यह पूरी तरह समाप्त हो गया।

log_format cdn '$remote_addr [$time_local] "$request" $status $body_bytes_sent $upstream_cache_status $request_time';
access_log /var/log/nginx/access.log cdn buffer=256k flush=5s;

cdn लॉग फ़ॉर्मेट में लेटेंसी विश्लेषण के लिए $upstream_cache_status (HIT/MISS) और $request_time शामिल है। बफ़र्ड लॉगिंग (256k/5s फ़्लश) उच्च लोड के अंतर्गत I/O ओवरहेड कम करती है।

upstream origin_backend {
server 20.12.78.159:80;
keepalive 256; # Persistent connections per worker to origin
keepalive_timeout 60s;
keepalive_requests 1000;
}

4 वर्कर्स x 256 keepalive = ऑरिजिन के लिए 1,024 वार्म कनेक्शन। proxy_http_version 1.1 और proxy_set_header Connection "" के साथ मिलाकर, यह हर कैश मिस पर TCP हैंडशेक ओवरहेड को समाप्त करता है।

कैश कॉन्फ़िगरेशन

Section titled “कैश कॉन्फ़िगरेशन”
proxy_cache_path /var/cache/nginx/cdn
levels=1:2
keys_zone=cdn_cache:32m
max_size=25g
inactive=24h
use_temp_path=off;
पैरामीटरमानउद्देश्य
keys_zone=cdn_cache:32m32 MB शेयर्ड मेमोरी~256,000 कैश कीज़ और मेटाडेटा स्टोर करता है
max_size=25g25 GB डिस्क सीमा30 GB OS डिस्क का अधिकांश उपयोग करता है; सीमा पर LRU इविक्शन
inactive=24h24-घंटे निष्क्रियता टाइमआउट24 घंटे तक एक्सेस न किया गया कंटेंट इविक्ट होता है (TTL के समान नहीं)
use_temp_path=offसीधे कैश डायरेक्टरी में लिखेंक्रॉस-फ़ाइलसिस्टम फ़ाइल मूव से बचाता है
proxy_cache cdn_cache;
proxy_cache_valid 200 301 302 4h;
proxy_cache_valid 404 1m;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_lock on;
proxy_cache_lock_age 3s;
proxy_cache_lock_timeout 3s;
proxy_cache_background_update on;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
proxy_ignore_headers Set-Cookie Cache-Control Expires Vary;
proxy_hide_header X-Cache-Status;
proxy_hide_header Vary;
डायरेक्टिवमानउद्देश्य
proxy_cache_valid 200 301 302 4h4-घंटे TTLकैश्ड कंटेंट 4 घंटे के लिए वैध (रिफ़्रेश वेव थ्रूपुट डिप्स को कम करने के लिए बढ़ाया गया)
proxy_cache_lock onथंडरिंग हर्ड रोकथामप्रति अनकैश्ड URL केवल 1 अनुरोध ऑरिजिन पर जाता है; बाकी कैश भरने की प्रतीक्षा करते हैं
proxy_cache_lock_age 3sलॉक टाइमआउटयदि पहला अनुरोध 3s में पूरा नहीं हुआ, तो दूसरे को गुज़रने दें
proxy_cache_background_update onशून्य-लेटेंसी रिफ़्रेशबैकग्राउंड में रिफ़्रेश करते समय तुरंत स्टेल कंटेंट सर्व करता है
proxy_cache_use_staleरेज़िलिएंसऑरिजिन एरर (500/502/503/504) के दौरान या अपडेट करते समय स्टेल कंटेंट सर्व करता है
proxy_ignore_headersफ़ोर्स कैशिंगऑरिजिन Set-Cookie, Cache-Control, Expires, Vary को इग्नोर करता है — CDN TTL और Vary व्यवहार तय करता है (Juice Shop max-age=0 और ट्रिपल Vary हेडर्स भेजता है जो प्रभावी कैशिंग रोकते थे)
proxy_hide_header X-Cache-Statusऑरिजिन हेडर स्ट्रिप करेंऑरिजिन NGINX अपना X-Cache-Status जोड़ता है — इसे स्ट्रिप करें ताकि केवल CDN का कैश स्टेटस दिखे
proxy_hide_header Varyकैश फ़्रैगमेंटेशन रोकेंऑरिजिन एकाधिक Vary: Accept-Encoding हेडर्स भेजता है। इन्हें स्ट्रिप करने से Accept-Encoding क्रमपरिवर्तन में कैश कीज़ फ़्रैगमेंटेशन रुकता है। NGINX का gzip_vary on स्वचालित रूप से सही एकल Vary हेडर जोड़ता है

प्रॉक्सी टाइमआउट

Section titled “प्रॉक्सी टाइमआउट”
proxy_read_timeout 30s;
proxy_connect_timeout 10s;
proxy_send_timeout 15s;

लोड के अंतर्गत ऑरिजिन को अधिक रिस्पॉन्स समय देता है जबकि कनेक्शन समस्याओं पर तेज़ी से विफल होता है।

server {
listen 80 reuseport; # Kernel distributes connections across all 4 workers
server_name _;
}

reuseport SO_REUSEPORT सक्षम करता है — कर्नेल इनकमिंग कनेक्शन सीधे वर्कर प्रोसेस में वितरित करता है, accept mutex कंटेंशन को समाप्त करता है।

सिम्युलेटर सभी पाँच प्रमुख CDN वेंडर्स के हेडर्स एक साथ इंजेक्ट करता है। यह F5 XC को किसी भी वेंडर के “Trusted Client IP Header” के साथ कॉन्फ़िगर करने और यथार्थवादी हेडर पेलोड देखने की अनुमति देता है, चाहे कोई भी CDN सिम्युलेट किया जा रहा हो।

इंडस्ट्री स्टैंडर्ड हेडर्स (सभी CDN)

Section titled “इंडस्ट्री स्टैंडर्ड हेडर्स (सभी CDN)”
हेडरमानउद्देश्य
X-Forwarded-Forक्लाइंट IP चेनस्टैंडर्ड फ़ॉरवर्डेड IP
X-Forwarded-Protohttp या httpsमूल क्लाइंट प्रोटोकॉल
X-Forwarded-Hostमूल होस्टनेममूल Host हेडर
X-Forwarded-Portसर्वर पोर्टमूल पोर्ट
X-Real-IPक्लाइंट IPएकल क्लाइंट IP (nginx कन्वेंशन)
Via1.1 cdn-simulatorप्रॉक्सी पहचान
ForwardedRFC 7239 फ़ॉर्मेटमानकीकृत फ़ॉरवर्डिंग हेडर
CDN-Loopcdn-simulatorलूप डिटेक्शन
हेडरमानउद्देश्य
True-Client-IPक्लाइंट IPमूल एंड-यूज़र IP पता
X-Akamai-Edgescapeकम्पाउंड जियो स्ट्रिंगgeoregion, country_code, region_code, city, dma, pmsa, msa, areacode, county, fips, lat, long, timezone, zip, continent, throughput, bw, network, asnum, network_type
X-Akamai-Device-Characteristicsडिवाइस प्रॉपर्टीज़brand_name, model_name, is_mobile, is_tablet, is_wireless_device, device_os, device_os_version, resolution_width, resolution_height
X-Akamai-Request-IDरिक्वेस्ट UUIDयूनिक रिक्वेस्ट आइडेंटिफ़ायर
हेडरमानउद्देश्य
CF-Connecting-IPक्लाइंट IPवास्तविक क्लाइंट IP (हमेशा मौजूद)
CF-IPCountryUSदो-अक्षर का देश कोड
cf-ipcitySan Joseक्लाइंट शहर
cf-ipcontinentNAमहाद्वीप कोड
cf-iplatitude / cf-iplongitudeनिर्देशांकजियोलोकेशन
cf-region / cf-region-codeCalifornia / CAक्षेत्र जानकारी
cf-metro-code807US मेट्रो कोड
cf-postal-code95113पोस्टल कोड
cf-timezoneAmerica/Los_AngelesIANA टाइमज़ोन
Cf-Ray{request_id}-SJCPOP IATA कोड के साथ यूनिक रे ID
CF-Visitor{"scheme":"https"}विज़िटर प्रोटोकॉल जानकारी
cf-bot-score85बॉट स्कोर (1=बॉट, 99=मानव)
cf-verified-botfalseज्ञात अच्छा बॉट फ़्लैग
cf-ja3-hashe7d705a3286e19ea42f587b344ee6865JA3 TLS फ़िंगरप्रिंट
cf-ja4t13d1516h2_8daaf6152771_b0da82dd1658JA4 TLS फ़िंगरप्रिंट
हेडरमानउद्देश्य
CloudFront-Viewer-AddressIP:portक्लाइंट IP और सोर्स पोर्ट
CloudFront-Viewer-CountryUSदेश कोड
CloudFront-Viewer-Country-NameUnited Statesपूरा देश नाम
CloudFront-Viewer-Country-RegionCAक्षेत्र कोड
CloudFront-Viewer-Country-Region-NameCaliforniaपूरा क्षेत्र नाम
CloudFront-Viewer-CitySan Joseक्लाइंट शहर
CloudFront-Viewer-Postal-Code95113पोस्टल कोड
CloudFront-Viewer-Latitude / Longitude37.33530 / -121.89300जियोलोकेशन
CloudFront-Viewer-Time-ZoneAmerica/Los_AngelesIANA टाइमज़ोन
CloudFront-Viewer-Metro-Code807US मेट्रो कोड
CloudFront-Viewer-ASN7018ऑटोनॉमस सिस्टम नंबर
CloudFront-Viewer-Http-Version2.0क्लाइंट HTTP संस्करण
CloudFront-Forwarded-Protohttpsमूल प्रोटोकॉल
CloudFront-Viewer-TLSTLSv1.3:TLS_AES_128_GCM_SHA256:sessionResumedTLS विवरण
CloudFront-Viewer-JA3-Fingerprinte7d705a3286e19ea42f587b344ee6865JA3 TLS फ़िंगरप्रिंट
CloudFront-Is-Desktop-Viewertrue/falseडिवाइस डिटेक्शन
CloudFront-Is-Mobile-Viewertrue/falseडिवाइस डिटेक्शन
CloudFront-Is-Tablet-Viewertrue/falseडिवाइस डिटेक्शन
CloudFront-Is-SmartTV-Viewerfalseडिवाइस डिटेक्शन
X-Amz-Cf-Idएनकोडेड IDCloudFront रिक्वेस्ट आइडेंटिफ़ायर
हेडरमानउद्देश्य
Fastly-Client-IPक्लाइंट IPवास्तविक क्लाइंट IP
Fastly-SSL1कनेक्शन TLS पर था
Fastly-Client1क्लाइंट-फ़ेसिंग रिक्वेस्ट (शील्ड नहीं)
Fastly-FFcache-sjc3120-SJCकैश नोड पहचान
X-Geo-Country-CodeUSदेश (VCL वेरिएबल कन्वेंशन)
X-Geo-Country-Code3USAतीन-अक्षर का देश कोड
X-Geo-Country-NameUnited Statesपूरा देश नाम
X-Geo-CitySan Joseक्लाइंट शहर
X-Geo-RegionCAक्षेत्र कोड
X-Geo-Continent-CodeNAमहाद्वीप
X-Geo-Latitude / X-Geo-Longitude37.3353 / -121.8938जियोलोकेशन
X-Geo-Postal-Code95113पोस्टल कोड
X-Geo-Metro-Code807US मेट्रो कोड
X-Geo-ASN7018ऑटोनॉमस सिस्टम नंबर
X-Geo-Conn-Speedbroadbandकनेक्शन स्पीड क्लास
X-Geo-Conn-Typewiredकनेक्शन प्रकार
हेडरमानउद्देश्य
X-Azure-ClientIPक्लाइंट IPक्लाइंट IP पता
X-Azure-SocketIPक्लाइंट IPTCP सॉकेट सोर्स IP
X-Azure-Refएनकोडेड रेफ़ स्ट्रिंगसमस्या निवारण के लिए यूनिक रिक्वेस्ट संदर्भ
X-Azure-FDIDa0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1Front Door रिसोर्स आइडेंटिफ़ायर
X-Azure-RequestChainhops=1लूप डिटेक्शन हॉप काउंट

रिस्पॉन्स हेडर्स (क्लाइंट रिस्पॉन्स में जोड़े गए)

Section titled “रिस्पॉन्स हेडर्स (क्लाइंट रिस्पॉन्स में जोड़े गए)”
हेडरमानउद्देश्य
X-Cache-StatusHIT, MISS, EXPIRED, STALE, UPDATINGइस रिक्वेस्ट के लिए कैश व्यवहार
X-CDN-Edgecdn-simulatorइस एज नोड की पहचान
X-CDN-POPSJCसिम्युलेटेड पॉइंट ऑफ़ प्रेज़ेंस IATA कोड
X-Served-Bycache-sjc3120-SJCFastly फ़ॉर्मेट में सिम्युलेटेड कैश नोड
X-Request-IDUUID (प्रति-रिक्वेस्ट)यूनिक रिक्वेस्ट आइडेंटिफ़ायर

डिवाइस डिटेक्शन

Section titled “डिवाइस डिटेक्शन”

सिम्युलेटर NGINX map डायरेक्टिव का उपयोग करके User-Agent हेडर से डिवाइस प्रकार का पता लगाता है:

  • मोबाइल: iPhone, Android (नॉन-टैबलेट), iPod, BlackBerry, Opera Mini, IEMobile से मैच करता है
  • टैबलेट: iPad, Android टैबलेट, Kindle, PlayBook से मैच करता है
  • डेस्कटॉप: जब न मोबाइल और न टैबलेट मैच होता है तो डिफ़ॉल्ट

डिवाइस प्रकार इनमें परिलक्षित होता है:

  • CloudFront-Is-Desktop-Viewer / CloudFront-Is-Mobile-Viewer / CloudFront-Is-Tablet-Viewer
  • X-Akamai-Device-Characteristics (is_mobile, is_tablet, is_wireless_device फ़ील्ड्स)

ऑरिजिन सर्वर बदलना

Section titled “ऑरिजिन सर्वर बदलना”
Terminal window
ssh azureuser@<PUBLIC_IP>
# Update upstream server
sudo sed -i 's|server .*;|server NEW_HOST:80;|' /etc/nginx/conf.d/cdn-edge.conf
# Clear cache and reload
sudo rm -rf /var/cache/nginx/cdn/*
sudo nginx -t && sudo systemctl reload nginx

या terraform.tfvars में origin_host अपडेट करें और पुनः प्रोविज़न करने के लिए terraform apply चलाएँ।

Terminal window
ssh azureuser@<PUBLIC_IP>
sudo rm -rf /var/cache/nginx/cdn/*
sudo systemctl reload nginx

कैश आँकड़े जाँचना

Section titled “कैश आँकड़े जाँचना”
Terminal window
# Object count and disk usage
sudo find /var/cache/nginx/cdn -type f | wc -l
sudo du -sh /var/cache/nginx/cdn
# Recent access log with cache status
tail -20 /var/log/nginx/access.log

लोड के अंतर्गत मॉनिटरिंग

Section titled “लोड के अंतर्गत मॉनिटरिंग”
Terminal window
# Real-time connections and socket states
ss -s
# NGINX worker CPU usage
top -bn1 | grep nginx
# Upstream keepalive connections
ss -tn state established dst <ORIGIN_IP> | wc -l
# TIME_WAIT socket count
ss -tn state time-wait | wc -l

परफ़ॉर्मेंस बेंचमार्क परिणाम

Section titled “परफ़ॉर्मेंस बेंचमार्क परिणाम”

48-घंटे के निरंतर लोड टेस्ट में सत्यापित:

मेट्रिकमान
पीक थ्रूपुट (कैश्ड)172,540 req/s
सस्टेन्ड थ्रूपुट (कैश्ड)85,000-103,000 req/s
पीक कनेक्शन15,000 समवर्ती
कैश हिट अनुपात100% (वार्म होने पर)
लोड के अंतर्गत मेमोरी1.2 GB स्थिर (16 GB का 8%)
पीक पर CPU100% (4 कोर - CPU सीलिंग है)
48 घंटे टेस्ट में एरर0
मेमोरी लीककोई नहीं पाई गई
कनेक्शन लीककोई नहीं पाई गई