Running PHP on Nginx / PHP wgtn

Post on 30-Jul-2015

130 views 2 download

Tags:

Transcript of Running PHP on Nginx / PHP wgtn

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

• Technology%Strategist%at%Dynatrace%• Database%and%Web%Development%

• PHP%for%more%than%15%years%

• Love%to%discover%new%things%

Harald%Zeitlhofer%

3

I’m%from%Austria%

4

Also%from%Austria%

5

6

But%%

probably%

you%%

already%

know%%

that%...%

7

Web%ApplicaMons%

8

9

Modern%Web%Pages:%lots%of%staMc%content%

434#Resources#in%total%on%that%page:%230%JPEGs,%75%PNGs,%50%GIFs,%…%

10

cached%content%

can%sMll%create%roundtrips%%to%the%network!%

11

Web%Request%handling%

12

Web%Request%handling%

13

Tips and tricks for high performance websites

14

Web%Request%handling%

15

Leading%among%%top%10.000%websites%

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

PHP[FPM%FastCGI%Process%Manager%%%

Available%since%5.3.3%

Stable%since%5.4.1%

%%%

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

HHVM%HipHop%Virtual%Machine%

Facebook's%PHP%engine%

JIT%compiler%

supports%PHP%and%Hack%

%

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

Nginx%

Lightweight%HTTP%server%

Event%based%request%handling%

Fast%especially%at%high%load%

Open%Source%project%(BSD)%%

Commercial%version%Nginx+%

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

•  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

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

TransacMon%flow%

26

Nginx%and%Caching%

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

TesMng%FastCGI%cache%

29

TesMng%FastCGI%cache%

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

30

TesMng%FastCGI%cache%

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

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

• 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

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

•  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

• 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

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

• Nginx%running%with%default%semngs%

• Apache%•  AllowOverride%None%

•  MulM[process%(prefork)%mode%%to%allow%usage%of%mod_php%

Benchmarking%Nginx%vs%Apache%

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%respo

nse%Mme%[sec]%

39

Performance%Monitoring%

40

Performance%Tools%

41

monitor'all'transac,ons'in'all'channels'

42

monitor'your'infrastructure'

43

process'monitoring'

44

iden,fy'response',me'hotspots'in'the'backend'

45 drill'down'to'find'the'root'cause'

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

www.dynatrace.com%

Thank%you%!!!%

Harald'Zeitlhofer'Senior%Technology%Strategist%

#HZeitlhofer%harald.zeitlhofer@dynatrace.com%

hjp://blog.dyntrace.com%