SlideShare a Scribd company logo
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%response%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%

More Related Content

Running PHP on Nginx / PHP wgtn