+ All Categories
Home > Technology > Running PHP on nginx

Running PHP on nginx

Date post: 19-Jul-2015
Category:
Upload: harald-zeitlhofer
View: 79 times
Download: 1 times
Share this document with a friend
Popular Tags:
61
Proper configura-on for high performance websites Harald Zeitlhofer April 2015 Boost your website by running PHP on Nginx @HZeitlhofer [email protected]
Transcript

1 #Dynatrace

Proper  configura-on  for  high  performance  websites  

Harald  Zeitlhofer  April  2015  

 

Boost  your  website  by  running  PHP  on  Nginx  

@HZeitlhofer  [email protected]  

 

2 #Dynatrace

Fast  PHP  applica-ons  

3 #Dynatrace

Applica-on  Performance  

4 #Dynatrace

Tips and tricks for high performance websites

5 #Dynatrace

Web  Request  handling  

6 #Dynatrace

Web  Request  handling  

7 #Dynatrace

PHP  run  modes  

Apache  Module  

–  tradi-onal  approach  –  used  for  most  PHP  

environments  

CGI  

–  Command  Line  Interface  (CLI)  

FastCGI  (PHP-­‐FPM)  

–  PHP  applica-on  server  –  Run  mul-ple  PHP  worker  

processes  to  serve  CGI  requests  

8 #Dynatrace

Nginx  

Lightweight  HTTP  server  

Fast  especially  at  high  load  

Event  based  request  handling  

Open  Source  project  (BSD)    by  Igor  Sysoev  

Nginx,  Inc.  founded  in  2011  

9 #Dynatrace

Leading  among    top  10.000  websites  

10 #Dynatrace

but I could call the FPM from Apache !

11 #Dynatrace

it’s not only the FPM

yes,  but  ...  

it’s Nginx' event based processing that creates the performance advantage

12 #Dynatrace

Apache can also be operated in an event mode !

13 #Dynatrace

it’s not 100% event based...

yes,  but  ...  

14 #Dynatrace

prefork  mode  one  process  per  request    

worker  mode  mul-ple  threads  per  process,  one  per  request    

worker  event  mode  

event  based  request  handling  

15 #Dynatrace

• mod_php  

• mod_fcgid  

• mod_fastcgi  

 

Integra-on  

• ngx_h5p_fastcgi_modul  

16 #Dynatrace

PHP-­‐FPM  FastCGI  Process  Manager      

Available  since  5.3.3,  stable  since  5.4.1  

     

17 #Dynatrace

•  Installa-on    

• Pool  configura-on  /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

18 #Dynatrace

• Pool  configura-on  /etc/php5/fpm/pool.d/www.conf

PHP-­‐FPM  

[pool_name] ... pm = [dynamic/static] pm.max_children = 10 ;only used for dynamic: pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3

pm.max_children      =  total  available  memory  /  memory  used  by  1  PHP  process  

19 #Dynatrace

Nginx  and  PHP-­‐FPM  Integra-on  

20 #Dynatrace

•  /etc/nginx/nginx.conf    

 # max_clients = worker_processes * worker_connections worker_processes 8; # number of CPUs worker_rlimit_nofile 40000; events { worker_connections 1024; multi_accept on; }

21 #Dynatrace

• Communica-on  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;

22 #Dynatrace

Transac-on  flow  

23 #Dynatrace

•  Sta-c  content  to  be  served  by  Nginx  •  Dynamic  requests  to  be  sent  to  PHP-­‐FPM  

Integra-on  

server { listen 80; root /var/www/test; index index.php index.html index.htm; server_name test.whateveryourdomain.is; 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 #Dynatrace

hbp://www.mysite.com/news/browse/2014  

è  to  be  handled  by  index.php  

URL  rewrite  

... RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php ...

25 #Dynatrace

hbp://www.mysite.com/news/browse/2014  

è  to  be  handled  by  index.php  

URL  rewrite  

upstream php { server unix:/var/run/php5-fpm.sock; } server {

listen 80; root /var/www; index index.php index.html index.htm; server_name www.mysite.com;

location / {

try_files $uri $uri/ @missing; }

location @missing {

rewrite (.*) /index.php; }

location ~ .php$ {

fastcgi_index index.php; include fastcgi_params; fastcgi_pass php;

} }

26 #Dynatrace

using  Nginx/PHP-­‐FPM  there’s  a  beber  way:  

URL  rewrite  

upstream php { server unix:/var/run/php5-fpm.sock; } server {

listen 80; root /var/www; index index.php index.html index.htm; server_name www.mysite.com;

location /images {

try_files $uri =404; }

location /scripts {

try_files $uri =404; }

location / {

fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/index.php; fastcgi_pass php; }

}

<?php

$params = explode('/', $_SERVER["DOCUMENT_URI"]); ...

27 #Dynatrace

• Easy  way  to  deploy  your  applica-on  • All  source  files  packed  into  one  *.phar  file  

PHAR  –  PHP  Archives  

location ~* \.(php|phar)$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/myapp.phar; }

28 #Dynatrace

PHAR  example  root@hzvm01:/var/www/app/src# ls -lrtR .: total 8 drwxrwxr-x 2 root root 4096 Oct 10 16:27 lib -rw-r--r-- 1 root root 27 Oct 10 16:27 index.php ./lib: total 4 -rw-r--r-- 1 root root 87 Oct 10 16:27 App.php

root@hzvm01:/var/www/app/src# cat index.php <?php $app = new App(); ?>

root@hzvm01:/var/www/app/src# cat lib/App.php <?php class App { function __construct() { echo "Starting Application\n"; }

}

29 #Dynatrace

PHAR  example  

location /myapp { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/myapp.phar; }

root@hzvm01:/var/www/app# phar pack -f myapp.phar src lib/App.php index.php root@hzvm01:/var/www/app# l myapp.phar -rw-r--r-- 1 root root 6923 Oct 10 19:51 myapp.phar

30 #Dynatrace

PHAR  execu-on  

31 #Dynatrace

Performance  

32 #Dynatrace

• Nginx  running  with  default  segngs  

• Apache  •  AllowOverride  None  

•  Mul--­‐process  mode  to  allow  usage  of  mod_php  

Benchmarking  Nginx  vs  Apache  

33 #Dynatrace

Sta-c  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  respo

nse  -m

e  [sec]  

34 #Dynatrace

Nginx  and  Caching  

35 #Dynatrace

• Part  of  the  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; }

36 #Dynatrace

Tes-ng  FastCGI  cache  

37 #Dynatrace

Tes-ng  FastCGI  cache  

38 #Dynatrace

Tes-ng  FastCGI  cache  

<?php echo time()."\n"; ?>

39 #Dynatrace

• ngx_hbp_memcached_module  

Full  page  cache  with  Nginx  and  Memcached  

server { location / { set $memcached_key "$uri"; memcached_pass localhost:11211; error_page 404 502 504 = @fallback; } location @fallback { proxy_pass http://backend; } }

40 #Dynatrace

• PHP    

Full  page  cache  with  Nginx  and  Memcached  

<?php ... function cachePage($content) { $c = new Memcached(); $c->addServer('localhost',11211); $c->set($_SERVER[”REQUEST_URI"], $content);

} ... $content = $this->renderPage(); $this->cachePage($content); ... ?>

41 #Dynatrace

PHP,  5k  requests,  concurrency  100  

0  

1  

2  

3  

4  

5  

6  

7  

8  

Apache+PHP   Nginx+PHP   Nginx+Memcached  

<?php echo “Hello World”; ?>

42 #Dynatrace

•  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; }

43 #Dynatrace

• keep  handlers  for  requested  sta-c  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;

44 #Dynatrace

•  ngx_hbp_upstream_module  

Load  balancing  PHP  

upstream php_loadbalancer { ip_hash; server unix:/var/run/php5-fpm.sock weight=5; server 192.168.56.12:7777 weight=2; server 192.168.56.13:7777;

} server { listen 80; root /home/www/test; server_name test.hzvm01; location / { try_files $uri =405; } location ~ \.php$ { fastcgi_pass php_loadbalancer; fastcgi_index index.php; include fastcgi_params; }

}

45 #Dynatrace

Load  balancing  PHP  

46 #Dynatrace

Load  balancing  /  Reverse  Proxy  upstream backend { ip_hash; server 192.168.56.11 weight=5; server 192.168.56.12 weight=2; server 192.168.56.13;

} server { listen 80; root /var/www/mysite.com/html; server_name www.mysite.com; location / { try_files $uri =405; proxy_pass http://backend; }

}

47 #Dynatrace

Reverse  Proxy  /  Load  balancing  /  Caching  proxy_cache_path /etc/nginx/cache keys_zone=APPKEY:10m; proxy_cache_key "$host$request_uri$cookie_user"; proxy_cache_min_uses 5; proxy_cache_methods GET HEAD; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; upstream backend { ip_hash; server 192.168.56.11 weight=5; server 192.168.56.12 weight=2; server 192.168.56.13;

} server { listen 80; root /var/www/mysite.com/html; server_name www.mysite.com; proxy_cache APPKEY; location / { proxy_pass http://backend; }

}

48 #Dynatrace

Performance  Monitoring  

49 #Dynatrace

End-­‐To-­‐End  Monitoring  

50 #Dynatrace

51 #Dynatrace

52 #Dynatrace

User  Experience  Management  

53 #Dynatrace

54 #Dynatrace

55 #Dynatrace

lessc  library  caused  performance  hotspot  

56 #Dynatrace

3rd  party  content  

57 #Dynatrace

3rd  party  content  

58 #Dynatrace

59 #Dynatrace

• PHP  agent  since  DT  5.5  • Nginx  agent  since  DT  6.0  • 100%  transac-on  tracing  • Process  monitoring  

• Auto-­‐Sensor  to  trace  slow  func-on/method  execu-ons  

• OOTB  Sensor  Packs  • Custom  Sensor  Rules  

• Error  handling  

60 #Dynatrace

• Free  trial  license  for  30  days  • Free  for  developers  on  local  machine  

Dynatrace  Free  Trial  

hbp://bit.ly/dbrial  

61 #Dynatrace

Thank You [email protected]  @HZeitlhofer    

www.dynatrace.com  


Recommended