惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
Recorded Future
Recorded Future
T
Tenable Blog
S
Securelist
C
CERT Recently Published Vulnerability Notes
T
Threatpost
S
Schneier on Security
A
Arctic Wolf
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
K
Kaspersky official blog
T
True Tiger Recordings
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
小众软件
小众软件
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Spread Privacy
Spread Privacy
Malwarebytes
Malwarebytes
P
Proofpoint News Feed
F
Fox-IT International blog
F
Fortinet All Blogs
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
量子位
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Project Zero
Project Zero
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
I
Intezer
博客园_首页
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security

DEV Community

Django Session Cookie vs localStorage JWT Security Comparison The Day Our Treasure Hunt Engine Blew Up at 3 AM How I Built 8 Free Dev Tools as a Solo Maker — Lessons Learned The Moment the JVM Unwound at 3 AM and the Rust Runtime Held Why Linux Powers Almost Every Modern Server How to Merge Multiple PDFs with One API Call — Node.js, Python & curl Why you should always rewrite the code you copy Structured Prompts Cut Token Waste 35-40%. Here's Where It Actually Matters. Validate EU VAT Numbers in Claude Desktop, Cursor, and ChatGPT — Official MCP Server The AI That Improves Itself: Autonomous Prompt Iteration Loop Do You Really Need Certifications to Get a Job? 🤔 Building Your First UAPK Manifest: A Step-by-Step Guide Inside a Horilla CRM App: registration.py, menu.py, and What AppLauncher Actually Loads Automate Browser Tasks with xbrowser: A Developer's Guide to Web Automation Why Veltrix Will Never Be the Silver Bullet for Distributed Locks at Scale ClickUp from a Developer's Perspective in 2026: API, Webhooks, and the Self-Host Question Foundational Concepts in Data Engineering ¿Por qué Go no tiene excepciones? Primeros pasos Creating my own web browser The Gamedev Server That Broke at 300 Concurrent Hunters and How We Fixed It OneAquaHealth IEEE Global Hackathon Hytale Servers and the Lies We Told Ourselves About Treasure Hunts Evcode:I built a terminal IDE in Rust that runs on 7MB of RAM — Evcode 1.0.0 HackCanton S2 is Open — Build on Canton and Win How to Start Contributing to Open-Source AI Projects (Python, Agents, Good First Issues) I built /ai inside a notes app — here's how I render generated UI components safely I Built 8 Free Browser-Based Developer Tools (No Uploads, No Tracking) Liquid Alerts: WOW Alerts Meet Liquid Border Rest is not what you think How Polymarket Scaled Their Data Stack with Postgres + ClickHouse Adaptive execution for Java agents: reason-aware retries and budget-aware routing Memory Safety and the C/C++ CVE Crisis tRPC: The End of API Docs as We Know Them How to Build a Crypto Trading Bot with CoinGlass API AI: Who I Am, and What I'm Supposed to Be in the Software World I Have Taken Over React Projects Without Standards. Here Is What That Actually Feels Like. How I set up Sanity draft mode preview with Next.js App Router and Vercel Edge Config Secure File Upload Guide to Validation, Scanning and Storage The pause before the first token iOS Image Classification CoreML: Complete 2026 Guide Fine-Tuning Llama 3.2 3B on Medical QA: Week 2- Data Preparation Building a Card Game AI with Reinforcement Learning — Implementation Details#2 Stop hardcoding AI providers: a generic client approach AI models are missing religious context. Builders should treat that as an eval problem. Build Your AI Second Brain with Claude + Obsidian Encoding FIFA’s 495 third-place scenarios for the 2026 World Cup I burned through DeepSeek's 5M free tokens in 14 days — here's the exact math Animating React Without Fighting the Render Loop: useRafFn, useRafState, useFps, useDevicePixelRatio, useUpdate I’m Building AR/XR Experiences for Nigeria Without ARCore or ARKit Memory Graphs Don't Scale Is it just me, or is Codex getting slower day by day? 🐢 LLM API Tokens burning your Bank even on testing ? Not anymore, cuesheet is here to help with that. HTML to JSX: Common Conversion Problems Frontend Developers Still Make Fighting Database Connection Pool Exhaustion Your sanctions screening just broke: managing 50+ data sources without burying your team I think AI accidentally became my personality for a month Building a local-first clipboard workspace for macOS Understanding MCP (Model Context Protocol) in Next.js 16 Next.js 16 RAG Pipeline Optimization: Give Your AI a Perfect Memory The Complete Developer’s Guide to the Baileys WhatsApp Bot: Setup, Scaling, and VPS Deployment The Moment Veltrix Blew Up and We Had to Write Our Own Shard Router We built an alert triage system. Then we watched analysts ignore it. Future of AI Hardware API Treasure Hunt Engine: When Veltrix Defaults Buried 800k Documents in a Hot Partition I Cloned My Dog-Name Site to Build a Cat-Name Site. The Routing Layer Bit Back. Serverless Computing Claude Code Hooks vs Skills: When to Use Which Secure AI API Key Management in Next.js 16: Prevent Key Leaks I Built a Git-Tracked Book Production Pipeline CSS Carousels With Zero JavaScript: 5 Patterns 5 CSS Animations That Needed JavaScript Until 2026 When the Treasure Hunt Engine Eats Itself: My First Production Outage That Taught Me the True Cost of Defaults The 5 Best Places to Buy Next.js Templates in 2026 (Compared by Price) Building AMLA-Ready Systems: A Developer's Technical Roadmap Modern SCADA Systems Need Structured Learning More Than Ever The Rise, Pause, and Rise of CRUD Apps The Hidden Cost of Idempotency in Distributed Systems Solana Account Model — City Analogy Veltrix Configuration Was the Least of Our Worries When Our Treasure Hunt Engine Almost Took Down the Server CSS Box Shadows That Actually Look Professional CSS Gradient Trends in 2026 (And How Developers Actually Use Them) Why EU region toggles in cloud providers don't solve data sovereignty (and how to fix it) Why I Built the "Infrastructure Layer" Under Every AI Coding Agents Why I Still Regret Choosing Velocity Over Simplicity in Our Treasure Hunt Engine Configuration How Are Developers Actually Using AI At Work? Claude Security Update: Scans, Webhooks, 6 Partners The 2026 Chinese LLM Price War: Top 5 Frontier API Costs Compared Local LLM Hosting in Switzerland: Real Costs, Latency & Compliance I Built a Free SVG Background Generator for Developers Tian AI: I Built an AI Assistant That Runs 100% Offline on My Phone (No Cloud, No Subscription) How to Create Responsive Video That Doesn't "Jump" During Loading MY DEEP TECHNICAL EXPLORATION AND PERSONAL EXPERIENCE WITH HERMES AGENT 08/20: Layer 3 – The Network Layer: IP Addresses & Routing Explained CLAUDE.md for Astro: 13 Rules That Stop AI from Shipping Too Much JavaScript 10 JSON Formatting Tricks Every Developer Should Know We replaced 73 hours of weekly alert triage with 10 AI agents. Here is what the architecture looks like. The four-line cron that decides who falls in love (in my dating app) Blocked by Mac Security? How to Fix “Apple Could Not Verify” Errors in Seconds Stop the Leak: A Developer’s Guide to Taming the AWS RDS Bill in 2026
Magento 2 Nginx Optimization for High Traffic — Complete Server Tuning Guide
Magevanta · 2026-05-27 · via DEV Community

Your Magento store can have perfect PHP-FPM pools, well-tuned Redis, and optimized MySQL — and still buckle under load because Nginx is configured with defaults meant for a blog, not an ecommerce platform. Nginx is the front door to your entire stack. If it's slow, everything behind it is slow.

This guide walks through every lever worth pulling: connection handling, compression, caching headers, microcaching, SSL/TLS, and real-world configs for a Magento 2 production server.

Why Nginx Defaults Aren't Enough

Out-of-the-box Nginx ships with conservative defaults:

  • worker_processes 1 — single worker, ignoring your CPU cores
  • No gzip compression enabled
  • Keepalive timeouts that force reconnects
  • No browser cache headers
  • TLS handshakes that repeat work they don't need to

For a low-traffic site this doesn't matter. For Magento — which serves category pages, product pages, checkout flows, and API calls simultaneously — these defaults become bottlenecks at a few hundred concurrent users.

1. Worker Processes and Connections

Start at the top of nginx.conf:

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

Enter fullscreen mode Exit fullscreen mode

worker_processes auto — Nginx will match the number of workers to available CPU cores. A 4-core server gets 4 workers.

worker_rlimit_nofile 65535 — raises the OS file descriptor limit per worker. Each active connection uses a file descriptor; the default of 1024 is dangerously low for production.

worker_connections 4096 — maximum connections per worker. Total concurrent connections = worker_processes × worker_connections. On a 4-core server: 16,384 concurrent connections max.

use epoll — Linux-only but highly efficient; scales better than select or poll under thousands of connections.

multi_accept on — workers accept all pending connections at once instead of one at a time.

2. Gzip Compression

Magento pages are large: HTML pages often exceed 100KB before JS and CSS. Gzip cuts transfer sizes by 60–80%:

http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 1000;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xml+rss
        application/vnd.ms-fontobject
        font/eot
        font/otf
        font/ttf
        image/svg+xml;
}

Enter fullscreen mode Exit fullscreen mode

gzip_comp_level 5 — the sweet spot. Level 9 uses ~30% more CPU for only ~2% better compression. Level 5 is fast and effective.

gzip_vary on — adds a Vary: Accept-Encoding header so CDNs and proxies serve the right version to each client.

gzip_min_length 1000 — don't bother compressing tiny responses; overhead outweighs benefit below ~1KB.

3. Keepalive and Timeouts

Keepalive connections let the browser reuse TCP connections for multiple requests, eliminating repeated TCP handshakes:

http {
    keepalive_timeout 65;
    keepalive_requests 100;

    # Upstream keepalive to PHP-FPM
    upstream fastcgi_backend {
        server unix:/run/php/php8.3-fpm.sock;
        keepalive 32;
    }
}

Enter fullscreen mode Exit fullscreen mode

keepalive_timeout 65 — hold connections open for 65 seconds. Fine for most workloads; reduce to 15–30 on memory-constrained servers.

keepalive 32 in the upstream block — keeps up to 32 persistent connections open to PHP-FPM, avoiding socket overhead on every PHP request.

Also tune these to avoid slow clients tying up workers:

client_header_timeout 15;
client_body_timeout  15;
send_timeout         15;
reset_timedout_connection on;

Enter fullscreen mode Exit fullscreen mode

4. Browser Cache Headers for Static Assets

Magento's static files (JS, CSS, images, fonts) are versioned via deploy version hashes. Set aggressive caching:

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|webp)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    access_log off;
}

Enter fullscreen mode Exit fullscreen mode

immutable tells supporting browsers (Chrome, Firefox) to never re-validate the file during its lifetime — eliminating conditional GET requests entirely.

access_log off for static assets reduces disk I/O significantly on busy servers.

5. Microcaching with FastCGI Cache

Full Page Cache (Varnish or Magento built-in) handles authenticated sessions poorly by design. Microcaching fills the gap: cache PHP responses for just 1–5 seconds. At 500 req/s, a 1-second cache reduces PHP hits by ~99% for repeated URLs.

Define a cache zone in nginx.conf:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=MAGENTO:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Enter fullscreen mode Exit fullscreen mode

In your server block:

set $no_cache 0;

# Don't cache POST requests
if ($request_method = POST) { set $no_cache 1; }

# Don't cache if session cookie present (logged-in users, active cart)
if ($http_cookie ~* "(PHPSESSID|frontend|adminhtml|checkout)") {
    set $no_cache 1;
}

location ~ \.php$ {
    fastcgi_cache MAGENTO;
    fastcgi_cache_valid 200 1s;
    fastcgi_cache_bypass $no_cache;
    fastcgi_no_cache $no_cache;
    add_header X-FastCGI-Cache $upstream_cache_status;

    include fastcgi_params;
    fastcgi_pass fastcgi_backend;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Enter fullscreen mode Exit fullscreen mode

The X-FastCGI-Cache header lets you verify HIT/MISS/BYPASS in response headers — essential for debugging. If you see BYPASS on every request, check that your cookie exclusions are correct.

Important: Do not use microcaching in place of proper FPC. Use it as a complement for high-burst traffic windows (flash sales, launches).

6. SSL/TLS Performance

TLS termination at Nginx is unavoidable on HTTPS-only stores. Tune it to minimize handshake overhead:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;  # Disable for perfect forward secrecy

ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;

Enter fullscreen mode Exit fullscreen mode

ssl_session_cache shared:SSL:10m — a 10MB shared cache holds ~40,000 sessions, allowing TLS resumption (no full handshake for returning visitors).

OCSP stapling (ssl_stapling on) — Nginx fetches and caches the certificate validity check, so your clients don't have to. Eliminates one round-trip per new connection.

TLSv1.3 — if you can drop TLSv1.2 entirely (verify your CDN and payment providers support it), TLSv1.3 does a full handshake in 1 round trip vs. 2.

7. Buffer Tuning

Large Magento responses (admin grids, product list pages) benefit from proper buffer settings:

client_body_buffer_size 128k;
client_max_body_size    64m;   # Required for media imports

proxy_buffer_size          4k;
proxy_buffers            4 32k;
proxy_busy_buffers_size  64k;

fastcgi_buffers          16 16k;
fastcgi_buffer_size      32k;

Enter fullscreen mode Exit fullscreen mode

fastcgi_buffers 16 16k — 256KB total buffer per request. Enough for most Magento pages without disk buffering.

If a page exceeds fastcgi_buffers, Nginx writes the overflow to a temp file — adding disk I/O to every large response. Set this high enough to avoid it.

8. Rate Limiting for Admin and API

Protect your admin panel and REST API from brute-force and abuse:

# Define zones in http block
limit_req_zone $binary_remote_addr zone=admin:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s;

# Apply in server block
location /admin {
    limit_req zone=admin burst=10 nodelay;
    # ... rest of config
}

location /rest {
    limit_req zone=api burst=50 nodelay;
    # ... rest of config
}

Enter fullscreen mode Exit fullscreen mode

burst allows short spikes above the rate. nodelay processes burst requests immediately instead of queuing them — important for API clients that batch requests.

9. Monitoring What You've Done

After applying changes, verify with:

# Test config before reloading
nginx -t

# Reload without dropping connections
nginx -s reload

# Watch real-time connection states
ss -s

# Check cache hit rate (tail access log with cache status)
tail -f /var/log/nginx/access.log | grep 'X-Cache'

Enter fullscreen mode Exit fullscreen mode

Use ab (ApacheBench) or wrk for quick load tests before and after:

# 1000 requests, 50 concurrent
ab -n 1000 -c 50 https://your-store.com/

Enter fullscreen mode Exit fullscreen mode

Putting It All Together

Nginx optimization is one of the highest-leverage things you can do for a Magento store: it affects every single request before PHP even runs. The changes above — workers, gzip, keepalive, browser cache, microcaching, TLS tuning, and buffers — consistently yield 2–4× improvement in requests-per-second capacity on the same hardware.

Start with worker_processes auto and gzip (both zero-risk changes), then profile with a load test before adding microcaching, which requires careful cookie exclusion to avoid caching user-specific content.

The full picture: Nginx handles connections and serves static files; Varnish or Magento FPC serves full pages; Redis caches sessions and blocks; PHP-FPM processes what's left. Each layer does its job. Nginx's job is to be fast and efficient at the very edge — don't let defaults undermine the rest of your stack.