Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Running PHP on Nginx / PHP wgtn

596 vues

Publié le

my slides about running PHP on Nginx / tips and tricks for high performance websites, presented on the PHP Wellington meetup in New Zealand in April 2015

Publié dans : Technologie
  • Soyez le premier à commenter

Running PHP on Nginx / PHP wgtn

  1. 1. 1 Tips%and%tricks%for%high%performance%websites% Harald%Zeitlhofer% April%2015% % Boost%your%website%by%running% PHP%on%Nginx% @HZeitlhofer% harald.zeitlhofer@dynatrace.com% %
  2. 2. 2 • Technology%Strategist%at%Dynatrace% • Database%and%Web%Development% • PHP%for%more%than%15%years% • Love%to%discover%new%things% Harald%Zeitlhofer%
  3. 3. 3 I’m%from%Austria%
  4. 4. 4 Also%from%Austria%
  5. 5. 5
  6. 6. 6 But%% probably% you%% already% know%% that%...%
  7. 7. 7 Web%ApplicaMons%
  8. 8. 8
  9. 9. 9 Modern%Web%Pages:%lots%of%staMc%content% 434#Resources#in%total%on%that%page:% 230%JPEGs,%75%PNGs,%50%GIFs,%…%
  10. 10. 10 cached%content% can%sMll%create%roundtrips%% to%the%network!%
  11. 11. 11 Web%Request%handling%
  12. 12. 12 Web%Request%handling%
  13. 13. 13 Tips and tricks for high performance websites
  14. 14. 14 Web%Request%handling%
  15. 15. 15 Leading%among%% top%10.000%websites%
  16. 16. 16 PHP% run%modes% Apache%Module% –  tradiMonal%approach% –  used%for%most%PHP%environments% PHP[FPM% –  PHP%applicaMon%server% –  run%mulMple%PHP%worker%processes%to% serve%FastCGI%requests% HHVM% –  Virtual%machine%for%HipHop% –  fast%PHP%engine% –  can%serve%FastCGI%requests%% %
  17. 17. 17 PHP[FPM% FastCGI%Process%Manager% % % Available%since%5.3.3% Stable%since%5.4.1% % %
  18. 18. 18 • InstallaMon% % • Pool%configuraMon% /etc/php5/fpm/pool.d/www.conf PHP[FPM% [www] user = www-data group = www-data listen = 127.0.0.1:9000 # for Unix socket: unix:/var/run/php5-fpm.sock; root@hzvm01:/etc/nginx/sites-enabled# ps -ef | grep php root 6435 1 0 14:39 ? 00:00:32 php-fpm: master process (/etc/php5/fpm/php-fpm.conf) spelix 6439 6435 0 14:39 ? 00:00:00 php-fpm: pool batch spelix 6440 6435 0 14:39 ? 00:00:00 php-fpm: pool batch www-data 10576 6435 1 18:45 ? 00:00:48 php-fpm: pool www www-data 10920 6435 1 18:47 ? 00:00:47 php-fpm: pool www www-data 10927 6435 1 18:47 ? 00:00:46 php-fpm: pool www sudo apt-get install php5-fpm
  19. 19. 19 HHVM% HipHop%Virtual%Machine% Facebook's%PHP%engine% JIT%compiler% supports%PHP%and%Hack% %
  20. 20. 20 • InstallaMon% % • start%server% cd /your/root/folder hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000 echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list sudo apt-get update sudo apt-get install hhvm hhvm --mode server -vServer.Type=fastcgi –vServer.FileSocket=/var/run/hhvm.sock
  21. 21. 21 Nginx% Lightweight%HTTP%server% Event%based%request%handling% Fast%especially%at%high%load% Open%Source%project%(BSD)%% Commercial%version%Nginx+%
  22. 22. 22 /etc/nginx/nginx.conf% % % # max_clients = worker_processes * worker_connections worker_processes 8; # number of CPUs events { worker_connections 1024; multi_accept on; }
  23. 23. 23 •  StaMc%content%to%be%served%by%Nginx% •  Dynamic%requests%to%be%sent%to%PHP% IntegraMon% server { listen 80; server_name www.yourdomain.com; root /var/www/test; index index.php index.html index.htm; location ~* .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { try_files $uri =404; } location / { try_files $uri $uri/ =404; } location ~* .php$ { fastcgi_index index.php; fastcgi_pass php; include fastcgi_params; } }
  24. 24. 24 CommunicaMon%via%sockets% •  TCP%vs%Unix% •  Unix%slightly%faster%when%used%on%localhost% •  Use%TCP%for%high%load% location ~* .php$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } fastcgi_pass unix:/var/run/php5-fpm.sock;
  25. 25. 25 TransacMon%flow%
  26. 26. 26 Nginx%and%Caching%
  27. 27. 27 • Part%of%Nginx'%FastCGI%module% Nginx%FastCGI%cache% fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=APPKEY:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; location ~* .php$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_cache APPKEY; fastcgi_cache_valid 200 60m; }
  28. 28. 28 TesMng%FastCGI%cache%
  29. 29. 29 TesMng%FastCGI%cache% <?php echo time()."n"; ?>
  30. 30. 30 TesMng%FastCGI%cache% <?php echo time()."n"; ?>
  31. 31. 31 Full%page%/%data%cache%with%Memcached% <?php ... function __construct () { $this->c = new Memcached(); $this->c->addServer('localhost',11211); } function setCache ($key, $content) { $this->c->set($key, $content); } ... // get HTML content $this->setCache($_SERVER['REQUEST_URI'], $this->renderPage()); ... // get JSON structure $this->setCache('/data/news/getlist', $this->getNewsList()); ... ?>
  32. 32. 32 • ngx_hjp_memcached_module% Full%page%/%data%cache%with%Nginx%and%Memcached% upstream php { server unix:/var/run/php5-fpm.sock; } server { location / { set $memcached_key "$uri"; memcached_pass localhost:11211; error_page 404 502 504 = @notincache; } location @notincache { fastcgi_pass php; } }
  33. 33. 33 PHP,%5k%requests,%concurrency%100% 0% 1% 2% 3% 4% 5% 6% 7% 8% Apache+PHP% Nginx+PHP% Nginx+Memcached% <?php echo "Hello World"; ?>
  34. 34. 34 • set%HTTP%response%expires%header% Client%Side%Caching% location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { expires 90d; access_log off; error_log off; try_files $uri =404; }
  35. 35. 35 • keep%handlers%for%requested%staMc%files%open% Filehandle%Caching% open_file_cache max=1000 inactive=5m; open_file_cache_valid 60s; open_file_cache_min_uses 5; open_file_cache_errors off;
  36. 36. 36 Load%balancing%PHP% upstream php { ip_hash; server unix:/var/run/php5-fpm.sock weight=5; server 192.168.56.12:9000 weight=2; server 192.168.56.13:9000; server 192.168.56.14:9000 backup; } server { listen 80; root /home/www/test; server_name test.hzvm01; location / { try_files $uri =405; } location ~ .php$ { fastcgi_pass php; fastcgi_index index.php; include fastcgi_params; } }
  37. 37. 37 • Nginx%running%with%default%semngs% • Apache% •  AllowOverride%None% •  MulM[process%(prefork)%mode%% to%allow%usage%of%mod_php% Benchmarking%Nginx%vs%Apache%
  38. 38. 38 StaMc%HTML,%10k%requests% 0% 1% 2% 3% 4% 5% 6% 7% 8% 9% 100% 500% 1000% 2000% Apache/2.4.9% nginx/1.1.19% concurrency% Total%response%Mme%[sec]%
  39. 39. 39 Performance%Monitoring%
  40. 40. 40 Performance%Tools%
  41. 41. 41 monitor'all'transac,ons'in'all'channels'
  42. 42. 42 monitor'your'infrastructure'
  43. 43. 43 process'monitoring'
  44. 44. 44 iden,fy'response',me'hotspots'in'the'backend'
  45. 45. 45 drill'down'to'find'the'root'cause'
  46. 46. 46 • Load%Generator%% (Apache%Benchmark,%Selenium,%JMeter)% • Firebug,%Google%Developer%Tools% Dynatrace%Ajax%EdiMon% • Google%PageSpeed% • Dynatrace%Free%Trial% •  Free%trial%license%for%30%days% •  Free%personal%license%for%developers% My%favorites% hjp://bit.ly/djrial%
  47. 47. 47 www.dynatrace.com% Thank%you%!!!% Harald'Zeitlhofer' Senior%Technology%Strategist% #HZeitlhofer% harald.zeitlhofer@dynatrace.com% hjp://blog.dyntrace.com%

×