Helgi Þormar Þorbjörnsson
PHPTek, Chicago, 25th May, 2012
Cranking
Nginx
to 11
Slide 2
Slide 2 text
Helgi
Slide 3
Slide 3 text
Co-founded Orchestra.io
Helgi
Slide 4
Slide 4 text
Co-founded Orchestra.io
Work at EngineYard
Helgi
Slide 5
Slide 5 text
Co-founded Orchestra.io
Work at EngineYard
PEAR Developer
Helgi
Slide 6
Slide 6 text
Co-founded Orchestra.io
Work at EngineYard
PEAR Developer
From Iceland
Helgi
Slide 7
Slide 7 text
Co-founded Orchestra.io
Work at EngineYard
PEAR Developer
From Iceland
@h on Twitter
Helgi
Slide 8
Slide 8 text
Nginx
Just a web server?
Slide 9
Slide 9 text
No! It’s so much more!
Slide 10
Slide 10 text
✓ Web Server
✓ Proxy
✓ Cache
✓ Mail Proxy
✓ And more!
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
Extensible
Slide 13
Slide 13 text
Extensible
Flexible
Slide 14
Slide 14 text
Extensible
Flexible
FFFFFFast
Slide 15
Slide 15 text
Important for tweaking
Slide 16
Slide 16 text
Reload (HUP Signal)
Slide 17
Slide 17 text
Reload (HUP Signal)
‣ Reloads config
‣ Starts up new workers
‣ Old workers stop listening
‣ Finish up any work they have
Slide 18
Slide 18 text
Upgrade (USR2 Signal)
Slide 19
Slide 19 text
Upgrade (USR2 Signal)
‣ Live upgrade of Nginx executable
‣ Starts up a new Master
‣ Run in parallel
‣ Old Workers gracefully shutdown
‣ Old Master can be brought back
Slide 20
Slide 20 text
And always run configtest before
doing anything!
Slide 21
Slide 21 text
The journey to 11
Slide 22
Slide 22 text
Location Blocks
Slide 23
Slide 23 text
Foundation of most things we will do
Slide 24
Slide 24 text
Most Common Block
location / {
try_files $uri
$uri/
/index.php$is_args$args;
}
Slide 25
Slide 25 text
location /helgi/is/awesome {
return 202;
}
Slide 26
Slide 26 text
Accepts Regex
Done by adding ~ in front of the regular expression
Slide 27
Slide 27 text
Accepts Regex
# deny access to all .dot-files
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
# deny access to all backups
location ~ ~$ {
access_log off;
log_not_found off;
deny all;
}
Slide 28
Slide 28 text
Error Pages
Slide 29
Slide 29 text
Basic Custom 404
error_page 404 /errors/404.html;
Slide 30
Slide 30 text
Basic Custom 404
error_page 404 /errors/404.html;
Requires /errors/404.html to be
in the document root
Responsible for all if statements, file
exists checks, returns and more.
Slide 47
Slide 47 text
Can work with most Nginx variables
such as http_cookie, user agent, uri
and countless others.
Slide 48
Slide 48 text
last
break
redirect
permanent
Slide 49
Slide 49 text
last
break
redirect
permanent
Finish rewrite and evaluates
all rewrites again
Slide 50
Slide 50 text
last
break
redirect
permanent
Finish rewrite and evaluates
all rewrites again
Finish rewrite does no further
rewrite processing
Slide 51
Slide 51 text
last
break
redirect
permanent
Finish rewrite and evaluates
all rewrites again
Finish rewrite does no further
rewrite processing
Returns a 302 on the rewrite
Slide 52
Slide 52 text
last
break
redirect
permanent
Finish rewrite and evaluates
all rewrites again
Finish rewrite does no further
rewrite processing
Returns a 302 on the rewrite
Returns a 301 on the rewrite
Slide 53
Slide 53 text
last
break
redirect
permanent
Finish rewrite and evaluates
all rewrites again
Finish rewrite does no further
rewrite processing
Returns a 302 on the rewrite
Returns a 301 on the rewrite
Slide 54
Slide 54 text
Forward Domains
How to send www.helgi.ws to helgi.ws
Slide 55
Slide 55 text
server {
server_name www.helgi.ws;
rewrite ^/(.*)$ helgi.ws/$1 permanent;
}
Forward Domains
How to send www.helgi.ws to helgi.ws
Slide 56
Slide 56 text
server {
server_name www.helgi.ws;
rewrite ^/(.*)$ helgi.ws/$1 permanent;
}
server {
server_name www.helgi.ws;
rewrite ^ helgi.ws$request_uri permanent;
}
Forward Domains
How to send www.helgi.ws to helgi.ws
Slide 57
Slide 57 text
server {
server_name www.helgi.ws;
rewrite ^/(.*)$ helgi.ws/$1 permanent;
}
server {
server_name www.helgi.ws;
rewrite ^ helgi.ws$request_uri permanent;
}
Forward Domains
How to send www.helgi.ws to helgi.ws
Slide 58
Slide 58 text
Forward Domains
server {
server_name www.helgi.ws;
return 301 $scheme://helgi.ws$request_uri;
}
The Correct Way™
# set input headers
location /foo {
more_set_input_headers 'Host: ShoelessJoes';
more_set_input_headers -t 'text/plain' 'X-Tek: bah';
}
# replace input header X-Tek *only* if it already exists
more_set_input_headers -r 'X-Tek: howdy';
Slide 90
Slide 90 text
Load Balaning
Slide 91
Slide 91 text
upstream web_workers {
server www1.example.com;
server www2.example.com;
server www3.example.com;
server www4.example.com;
}
Simple Round Robin
Slide 92
Slide 92 text
upstream web_workers {
ip_hash;
server www1.example.com;
server www2.example.com;
server www3.example.com;
server www4.example.com;
}
Consistent IP Routing
Slide 93
Slide 93 text
upstream web_workers {
server www1.example.com;
server www2.example.com weight=2 max_fails=2 fail_timeout=15;
server www3.example.com weight=4 max_fails=3;
server www4.example.com weight=4 max_fails=4 fail_timeout=20;
keepalive 8;
}
Different Weights
weight and ip_hash don’t mix.