Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
NGINX for Fun & Profit
Search
Martin Loy
May 31, 2014
Technology
1
190
NGINX for Fun & Profit
slides from my talk #phpDay 2014 on Buenos Aires
Martin Loy
May 31, 2014
Tweet
Share
More Decks by Martin Loy
See All by Martin Loy
Intro to Nginx
tombar
2
200
Other Decks in Technology
See All in Technology
ウォンテッドリーのアラート設計と Datadog 移行での知見
donkomura
0
150
✨敗北解法コレクション✨〜Expertだった頃に足りなかった知識と技術〜
nanachi
1
780
AWS DDoS攻撃防御の最前線
ryutakondo
1
180
o11yツールを乗り換えた話
tak0x00
2
1.7k
データモデリング通り #2オンライン勉強会 ~方法論の話をしよう~
datayokocho
0
190
Kiro と Q Dev で 同じゲームを作らせてみた
r3_yamauchi
PRO
1
120
AWSの最新サービスでAIエージェント構築に楽しく入門しよう
minorun365
PRO
8
470
Amazon Qで2Dゲームを作成してみた
siromi
0
170
夏休みWebアプリパフォーマンス相談室/web-app-performance-on-radio
hachi_eiji
1
270
形式手法特論:位相空間としての並行プログラミング #kernelvm / Kernel VM Study Tokyo 18th
ytaka23
3
1.5k
Telemetry APIから学ぶGoogle Cloud ObservabilityとOpenTelemetryの現在 / getting-started-telemetry-api-with-google-cloud
k6s4i53rx
0
160
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
6.4k
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
A designer walks into a library…
pauljervisheath
207
24k
Adopting Sorbet at Scale
ufuk
77
9.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
Side Projects
sachag
455
43k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.4k
The Language of Interfaces
destraynor
159
25k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Transcript
for Fun & Profit #phpDay, @MartinLoy
$ whoami Martin Loy BOFH @ Batanga Media GuruHub CoFounder
CoOrganizer tech.meetup.uy meetups (devops|php|mysql) martinloy tombar martinloy
$ ls -l /nx/topics/* - nginx intro - config &&
syntax; - apache [ cache | load balancing ] - nginx + php - nginx modules - scenarios - tips
Rise up!
$ 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.
$ diff apache nginx Nginx php-fpm 5.3.3+ Configuration syntax &
Rewrite Rules Recompile to add* Apache mod_php, php-fpm .htaccess Modular (a2enmod)
$ 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}
//config && syntax
@ http://wiki.nginx.org/HttpCoreModule#location server { server_name *.test.com www.test.com; listen 127.0.0.1:8000; access_log
/var/log/nginx/access.log; root /var/www/test; location / { <PHP> } }
Locations
@ 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
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
$ 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
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
$ 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
NGINX + PHP
$ apropos php-fpm Alternative PHP FastCGI implementation $ yum|apt-get install
php-fpm - use listen tcp instead of socket - slow.log - App pool
$ 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
so far, so good?
@ http://wiki.nginx.org/3rdPartyModules
# 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
NGINX use cases
# 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*
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
@ 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", ' ' } ' '}';
@ 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
A/B testing
Abusing A/B testing
HTTP black boxing
@ ELK stack | http://www.elasticsearch.org/overview/
Moar questions?
We are recruiting >
[email protected]
tech.meetup.uy [ 15 november 2014, mvd UY ]
contact me @martinloy | github.com/tombar
@martinloy github.com/tombar