SlideShare a Scribd company logo
Nginx and friends
aka 'Adding a turbo button to your site'




                                             Wim Godden
                                           Cu.be Solutions
Who am I ?
Wim Godden (@wimgtr)
Owner of Cu.be Solutions (http://cu.be)
Open source developer since 1997
Developer of OpenX
Zend Certified Engineer
Zend Framework Certified Engineer
MySQL Certified Developer
Who are you ?
Developers ?
System/network engineers ?
Managers ?
The Microsoft box
What's outside the box ?
Operating systems ?
Database servers ?
Webservers ?
Reverse proxies ?
Website X

                          Header


                               Latest news




                    Article content page

       Navigation
                              Article content
What is caching ?

                                             x = 5, y = 2
                                                             Same result
                                                n = 50




                                                                             CACHE


 select
       *
 from
       article
              join user                                     Doesn't change
              on article.user_id = user.id                    all the time
 order by
       created desc
 limit
       10
Caching storage - Memcache(d)
Facebook, Twitter, YouTube, … → need we say more ?
Distributed memory caching system
Multiple machines ↔ 1 big memory-based hash-table
Key-value storage system
  Keys - max. 250bytes
  Values - max. 1Mbyte
Caching storage - Memcache(d)
Facebook, Twitter, YouTube, … → need we say more ?
Distributed memory caching system
Key-value storage system
   Keys - max. 250bytes
   Values - max. 1Mbyte
Extremely fast... non-blocking, UDP (!)
Memcache - installation & running it
Installation
   Distribution package
   PECL
   Windows : binaries
Running
   No config-files
   memcached -d -m <mem> -l <ip> -p <port>
   ex. : memcached -d -m 2048 -l 172.16.1.91 -p 11211
Caching storage - Memcache - some notes
Not fault-tolerant
   It's a cache !
   Lose session data
   Lose shopping cart data
   ...
Caching storage - Memcache - some notes
Not fault-tolerant
   It's a cache !
   Lose session data
   Lose shopping cart data
   …
Firewall your Memcache port !
Memcache in code
Initialization :
MemcachedClient.Setup("MyCache", new string[]{ "server1.example.com", "server2.example.com"});


Usage :
MemcachedClient cache = MemcachedClient.GetInstance("MyCache");


string myData = cache.Get("myKey") as string;
if (myData == null) {             Miss
    myData = GetMyDataFromDB();
    cache.Set("myKey", myData);
}
// Use myData
Memcache slabs
            (or why Memcache says it's full when it's not)

Multiple slabs of different sizes :
   Slab 1 : 400 bytes
   Slab 2 : 480 bytes (400 * 1.2)
   Slab 3 : 576 bytes (480 * 1.2) (and so on...)
Multiplier (1.2 here) can be configured
Store a lot of very large objects
→ Large slabs : full
→ Rest : free
→ Eviction of data !
Memcache - Is it working ?
Connect to it using telnet               STAT pid 2941
                                         STAT uptime 10878
                                         STAT time 1296074240
   "stats" command →                     STAT version 1.4.5
                                         STAT pointer_size 64
                                         STAT rusage_user 20.089945
   Use Cacti or other monitoring tools   STAT rusage_system 58.499106
                                         STAT curr_connections 16
                                         STAT total_connections 276950
                                         STAT connection_structures 96
                                         STAT cmd_get 276931
                                         STAT cmd_set 584148
                                         STAT cmd_flush 0
                                         STAT get_hits 211106
                                         STAT get_misses 65825
                                         STAT delete_misses 101
                                         STAT delete_hits 276829
                                         STAT incr_misses 0
                                         STAT incr_hits 0
                                         STAT decr_misses 0
                                         STAT decr_hits 0
                                         STAT cas_misses 0
                                         STAT cas_hits 0
                                         STAT cas_badval 0
                                         STAT auth_cmds 0
                                         STAT auth_errors 0
                                         STAT bytes_read 613193860
                                         STAT bytes_written 553991373
                                         STAT limit_maxbytes 268435456
                                         STAT accepting_conns 1
                                         STAT listen_disabled_num 0
                                         STAT threads 4
                                         STAT conn_yields 0
                                         STAT bytes 20418140
                                         STAT curr_items 65826
                                         STAT total_items 553856
                                         STAT evictions 0
                                         STAT reclaimed 0
Website X – news is changing !

                           Header


                                Latest news




                     Article content page

        Navigation
                               Article content
cache.Delete("Latest-news")
Updating data
Updating data




                LCD_Popular_Product_List
Adding/updating data

cache.Delete("LCD_Popular_Product_List")
Adding/updating data
Adding/updating data - Why it crashed
Adding/updating data - Why it crashed
Adding/updating data - Why it crashed
Cache stampeding
Cache stampeding
Memcache code ?


    Memcache code




     Visitor interface        Admin interface




                         DB
Cache warmup scripts
Used to fill your cache when it's empty
Run it before starting Webserver !

2 ways :
   Visit all URLs
       Error-prone
       Hard to maintain
   Call all cache-updating methods




                 Make sure you have a warmup script !
Cache stampeding - what about locking ?
Seems like a nice idea, but...
While lock in place
What if the process that created the lock fails ?
Website X

                          Header


                               Latest news




                    Article content page

       Navigation
                              Article content
Website X

                          Header
                        (TTL = 2h)


                               Latest news




                    Article content page
       Navigation
       (TTL = 2h)
                              Article content
Website X

                          Header
                        (TTL = 2h)


                         Latest news (TTL = 2m)




                    Article content page
       Navigation
       (TTL = 2h)
                       Article content (TTL = 15m)
Move the cache
Varnish
Not just a load balancer
Reverse proxy cache / http accelerator / …
Caches (parts of) pages in memory
Varnish - ESI

                                                In your article page output :
             Header (TTL : 60 min)
                                                <esi:include src="/top"/>
                     /top
                                                <esi:include src="/nav"/>
             Latest news (TTL : 2 min) /news    <esi:include src="/news"/>
                                                <esi:include src="/article/732"/>


Navigation    Article content page
  (TTL :                                        In your Varnish config :
 60 min)       Article content (TTL : 15 min)   sub vcl_fetch {
   /nav                  /article/732              if (req.url == "/news") {
                                                       esi; /* Do ESI processing */
                                                       set obj.ttl = 2m;
                                                   } elseif (req.url == "/nav") {
                                                       esi;
                                                       set obj.ttl = 1h;
                                                   } elseif ….
                                                ….
                                                }
A simple benchmark – 2KByte JPEG




         Apache 2.2    4210
         IIS 7.5       3960
         Varnish 3.0   11400
A dynamically generated, but static page




     Apache 2.2 + PHP (3 DB queries)   18
     IIS 7.5 + .Net (3 DB queries)     16
     Varnish 3.0                       11400
Varnish - what can/can't be cached ?
Can :
   Static pages
   Images, js, css
   Static parts of pages that don't change often (ESI)
Can't :
   POST requests
   Very large files (it's not a file server !)
   Requests with Set-Cookie
   User-specific content
ESI → no caching on user-specific content ?

                                           Logged in as : Wim Godden
                 TTL = 0s ?
                                                          5 messages




      TTL=1h                  TTL = 5min
Dynamic content
Request         Varnish                     Ideally
user X : /top   /top request to webserver   same
user Y : /top   /top request to webserver   same
user X : /top   /top request to webserver   if unchanged : served from cache
user Y : /top   /top request to webserver   if unchanged : served from cache
Nginx
Web server
Reverse proxy
Lightweight, fast
12.2% of all Websites
Nginx
No threads, event-driven
Uses epoll / kqueue
Low memory footprint

10000 active connections = normal
Coming to Nginx soon...

                                 Logged in as : Wim Godden

                                                5 messages




       Menu               NEWS
Coming to Nginx soon...

                      <esim:include src="/top" session="1" ttl="1h" />




      <esim:include
      src="/menu"                         <esim:include src="/news" ttl="5m" />
      ttl="1h" />
Requesting /page (1st time)




                   Nginx
                                              1
                                          3
                      Shared memory
                                  /page       2
                           4
                               /page
Requesting /page ESI subrequests (1st time)




                  Nginx
                                              1


                                              2
                          3
                              /menu
                              /news
                              /top ($sessionid$)
Requesting /page (next time)




                  Nginx
                                         1
                     Shared memory
                                 /page

                          2
                              /page
                              /menu
                              /news
                              /top ($sessionid$)
New message arrives...



                          POST /send

                               o   ...   se
                           i nt               t(.
                      e rt                       ..)
                   ins



              DB



                         top ($sessionid$)
Advantages
No repeated hits to webserver anymore !
   Only the initial hit (unless you pre-heat/warm up the cache !)
   No hits for user-specific content
   Not even for non-specific content
News added



                  addnews() method

                              o   ...      se
                          i nt                  t(.
                     e rt                          ..)
                  ins



             DB



                                        /news
Advantages
No repeated hits to webserver anymore !
   Only the initial hit (unless you pre-heat/warm up the cache !)
   Not for user-specific content
   Not even for non-specific content
       No TTLs for non-specific content
       Imagine doing it for the bid status on Ebay items ;-)
How many Memcache requests ?

                                                                         Logged in as : Wim Godden
        <esim:include src="/top" session="1" ttl="1h" />
                                                                                        5 messages




     <esim:include
     src="/menu"                              <esim:include src="/news" ttl="5m" />
     ttl="1h" />
Why Nginx ?
Native Memcache support
Excellent and superfast subrequest system
   Including parallel subrequests
Handles thousands of connections per worker
   With minimal memory footprint
What's the result ?
Figures
First customer :
   No. of web servers : 18 → 4
   No. of db servers : 6 → 2
   Total : 24 → 6 (75% reduction !)
Second customer (already using Nginx + Memcache) :
   No. of web servers : 72 → 8
   No. of db servers : 15 → 4
   Total : 87 → 12 (86% reduction !)
Availability
Stable at 2 customers
Still under heavy development
Beta : July 2012
Final : Sep 2012
So...
So...
There's life outside the MS-box
   And it's pretty awesome ;-)
Need caching in .Net (for DB queries, config-files, etc.) ?
   Memcache
   Velocity ?
Caching static pages
   → Varnish with ESI
Caching for authenticated users
   → Nginx with Dynamic ESI


There's a lot more outside the box
   → Maybe some other time ;-)
Questions ?
Questions ?
Contact
Twitter    @wimgtr
Web       http://techblog.wimgodden.be
Slides        http://www.slideshare.net/wimg
E-mail        wim.godden@cu.be
Thanks !

        Please rate my talk :
http://speakerrate.com/talks/11081

More Related Content

ODP
When dynamic becomes static: the next step in web caching techniques
ODP
Beyond PHP - it's not (just) about the code
ODP
Remove php calls and scale your site like crazy !
ODP
Caching and tuning fun for high scalability @ FrOSCon 2011
ODP
Beyond php - it's not (just) about the code
ODP
Beyond php - it's not (just) about the code
ODP
Caching and tuning fun for high scalability @ PHPTour
ODP
Beyond php - it's not (just) about the code
When dynamic becomes static: the next step in web caching techniques
Beyond PHP - it's not (just) about the code
Remove php calls and scale your site like crazy !
Caching and tuning fun for high scalability @ FrOSCon 2011
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
Caching and tuning fun for high scalability @ PHPTour
Beyond php - it's not (just) about the code

What's hot (20)

PDF
eZ Publish Caching Mechanisms
ODP
Beyond PHP - it's not (just) about the code
ODP
Workshop eZ Publish Caching Mechanisms
ODP
When dynamic becomes static: the next step in web caching techniques
PPTX
PHP 5.6 New and Deprecated Features
PDF
Introduction to Flask Micro Framework
PDF
Node.js API 서버 성능 개선기
PDF
eZ UnConference - Z Publish top-performance through mastery (and extension) o...
PDF
Memcached Presentation @757rb
PDF
Ansible loves Python, Python Philadelphia meetup
PDF
Applying profilers to my sql (fosdem 2017)
PDF
How to export import a mysql database via ssh in aws lightsail wordpress rizw...
PDF
Static Typing in Vault
PDF
Mysql 56-experiences-bugs-solutions-50mins
KEY
Site Performance - From Pinto to Ferrari
PDF
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
PDF
Pycon - Python for ethical hackers
ODP
My app is secure... I think
PPTX
Powershell Demo Presentation
PDF
More on gdb for my sql db as (fosdem 2016)
eZ Publish Caching Mechanisms
Beyond PHP - it's not (just) about the code
Workshop eZ Publish Caching Mechanisms
When dynamic becomes static: the next step in web caching techniques
PHP 5.6 New and Deprecated Features
Introduction to Flask Micro Framework
Node.js API 서버 성능 개선기
eZ UnConference - Z Publish top-performance through mastery (and extension) o...
Memcached Presentation @757rb
Ansible loves Python, Python Philadelphia meetup
Applying profilers to my sql (fosdem 2017)
How to export import a mysql database via ssh in aws lightsail wordpress rizw...
Static Typing in Vault
Mysql 56-experiences-bugs-solutions-50mins
Site Performance - From Pinto to Ferrari
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Pycon - Python for ethical hackers
My app is secure... I think
Powershell Demo Presentation
More on gdb for my sql db as (fosdem 2016)
Ad

Viewers also liked (6)

ODP
Caching and tuning fun for high scalability @ 4Developers
ODP
Caching and tuning fun for high scalability
ODP
From typing the test to testing the type
ODP
Making dynamic sites scale like static sites
ODP
Remove web calls and scale your site like crazy !
ODP
Creating fast, dynamic ACLs in Zend Framework (Zend Webinar)
Caching and tuning fun for high scalability @ 4Developers
Caching and tuning fun for high scalability
From typing the test to testing the type
Making dynamic sites scale like static sites
Remove web calls and scale your site like crazy !
Creating fast, dynamic ACLs in Zend Framework (Zend Webinar)
Ad

Similar to Nginx and friends - putting a turbo button on your site (20)

ODP
Caching and tuning fun for high scalability @ LOAD2012
ODP
Caching and tuning fun for high scalability
ODP
Caching and tuning fun for high scalability @ FOSDEM 2012
ODP
Caching and tuning fun for high scalability
ODP
Caching and tuning fun for high scalability
ODP
phptek13 - Caching and tuning fun tutorial
PDF
Advanced Cassandra
ODP
Caching and tuning fun for high scalability @ phpBenelux 2011
ODP
Caching and tuning fun for high scalability
PPTX
Building an Analytic Extension to MySQL with ClickHouse and Open Source
PPTX
Building an Analytic Extension to MySQL with ClickHouse and Open Source.pptx
PDF
Integrating best of breed open source tools to vitess orchestrator pleu21
PPTX
Vitess VReplication: Standing on the Shoulders of a MySQL Giant
PDF
How Prometheus Store the Data
PDF
Varnish in action phpuk11
PPTX
Sherlock Homepage - A detective story about running large web services - WebN...
ODP
Built-in query caching for all PHP MySQL extensions/APIs
PDF
Csw2016 wheeler barksdale-gruskovnjak-execute_mypacket
PDF
SDPHP - Percona Toolkit (It's Basically Magic)
PDF
Whatever it takes - Fixing SQLIA and XSS in the process
Caching and tuning fun for high scalability @ LOAD2012
Caching and tuning fun for high scalability
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability
Caching and tuning fun for high scalability
phptek13 - Caching and tuning fun tutorial
Advanced Cassandra
Caching and tuning fun for high scalability @ phpBenelux 2011
Caching and tuning fun for high scalability
Building an Analytic Extension to MySQL with ClickHouse and Open Source
Building an Analytic Extension to MySQL with ClickHouse and Open Source.pptx
Integrating best of breed open source tools to vitess orchestrator pleu21
Vitess VReplication: Standing on the Shoulders of a MySQL Giant
How Prometheus Store the Data
Varnish in action phpuk11
Sherlock Homepage - A detective story about running large web services - WebN...
Built-in query caching for all PHP MySQL extensions/APIs
Csw2016 wheeler barksdale-gruskovnjak-execute_mypacket
SDPHP - Percona Toolkit (It's Basically Magic)
Whatever it takes - Fixing SQLIA and XSS in the process

More from Wim Godden (20)

PDF
Beyond php - it's not (just) about the code
PDF
Bringing bright ideas to life
PDF
The why and how of moving to php 8
PDF
The why and how of moving to php 7
PDF
My app is secure... I think
PDF
My app is secure... I think
PDF
Building interactivity with websockets
PDF
Bringing bright ideas to life
ODP
Your app lives on the network - networking for web developers
ODP
The why and how of moving to php 7.x
ODP
The why and how of moving to php 7.x
ODP
Beyond php - it's not (just) about the code
ODP
My app is secure... I think
ODP
Building interactivity with websockets
ODP
Your app lives on the network - networking for web developers
ODP
My app is secure... I think
ODP
My app is secure... I think
ODP
The promise of asynchronous php
ODP
My app is secure... I think
ODP
My app is secure... I think
Beyond php - it's not (just) about the code
Bringing bright ideas to life
The why and how of moving to php 8
The why and how of moving to php 7
My app is secure... I think
My app is secure... I think
Building interactivity with websockets
Bringing bright ideas to life
Your app lives on the network - networking for web developers
The why and how of moving to php 7.x
The why and how of moving to php 7.x
Beyond php - it's not (just) about the code
My app is secure... I think
Building interactivity with websockets
Your app lives on the network - networking for web developers
My app is secure... I think
My app is secure... I think
The promise of asynchronous php
My app is secure... I think
My app is secure... I think

Recently uploaded (20)

PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
OMC Textile Division Presentation 2021.pptx
PDF
Getting Started with Data Integration: FME Form 101
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
cloud_computing_Infrastucture_as_cloud_p
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PPT
Teaching material agriculture food technology
PDF
Machine learning based COVID-19 study performance prediction
PDF
Approach and Philosophy of On baking technology
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
Spectroscopy.pptx food analysis technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Per capita expenditure prediction using model stacking based on satellite ima...
OMC Textile Division Presentation 2021.pptx
Getting Started with Data Integration: FME Form 101
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
SOPHOS-XG Firewall Administrator PPT.pptx
Unlocking AI with Model Context Protocol (MCP)
Assigned Numbers - 2025 - Bluetooth® Document
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Network Security Unit 5.pdf for BCA BBA.
cloud_computing_Infrastucture_as_cloud_p
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Teaching material agriculture food technology
Machine learning based COVID-19 study performance prediction
Approach and Philosophy of On baking technology
Univ-Connecticut-ChatGPT-Presentaion.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
NewMind AI Weekly Chronicles - August'25-Week II
Spectroscopy.pptx food analysis technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

Nginx and friends - putting a turbo button on your site

  • 1. Nginx and friends aka 'Adding a turbo button to your site' Wim Godden Cu.be Solutions
  • 2. Who am I ? Wim Godden (@wimgtr) Owner of Cu.be Solutions (http://cu.be) Open source developer since 1997 Developer of OpenX Zend Certified Engineer Zend Framework Certified Engineer MySQL Certified Developer
  • 3. Who are you ? Developers ? System/network engineers ? Managers ?
  • 5. What's outside the box ? Operating systems ? Database servers ? Webservers ? Reverse proxies ?
  • 6. Website X Header Latest news Article content page Navigation Article content
  • 7. What is caching ? x = 5, y = 2 Same result n = 50 CACHE select * from article join user Doesn't change on article.user_id = user.id all the time order by created desc limit 10
  • 8. Caching storage - Memcache(d) Facebook, Twitter, YouTube, … → need we say more ? Distributed memory caching system Multiple machines ↔ 1 big memory-based hash-table Key-value storage system Keys - max. 250bytes Values - max. 1Mbyte
  • 9. Caching storage - Memcache(d) Facebook, Twitter, YouTube, … → need we say more ? Distributed memory caching system Key-value storage system Keys - max. 250bytes Values - max. 1Mbyte Extremely fast... non-blocking, UDP (!)
  • 10. Memcache - installation & running it Installation Distribution package PECL Windows : binaries Running No config-files memcached -d -m <mem> -l <ip> -p <port> ex. : memcached -d -m 2048 -l 172.16.1.91 -p 11211
  • 11. Caching storage - Memcache - some notes Not fault-tolerant It's a cache ! Lose session data Lose shopping cart data ...
  • 12. Caching storage - Memcache - some notes Not fault-tolerant It's a cache ! Lose session data Lose shopping cart data … Firewall your Memcache port !
  • 13. Memcache in code Initialization : MemcachedClient.Setup("MyCache", new string[]{ "server1.example.com", "server2.example.com"}); Usage : MemcachedClient cache = MemcachedClient.GetInstance("MyCache"); string myData = cache.Get("myKey") as string; if (myData == null) { Miss myData = GetMyDataFromDB(); cache.Set("myKey", myData); } // Use myData
  • 14. Memcache slabs (or why Memcache says it's full when it's not) Multiple slabs of different sizes : Slab 1 : 400 bytes Slab 2 : 480 bytes (400 * 1.2) Slab 3 : 576 bytes (480 * 1.2) (and so on...) Multiplier (1.2 here) can be configured Store a lot of very large objects → Large slabs : full → Rest : free → Eviction of data !
  • 15. Memcache - Is it working ? Connect to it using telnet STAT pid 2941 STAT uptime 10878 STAT time 1296074240 "stats" command → STAT version 1.4.5 STAT pointer_size 64 STAT rusage_user 20.089945 Use Cacti or other monitoring tools STAT rusage_system 58.499106 STAT curr_connections 16 STAT total_connections 276950 STAT connection_structures 96 STAT cmd_get 276931 STAT cmd_set 584148 STAT cmd_flush 0 STAT get_hits 211106 STAT get_misses 65825 STAT delete_misses 101 STAT delete_hits 276829 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 613193860 STAT bytes_written 553991373 STAT limit_maxbytes 268435456 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 20418140 STAT curr_items 65826 STAT total_items 553856 STAT evictions 0 STAT reclaimed 0
  • 16. Website X – news is changing ! Header Latest news Article content page Navigation Article content
  • 19. Updating data LCD_Popular_Product_List
  • 22. Adding/updating data - Why it crashed
  • 23. Adding/updating data - Why it crashed
  • 24. Adding/updating data - Why it crashed
  • 27. Memcache code ? Memcache code Visitor interface Admin interface DB
  • 28. Cache warmup scripts Used to fill your cache when it's empty Run it before starting Webserver ! 2 ways : Visit all URLs Error-prone Hard to maintain Call all cache-updating methods Make sure you have a warmup script !
  • 29. Cache stampeding - what about locking ? Seems like a nice idea, but... While lock in place What if the process that created the lock fails ?
  • 30. Website X Header Latest news Article content page Navigation Article content
  • 31. Website X Header (TTL = 2h) Latest news Article content page Navigation (TTL = 2h) Article content
  • 32. Website X Header (TTL = 2h) Latest news (TTL = 2m) Article content page Navigation (TTL = 2h) Article content (TTL = 15m)
  • 34. Varnish Not just a load balancer Reverse proxy cache / http accelerator / … Caches (parts of) pages in memory
  • 35. Varnish - ESI In your article page output : Header (TTL : 60 min) <esi:include src="/top"/> /top <esi:include src="/nav"/> Latest news (TTL : 2 min) /news <esi:include src="/news"/> <esi:include src="/article/732"/> Navigation Article content page (TTL : In your Varnish config : 60 min) Article content (TTL : 15 min) sub vcl_fetch { /nav /article/732 if (req.url == "/news") { esi; /* Do ESI processing */ set obj.ttl = 2m; } elseif (req.url == "/nav") { esi; set obj.ttl = 1h; } elseif …. …. }
  • 36. A simple benchmark – 2KByte JPEG Apache 2.2 4210 IIS 7.5 3960 Varnish 3.0 11400
  • 37. A dynamically generated, but static page Apache 2.2 + PHP (3 DB queries) 18 IIS 7.5 + .Net (3 DB queries) 16 Varnish 3.0 11400
  • 38. Varnish - what can/can't be cached ? Can : Static pages Images, js, css Static parts of pages that don't change often (ESI) Can't : POST requests Very large files (it's not a file server !) Requests with Set-Cookie User-specific content
  • 39. ESI → no caching on user-specific content ? Logged in as : Wim Godden TTL = 0s ? 5 messages TTL=1h TTL = 5min
  • 40. Dynamic content Request Varnish Ideally user X : /top /top request to webserver same user Y : /top /top request to webserver same user X : /top /top request to webserver if unchanged : served from cache user Y : /top /top request to webserver if unchanged : served from cache
  • 41. Nginx Web server Reverse proxy Lightweight, fast 12.2% of all Websites
  • 42. Nginx No threads, event-driven Uses epoll / kqueue Low memory footprint 10000 active connections = normal
  • 43. Coming to Nginx soon... Logged in as : Wim Godden 5 messages Menu NEWS
  • 44. Coming to Nginx soon... <esim:include src="/top" session="1" ttl="1h" /> <esim:include src="/menu" <esim:include src="/news" ttl="5m" /> ttl="1h" />
  • 45. Requesting /page (1st time) Nginx 1 3 Shared memory /page 2 4 /page
  • 46. Requesting /page ESI subrequests (1st time) Nginx 1 2 3 /menu /news /top ($sessionid$)
  • 47. Requesting /page (next time) Nginx 1 Shared memory /page 2 /page /menu /news /top ($sessionid$)
  • 48. New message arrives... POST /send o ... se i nt t(. e rt ..) ins DB top ($sessionid$)
  • 49. Advantages No repeated hits to webserver anymore ! Only the initial hit (unless you pre-heat/warm up the cache !) No hits for user-specific content Not even for non-specific content
  • 50. News added addnews() method o ... se i nt t(. e rt ..) ins DB /news
  • 51. Advantages No repeated hits to webserver anymore ! Only the initial hit (unless you pre-heat/warm up the cache !) Not for user-specific content Not even for non-specific content No TTLs for non-specific content Imagine doing it for the bid status on Ebay items ;-)
  • 52. How many Memcache requests ? Logged in as : Wim Godden <esim:include src="/top" session="1" ttl="1h" /> 5 messages <esim:include src="/menu" <esim:include src="/news" ttl="5m" /> ttl="1h" />
  • 53. Why Nginx ? Native Memcache support Excellent and superfast subrequest system Including parallel subrequests Handles thousands of connections per worker With minimal memory footprint
  • 55. Figures First customer : No. of web servers : 18 → 4 No. of db servers : 6 → 2 Total : 24 → 6 (75% reduction !) Second customer (already using Nginx + Memcache) : No. of web servers : 72 → 8 No. of db servers : 15 → 4 Total : 87 → 12 (86% reduction !)
  • 56. Availability Stable at 2 customers Still under heavy development Beta : July 2012 Final : Sep 2012
  • 57. So...
  • 58. So... There's life outside the MS-box And it's pretty awesome ;-) Need caching in .Net (for DB queries, config-files, etc.) ? Memcache Velocity ? Caching static pages → Varnish with ESI Caching for authenticated users → Nginx with Dynamic ESI There's a lot more outside the box → Maybe some other time ;-)
  • 61. Contact Twitter @wimgtr Web http://techblog.wimgodden.be Slides http://www.slideshare.net/wimg E-mail [email protected]
  • 62. Thanks ! Please rate my talk : http://speakerrate.com/talks/11081