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
180
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
190
Other Decks in Technology
See All in Technology
Babylon.js JAPAN活動紹介 (2024/4)
limes2018
1
120
R3のコードから見る実践LINQ実装最適化・コンカレントプログラミング実例
neuecc
3
2.9k
require(ESM)とECMAScript仕様
uhyo
4
1k
Babylon.jsと色々なものを組み合わせる:ブラウザのAPIやガジェットや2D描画ライブラリなど / Babylon.js 勉強会 vol.3
you
PRO
0
180
How to Lead? Testimonial of a Lead Android Engineer
oleur
1
110
自己改善からチームを動かす! 「セルフエンジニアリングマネージャー」のすゝめ
shoota
6
1.1k
Python と Snowflake はズッ友だょ!~ Snowflake の Python 関連機能をふりかえる ~
__allllllllez__
2
140
令和最新版 Ruby プロファイラ "Pf2" のご紹介
osyoyu
0
140
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
1.1k
Handling focus in 2024
tahia910
0
240
2024春 注目のWeb系 OSS & SaaS 3選
makies
0
190
高専で制御を、大学でセンシングを学び、次は脳みそ
satoshirobatofujimoto
0
120
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
22
1.4k
KATA
mclloyd
16
12k
[RailsConf 2023] Rails as a piece of cake
palkan
28
4k
Design by the Numbers
sachag
274
18k
Designing with Data
zakiwarfel
96
4.8k
The Invisible Customer
myddelton
114
12k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
12
1k
Making the Leap to Tech Lead
cromwellryan
125
8.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
Raft: Consensus for Rubyists
vanstee
133
6.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
Principles of Awesome APIs and How to Build Them.
keavy
121
16k
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