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
プロセス改善による品質向上事例
tomasagi
2
2.6k
ビジネスモデリング道場 目的と背景
masuda220
PRO
9
560
なぜ私は自分が使わないサービスを作るのか? / Why would I create a service that I would not use?
aiandrox
0
760
急成長する企業で作った、エンジニアが輝ける制度/ 20250214 Rinto Ikenoue
shift_evolve
3
1.3k
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
380
飲食店予約台帳を支えるインタラクティブ UI 設計と実装
siropaca
7
1.8k
現場の種を事業の芽にする - エンジニア主導のイノベーションを事業戦略に装着する方法 -
kzkmaeda
2
2.1k
2024.02.19 W&B AIエージェントLT会 / AIエージェントが業務を代行するための計画と実行 / Algomatic 宮脇
smiyawaki0820
14
3.5k
速くて安いWebサイトを作る
nishiharatsubasa
11
13k
管理者しか知らないOutlookの裏側のAIを覗く#AzureTravelers
hirotomotaguchi
2
440
分解して理解する Aspire
nenonaninu
1
300
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
110
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
RailsConf 2023
tenderlove
29
1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Code Reviewing Like a Champion
maltzj
521
39k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
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