Slide 1

Slide 1 text

Helgi Þormar Þorbjörnsson PHP UK, London, 2013 Cranking Nginx To 11 Friday, 22 February 13

Slide 2

Slide 2 text

Co-founded Orchestra.io Work at EngineYard PEAR Developer From Iceland @h on Twitter Helgi Friday, 22 February 13

Slide 3

Slide 3 text

Nginx Just a web server? Friday, 22 February 13

Slide 4

Slide 4 text

✓ Web Server ✓ Proxy ✓ Cache ✓ Mail Proxy ✓ And more! No! It’s so much more! Friday, 22 February 13

Slide 5

Slide 5 text

Important for tweaking Friday, 22 February 13

Slide 6

Slide 6 text

Always run configtest before doing anything! Friday, 22 February 13

Slide 7

Slide 7 text

Reload (HUP Signal) Friday, 22 February 13

Slide 8

Slide 8 text

Reload (HUP Signal) ‣ Reloads config ‣ Starts up new workers ‣ Old workers stop listening ‣ Finish up any work they have Friday, 22 February 13

Slide 9

Slide 9 text

Upgrade (USR2 Signal) Friday, 22 February 13

Slide 10

Slide 10 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 Friday, 22 February 13

Slide 11

Slide 11 text

Requires --with-debug during build time error_log /path/to/log debug; Debugging Friday, 22 February 13

Slide 12

Slide 12 text

events { debug_connection 1.2.3.4; debug_connection 1.2.3.0/24; } Connection Specific Friday, 22 February 13

Slide 13

Slide 13 text

Rewrite Log entries are notice level rewrite_log on; error_log /path/to/log notice; Debug Rewrite Rules Friday, 22 February 13

Slide 14

Slide 14 text

Rewrite Module Friday, 22 February 13

Slide 15

Slide 15 text

Regex (PCRE) Friday, 22 February 13

Slide 16

Slide 16 text

Responsible for all if statements, file exists checks, returns and more. Friday, 22 February 13

Slide 17

Slide 17 text

Can work with most Nginx variables such as $http_cookie, $user_agent, $uri and countless others. Friday, 22 February 13

Slide 18

Slide 18 text

The power of SET Text set $helgi “Hi”; Friday, 22 February 13

Slide 19

Slide 19 text

Forward Domains server { server_name www.helgi.ws; return 301 $scheme://helgi.ws$request_uri; } Friday, 22 February 13

Slide 20

Slide 20 text

Load Balancing Friday, 22 February 13

Slide 21

Slide 21 text

upstream web_workers { server www1.example.com; server www2.example.com; server www3.example.com; server www4.example.com; } Simple Round Robin Friday, 22 February 13

Slide 22

Slide 22 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 Friday, 22 February 13

Slide 23

Slide 23 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 can work together in Nginx 1.3.1+ Friday, 22 February 13

Slide 24

Slide 24 text

Cache Friday, 22 February 13

Slide 25

Slide 25 text

http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_cache_path /dev/shm/nginx levels=1:2 keys_zone=my-cache:8m max_size=2g inactive=600m; proxy_temp_path /dev/shm/nginx/tmp; proxy_cache_use_stale updating; server { location / { proxy_pass http://example.net; proxy_cache my-cache; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; } } } Friday, 22 February 13

Slide 26

Slide 26 text

Headers Friday, 22 February 13

Slide 27

Slide 27 text

add_header add_header Set-Cookie "_orchestra=1; Max-Age=2; Path=/"; Friday, 22 February 13

Slide 28

Slide 28 text

expires location ~* ^.+\.(jpg|js|jpeg|png)$ { expires 1h; } Friday, 22 February 13

Slide 29

Slide 29 text

Modules Friday, 22 February 13

Slide 30

Slide 30 text

cd /path/to/your/nginx/source ./configure --add-module=/usr/local/nginx/mod/headers-more/ make make install How to compile modules into nginx Friday, 22 February 13

Slide 31

Slide 31 text

wiki.nginx.org/NginxHttpHeadersMoreModule Introducing Friday, 22 February 13

Slide 32

Slide 32 text

more_set_headers 'Server: My-Temple'; # set and clear output headers location /bar { more_set_headers 'X-MyHeader: blah' 'X-MyHeader2: foo'; more_set_headers -t 'text/plain text/css' 'Content-Type: text/foo'; more_set_headers -s '400 404 500 503' -s 413 'Foo: Bar'; more_clear_headers 'Transfer-Encoding' 'Content-Type'; } # set output headers location /type { more_set_headers 'Content-Type: text/plain'; } Friday, 22 February 13

Slide 33

Slide 33 text

# set input headers location /foo { more_set_input_headers 'Host: London'; more_set_input_headers -t 'text/plain' 'X-PHP-UK: bah'; } # replace input header X-PHP-UK *only* if it already exists more_set_input_headers -r 'X-PHP-UK: howdy'; Friday, 22 February 13

Slide 34

Slide 34 text

Blue Sky thinking! Friday, 22 February 13

Slide 35

Slide 35 text

Memcache Friday, 22 February 13

Slide 36

Slide 36 text

Nginx PHP Memcache Request Flow Friday, 22 February 13

Slide 37

Slide 37 text

Nginx PHP Memcache SET GET Friday, 22 February 13

Slide 38

Slide 38 text

location / { if ($request_method != GET) { rewrite . @fallback last; } # append an extenstion for proper MIME type detection if ($args ~* format=json) { rewrite ^/$uri/?(.*)$ /$uri.json$1 break; } if ($args ~* format=xml) { rewrite ^/$uri/?(.*)$ /$uri.xml$1 break; } if ($args ~* format=html) { default_type text/html; add_header "Content" "text/html; charset=utf8"; charset utf-8; } set $memcached_key "$uri?$args"; memcached_pass 127.0.0.1:2211; error_page 500 404 405 = @fallback; } location @fallback { /* pass to FastCGI */ } Friday, 22 February 13

Slide 39

Slide 39 text

set $memcached_key "$uri?$args"; memcached_pass 127.0.0.1:2211; error_page 500 404 405 = @fallback; Friday, 22 February 13

Slide 40

Slide 40 text

Set Misc Module http://wiki.nginx.org/HttpSetMiscModule Friday, 22 February 13

Slide 41

Slide 41 text

Provides various extras for the rewrite module Friday, 22 February 13

Slide 42

Slide 42 text

location /beer { set $amount $arg_amount; set_if_empty $amount 9999; } /beer?amount=12 /beer?amount= Friday, 22 February 13

Slide 43

Slide 43 text

location /beer { set $amount $arg_amount; set_if_empty $amount 9999; set_unescape_uri $name $amount; set_quote_sql_str $quoted_name $name; } Friday, 22 February 13

Slide 44

Slide 44 text

And more! set_md5 set_sha1 set_encode_base64 set_decode_base64 set_hmac_sha1 set_random set_secure_random_alphanum and more Friday, 22 February 13

Slide 45

Slide 45 text

MySQL Friday, 22 February 13

Slide 46

Slide 46 text

drizzle-nginx-module http://wiki.nginx.org/HttpDrizzleModule Friday, 22 February 13

Slide 47

Slide 47 text

upstream mysql_backend { drizzle_server 127.0.0.1:3306 dbname=test password=some_pass user=web charset=utf8 protocol=mysql; } Friday, 22 February 13

Slide 48

Slide 48 text

location /secret { set_unescape_uri $name $arg_name; set_quote_sql_str $quoted_name $name; drizzle_query "INSERT INTO agents (name) VALUES ($quoted_name)"; drizzle_pass mysql_backend; } Friday, 22 February 13

Slide 49

Slide 49 text

http://wiki.nginx.org/HttpFormInputModule Nginx doesn’t expose POST as a variable Friday, 22 February 13

Slide 50

Slide 50 text

location /secret { set_unescape_uri $name $arg_name; set_quote_sql_str $quoted_name $name; drizzle_query "SELECT * FROM agents WHERE name = $quoted_name"; drizzle_pass mysql_backend; } Friday, 22 February 13

Slide 51

Slide 51 text

Does not output JSON by default Friday, 22 February 13

Slide 52

Slide 52 text

JSON + CSV Output Friday, 22 February 13

Slide 53

Slide 53 text

https://github.com/agentzh/rds-json-nginx-module https://github.com/agentzh/rds-csv-nginx-module Friday, 22 February 13

Slide 54

Slide 54 text

location /secret { set_unescape_uri $name $arg_name; set_quote_sql_str $quoted_name $name; drizzle_query "SELECT * FROM agents where name = $quoted_name"; drizzle_pass mysql_backend; rds_json on; } Friday, 22 February 13

Slide 55

Slide 55 text

Questions? @h [email protected] Please rate at joind.in/8042 Friday, 22 February 13