Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Running PHP on Nginx / PHP wgtn

585 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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%

×