Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NGINX for Fun & Profit

NGINX for Fun & Profit

slides from my talk #phpDay 2014 on Buenos Aires

Martin Loy

May 31, 2014
Tweet

More Decks by Martin Loy

Other Decks in Technology

Transcript

  1. $ whoami Martin Loy BOFH @ Batanga Media GuruHub CoFounder

    CoOrganizer tech.meetup.uy meetups (devops|php|mysql) martinloy tombar martinloy
  2. $ ls -l /nx/topics/* - nginx intro - config &&

    syntax; - apache [ cache | load balancing ] - nginx + php - nginx modules - scenarios - tips
  3. $ apropos nginx - Small, powerful, scalable web|proxy server. -

    Russian engineering. - BSD license. - Market Share 14.3% | 38% top 1000 websites - It's pronounced “engine X” - Also an e-mail (imap|pop3) proxy.
  4. $ diff apache nginx Nginx php-fpm 5.3.3+ Configuration syntax &

    Rewrite Rules Recompile to add* Apache mod_php, php-fpm .htaccess Modular (a2enmod)
  5. $ man nginx.conf 3 main contexts http | server |

    location variables and methods are lowercases and only support a-z and underscore set $var foo; set_header X-Example bar; http://wiki.nginx.org/Http{X}Module#{method}
  6. @ http://wiki.nginx.org/HttpCoreModule#location location = /admin { ... } /admin location

    / { ... } /index.html /example/test.html /match.any location /docs { ... } /docs/example.html location ^~ /images { ... } /images/avatar.gif location ~* (jpg|gif|png) { ... } /docs/1.gif
  7. location ~* (jpg|png|gif) { rewrite ^ http://disney.com? permanent; } location

    / { if ($geoip_city_country_code = "AR") { rewrite ^/$ http://example.org/ar redirect; } try_files $uri $uri/ /index.php?$args; } $ locations > mod_rewrite
  8. $ Proxy Module location /paso-todo-para-apache { include /etc/nginx/proxy_params proxy_set_header Host

    $host; proxy_pass http://myBackend/app; proxy_redirect /app /; proxy_read_timeout 30s; } @ http://wiki.nginx.org/HttpProxyModule
  9. location /cache-2hs-los-pedidos { proxy_pass http://myBackend; proxy_cache_valid 200 301 302 2h;

    proxy_cache_valid any 1m; proxy_cache_bypass $nocache_cookie; proxy_cache_key "$host$uri$args"; proxy_ignore_headers Cache-Control; } proxy_cache_use_stale error | timeout | updating | http_500 | http_502 | http_503 | http_404 Caching with nginx
  10. $ Upstream Module upstream myBackendFarm { server 10.0.1.1 weight=2 down;

    server 10.0.1.2 weight=10 keepalive=5; server unix:/path/to/socket server 10.0.1.4 max_fails=3 fail_timeout=5s; server 10.0.1.5 backup; [ fair | hash | sticky | + ] } @ http://wiki.nginx.org/HttpUpstreamModule
  11. $ apropos php-fpm Alternative PHP FastCGI implementation $ yum|apt-get install

    php-fpm - use listen tcp instead of socket - slow.log - App pool
  12. $ nginx + php location ~ \.php$ { include /etc/nginx/fastcgi_params

    fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; fastcgi_pass phpBackend; } @ http://wiki.nginx.org/PHPFcgiExample
  13. # Cache Backends redis, memcache, mongo, purge # Security mod_security,

    naxsi, http pam # Media image filter, mp4, thumb extractor # Misc php, form parser, rdd, download $ ls -l /nx/3rdPartyMods/* # Optimizers pagespeed, css, js min # Monitoring statsd, sflow, syslog # Real FUN ! lua, perl, python, javascript, ruby # more awesomeness openresty, upload, push/comet
  14. # per user cache proxy_cache_key "$user_cookie$host$uri"; # per country cache

    proxy_cache_key "$geoip_city_country_code$host$uri"; proxy_cache_use_stale error | timeout | updating | http_500 | http_502 | http_503 | http_404 # remote caching proxy_pass https://api.remote.provider.com; $ ls -l /nx/scenarios/cache*
  15. log_format multidomain-multiproxy-geoip $host - { combined apache log format }

    - Cache: $upstream_cache_status $upstream_status $upstream_response_time $upstream_addr - Geo: $geoip_city_country_code $geoip_region $ ls -l /nx/scenarios/logging
  16. @ http://wiki.nginx.org/HttpLogModule#log_format log_format json_log '{' '"host": "$host", ' '"remote_addr": "$remote_addr",

    ' '"remote_user": "$remote_user", ' '"postdata": {' '"request_body": "$request_body", ' '"request_completion":"$request_completion"' ' },' '"cookie": {' '"userid": "$cookie_userid", ' ' } ' '}';
  17. @ nginx fastcgi_param request_uuid $request_id; @ php-fpm /etc/php5/fpm/pool/default access.format =

    … %{request_uuid}o ... @ php echo $ _SERVER["request_uuid"]; @ mysql -- uuid: {$request_uuid} $ ls -l /nx/scenarios/tracking