Slide 1

Slide 1 text

5 things you didn’t know NGINX could do Sarah Novotny Nginx, Inc.

Slide 2

Slide 2 text

Many people know NGINX as an HTTP request and load balancing server that powers many of the world's busiest websites. But, there are a lot of ancillary pieces that go into the software to make it a whole web application accelerator.

Slide 3

Slide 3 text

What is NGINX? Internet N Web Server Serve content from disk Application Server FastCGI, uWSGI, Passenger… Proxy Caching, Load Balancing… HTTP traffic

Slide 4

Slide 4 text

146,000,000 Websites NGINX Accelerates

Slide 5

Slide 5 text

Advanced Features þ Bandwidth Management þ Content-based Routing þ Request Manipulation þ Response Rewriting þ Application Acceleration þ SSL and SPDY termination þ Authentication þ Video Delivery þ Mail Proxy þ GeoLocation þ Performance Monitoring þ High Availability

Slide 6

Slide 6 text

23% Top 1 million websites 39% Top 10,000 websites

Slide 7

Slide 7 text

Some  things  you  might  not  know     Form   spamming   Compress   assets   Thread   exhaus8on   Rewrite   content   Online   upgrades   Configure   flags   A/B  tes8ng   Include   direc8ve   Manipulate   proxy   headers  

Slide 8

Slide 8 text

Some  things  you  might  not  know     Compress assets for delivery Stop form spamming Protect Apache from thread exhaustion attacks Rewrite content inline Online upgrades Configure flags

Slide 9

Slide 9 text

Compress data to reduce bandwidth •  Reduce  bandwidth  requirements  per  client   – Content  Compression  reduces  text  and  HTML   – Image  resampling  reduces  image  sizes  

Slide 10

Slide 10 text

HTTP gzip module •  Provides Gzip capabilities so that responses from NGINX are compressed to reduce file size •  Directives can be used in the http, server and location contexts •  Key directives –  gzip –  gzip_types –  gzip_proxied

Slide 11

Slide 11 text

Gzip example Enable gzip gzip on;   Apply gzip for text, html and CSS gzip_types text/plain text/html text/css; Enable gzip compression for any proxied request gzip_proxy any; It is not advisable to enable gzip for binary content types such as images, word documents or videos

Slide 12

Slide 12 text

HTTP image filter •  Provides inline image manipulation to transform images for optimal delivery •  Directives can be used in the location context •  Key directives –  image_filter size; –  image_filter resize width height; –  image_filter crop width height;

Slide 13

Slide 13 text

HTTP image filter example location /img/ { proxy_pass http://backend; image_filter resize 150 100; image_filter rotate 90; error_page 415 = /empty; } location = /empty { empty_gif; }

Slide 14

Slide 14 text

We talk about the ‘N second rule’: –  10 seconds (Jakob Nielsen, March 1997) –  8 seconds (Zona Research, June 2001) –  4 seconds (Jupiter Research, June 2006) –  3 seconds (PhocusWright, March 2010)

Slide 15

Slide 15 text

Stop brute force retries •  Stop brute force password attacks •  Stop form spamming – Use the NGINX limit request module

Slide 16

Slide 16 text

HTTP limit req module •  Allows granular control of request processing rate •  Directives an be used in http, server and location contexts •  Key directives –  limit_req_zone –  limit_req

Slide 17

Slide 17 text

HTTP limit req module http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; … server { … location /search/ { limit_req zone=one burst=5; } } }

Slide 18

Slide 18 text

Protect Apache from thread exhaustion attacks •  Use NGINX in front of Apache •  Mitigates ‘slow loris’, ‘keep dead’ and ‘front page of hacker news’ attacks

Slide 19

Slide 19 text

What is thread exhaustion? hJp  process   hJp  process   hJp  process   hJp  process   hJp  process   hJp  process   hJp  process   Client-side: Multiple Connections HTTP Keepalives Server-side: Limited concurrency

Slide 20

Slide 20 text

How  NGINX  mi8gates  thread   exhaus8on   N Large  numbers  of  clients,    with  long-­‐term  keepalive  connec8ons   NGINX  reduces  connec8ons   to  the  minimum  number   necessary  

Slide 21

Slide 21 text

Rewrite content inline •  Use the power of substitution to simplify updates •  Directives can be used in the http, server and location contexts •  Key directives –  sub_filter_once –  sub_filter –  sub_filter_types

Slide 22

Slide 22 text

HTTP sub filter example location / { sub_filter_once off; sub_filter_types text/html; sub_filter “__copyright_date__” “2014”; }

Slide 23

Slide 23 text

Online Binary updates and configuration changes •  Update either the configuration files or the binary without losing any connections

Slide 24

Slide 24 text

Configuration file update [root@localhost ~]# nginx -s reload [root@localhost ~]#

Slide 25

Slide 25 text

Yep. It’s that simple

Slide 26

Slide 26 text

Binary Upgrade [root@localhost ~]# cat /var/run/nginx.pid 1991 [root@localhost ~]# kill –USR2 1991 •  Choose your method of binary installation •  Replace the binary

Slide 27

Slide 27 text

Binary Upgrade [root@localhost ~]# ps -ef |grep nginx root 1991 1 0 08:06 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 2974 1991 0 08:22 ? 00:00:00 nginx: worker process nginx 2975 1991 0 08:22 ? 00:00:00 nginx: worker process root 3123 2948 0 08:43 pts/0 00:00:00 grep nginx root 3124 1991 0 08:43 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

Slide 28

Slide 28 text

Binary Upgrade [root@localhost ~]# kill –WINCH 1991 [root@localhost ~]# kill –QUIT 1991 •  Verify things are working as expected (you can still back out gracefully at this point)

Slide 29

Slide 29 text

nginx –V gives a nearly complete configuration script for compiling Configure Flags

Slide 30

Slide 30 text

[root@localhost ~]# nginx -V! nginx version: nginx/1.5.7! built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ! TLS SNI support enabled! configure arguments: --prefix=/etc/nginx/ --sbin-path=/usr/sbin/ nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/ nginx/error.log --http-log-path=/var/log/nginx/access.log --pid- path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http- client-body-temp-path=/var/cache/nginx/client_temp --http-proxy- temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/ var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/ nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with- http_spdy_module --with-http_realip_module --with- http_addition_module --with-http_sub_module --with-http_dav_module! --etc!

Slide 31

Slide 31 text

A/B  tes8ng   Internet N Content A HTTP traffic Content B

Slide 32

Slide 32 text

Split  Clients  Module   http { split_clients "${remote_addr}AAA" $variant { 0.5% .A; 2.0% .B; * "”; } server { location / { index index${variant}.html;

Slide 33

Slide 33 text

Measurement     and  analysis  is  leQ  as     an  exercise  to  the     reader        

Slide 34

Slide 34 text

Include  Direc8ve   •  Includes files •  Directives can be used in the any context •  Key directives – include

Slide 35

Slide 35 text

HTTP include example http {! ! !include /etc/nginx/conf.d/mime.types;! ! !include /etc/nginx/conf.d/*.conf;! ! !include /etc/nginx/sites-enabled/*;! }

Slide 36

Slide 36 text

Manipulate proxy headers •  Mask  content  source  (like  assets  in  S3)   •  Manage  proxy  behavior   •  Inject  your  own  headers  (host  header  or  x-­‐ forward-­‐for  etc)  

Slide 37

Slide 37 text

Proxy  Header  Manipula8on   •  Allows perception management of content delivery through headers •  Directives can be used in the http, server and location contexts •  Key directives –  proxy_hide_header –  proxy_set_header –  proxy_ignore_header

Slide 38

Slide 38 text

Proxy hide header example location / { proxy_pass http://your_bucket.s3.amazonaws.com; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-meta-s3fox-filesize; proxy_hide_header x-amz-request-id; proxy_hide_header x-amz-meta-s3fox-modifiedtime; ... }

Slide 39

Slide 39 text

Proxy set header example location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; ... }

Slide 40

Slide 40 text

Proxy ignore header example location / { proxy_pass http://localhost:8000; proxy_ignore_header X-Accel-Limit-Rate; proxy_ignore_header X-Accel-Expires; ... }

Slide 41

Slide 41 text

More resources •  Check out our blog on nginx.com •  Webinars: nginx.com/webinars Try: NGINX F/OSS (nginx.org) NGINX Plus (nginx.com)

Slide 42

Slide 42 text

Thanks for your time! @sarahnovotny Evangelist, NGINX Program Chair, OSCON