SlideShare a Scribd company logo
1 of 80
Download to read offline
Nginx, 
PHP, 
Apache 
and 
Spelix 
Harald 
Zeitlhofer 
October 
2014 
COMPANY CONFIDENTIAL 1 – DO NOT DISTRIBUTE #Dynatrace
Harald 
Zeitlhofer 
• Technology 
Strategist 
at 
Dynatrace 
• PHP 
for 
more 
than 
15 
years 
• Married, 
2 
kids 
• Love 
to 
discover 
new 
things 
COMPANY CONFIDENTIAL 2 – DO NOT DISTRIBUTE #Dynatrace
Austria 
COMPANY CONFIDENTIAL 3 – DO NOT DISTRIBUTE #Dynatrace
Where 
I’m 
from… 
COMPANY CONFIDENTIAL 4 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 5 – DO NOT DISTRIBUTE #Dynatrace
Agenda 
• MoNvaNon 
• Nginx 
• PHP-­‐FPM 
• IntegraNon 
• Caching 
• Load 
balancing 
• How 
this 
runs 
in 
Spelix 
COMPANY CONFIDENTIAL 6 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
COMPANY CONFIDENTIAL 7 – DO NOT DISTRIBUTE #Dynatrace
• Lightweight 
HTTP 
server 
• Fast 
especially 
at 
high 
load 
COMPANY CONFIDENTIAL 8 – DO NOT DISTRIBUTE #Dynatrace
Leading 
among 
top 
10.000 
websites 
COMPANY CONFIDENTIAL 9 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 10 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
SeTngs 
• /etc/nginx/nginx.conf 
# max_clients = worker_processes * worker_connections 
worker_processes [number of CPUs]; 
worker_connections 1024; 
COMPANY CONFIDENTIAL 11 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
High 
Load 
• /etc/sysctl.conf 
fs.file-max = 80000 
• /etc/security/limits.conf 
• 
www-data soft nofile 40000 
www-data hard nofile 70000 
/etc/pam.d/su 
session required pam_limits.so 
• /etc/default/nginx 
ULIMIT="-n 40000" 
COMPANY CONFIDENTIAL 12 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
High 
Load 
worker_processes 8; 
worker_rlimit_nofile 40000; 
events { 
worker_connections 4096; 
multi_accept on; 
} 
• 32768 
concurrent 
requests 
COMPANY CONFIDENTIAL 13 – DO NOT DISTRIBUTE #Dynatrace
PHP 
FastCGI 
Process 
Manager 
COMPANY CONFIDENTIAL 14 – DO NOT DISTRIBUTE #Dynatrace
PHP-­‐FPM 
• FastCGI 
Process 
Manager 
• Available 
since 
5.3.3, 
stable 
since 
5.4.1 
• Run 
mulNple 
PHP 
worker 
processes 
to 
serve 
CGI 
requests 
• MulNple 
connecNon 
pools 
• Different 
php.ini 
files 
possible 
• Very 
helpful: 
fastcgi_finish_request() 
COMPANY CONFIDENTIAL 15 – DO NOT DISTRIBUTE #Dynatrace
PHP-­‐FPM 
• InstallaNon 
sudo apt-get install php5-fpm 
• Pool 
configuraNon 
/etc/php5/fpm/pool.d/www.conf 
[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 
COMPANY CONFIDENTIAL 16 – DO NOT DISTRIBUTE #Dynatrace
PHP-­‐FPM 
• Process 
Manager 
[pool_name] 
... 
pm = [dynamic/static] 
pm.max_children = 5 
; 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 
COMPANY CONFIDENTIAL 17 – DO NOT DISTRIBUTE #Dynatrace
PHP-­‐FPM 
• Security 
/etc/php5/fpm/php.ini 
expose_php = Off 
• Use 
mulNple 
configuraNons 
/etc/init.d/php-fpm start 
or 
php-fpm -y /path/to/your/php-fpm.conf -c /path/to/your/php.ini 
COMPANY CONFIDENTIAL 18 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
and 
PHP 
/ 
IntegraNon 
COMPANY CONFIDENTIAL 19 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
and 
PHP 
• CommunicaNon 
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; 
COMPANY CONFIDENTIAL 20 – DO NOT DISTRIBUTE #Dynatrace
IntegraNon 
• StaNc 
content 
to 
be 
served 
by 
Nginx 
• Dynamic 
requests 
to 
be 
sent 
to 
PHP-­‐FPM 
server { 
listen 80; 
root /var/www/test; 
index index.php index.html index.htm; 
server_name test.whateveryourdomain.is; 
location / { 
try_files $uri $uri/ @notfound; 
} 
location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { 
try_files $uri @notfound; 
} 
location ~* .php$ { 
fastcgi_index index.php; 
fastcgi_pass php; 
include fastcgi_params; 
} 
locaation @notfound { 
... 
} 
} 
COMPANY CONFIDENTIAL 21 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
– 
PHP 
transacNon 
flow 
COMPANY CONFIDENTIAL 22 – DO NOT DISTRIBUTE #Dynatrace
PHAR 
– 
PHP 
Archives 
• Easy 
way 
to 
deploy 
your 
applicaNon 
• All 
source 
files 
packed 
into 
one 
*.phar 
file 
location ~* .(php|phar)$ { 
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; 
} 
COMPANY CONFIDENTIAL 23 – DO NOT DISTRIBUTE #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 Applicationn"; 
} 
} 
COMPANY CONFIDENTIAL 24 – DO NOT DISTRIBUTE #Dynatrace
PHAR 
Example 
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 
location /myapp { 
fastcgi_index index.php; 
fastcgi_pass 127.0.0.1:9000; 
include fastcgi_params; 
fastcgi_param SCRIPT_FILENAME $document_root/myapp.phar; 
} 
COMPANY CONFIDENTIAL 25 – DO NOT DISTRIBUTE #Dynatrace
PHAR 
execuNon 
COMPANY CONFIDENTIAL 26 – DO NOT DISTRIBUTE #Dynatrace
Performance 
COMPANY CONFIDENTIAL 27 – DO NOT DISTRIBUTE #Dynatrace
Benchmarking 
Nginx 
vs 
Apache 
• Nginx 
running 
with 
default 
seTngs 
• Apache 
• AllowOverride 
None 
• MulN-­‐process 
mode 
to 
allow 
usage 
of 
mod_php 
COMPANY CONFIDENTIAL 28 – DO NOT DISTRIBUTE #Dynatrace
StaNc 
HTML, 
10k 
requests, 
concurrency 
10 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 10 
Time taken for tests: 6.848 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2660000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 1460.25 [#/sec] (mean) 
Time per request: 6.848 [ms] (mean) 
Time per request: 0.685 [ms] (mean, across all concurrent requests) 
Transfer rate: 379.32 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 2 0.9 2 24 
Processing: 1 4 1.5 4 26 
Waiting: 0 3 1.3 3 24 
Total: 2 7 1.7 6 32 
Percentage of the requests served within a certain time (ms) 
50% 6 
66% 7 
75% 7 
80% 7 
90% 8 
95% 9 
98% 10 
99% 12 
100% 32 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 10 
Time taken for tests: 4.991 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2600000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 2003.41 [#/sec] (mean) 
Time per request: 4.991 [ms] (mean) 
Time per request: 0.499 [ms] (mean, across all concurrent requests) 
Transfer rate: 508.68 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 2 1.1 2 31 
Processing: 1 3 2.0 3 38 
Waiting: 0 2 1.7 2 34 
Total: 1 5 2.2 5 41 
Percentage of the requests served within a certain time (ms) 
50% 5 
66% 5 
75% 5 
80% 6 
90% 6 
95% 7 
98% 9 
99% 12 
100% 41 (longest request) 
COMPANY CONFIDENTIAL 29 – DO NOT DISTRIBUTE #Dynatrace
StaNc 
HTML, 
10k 
requests, 
concurrency 
100 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 100 
Time taken for tests: 5.329 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2660000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 1876.35 [#/sec] (mean) 
Time per request: 53.295 [ms] (mean) 
Time per request: 0.533 [ms] (mean, across all concurrent requests) 
Transfer rate: 487.41 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 8 4.5 8 54 
Processing: 15 45 18.5 51 120 
Waiting: 12 42 18.7 49 108 
Total: 26 53 18.2 58 132 
Percentage of the requests served within a certain time (ms) 
50% 58 
66% 60 
75% 62 
80% 64 
90% 69 
95% 87 
98% 99 
99% 105 
100% 132 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 100 
Time taken for tests: 4.908 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2600000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 2037.64 [#/sec] (mean) 
Time per request: 49.076 [ms] (mean) 
Time per request: 0.491 [ms] (mean, across all concurrent requests) 
Transfer rate: 517.37 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 9 23 4.4 23 40 
Processing: 8 25 5.1 25 48 
Waiting: 2 19 4.6 18 41 
Total: 22 49 6.4 47 75 
Percentage of the requests served within a certain time (ms) 
50% 47 
66% 50 
75% 52 
80% 54 
90% 58 
95% 61 
98% 64 
99% 65 
100% 75 (longest request) 
COMPANY CONFIDENTIAL 30 – DO NOT DISTRIBUTE #Dynatrace
StaNc 
HTML, 
10k 
requests, 
concurrency 
500 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 500 
Time taken for tests: 7.628 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2660000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 1310.89 [#/sec] (mean) 
Time per request: 381.421 [ms] (mean) 
Time per request: 0.763 [ms] (mean, across all concurrent requests) 
Transfer rate: 340.52 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 2 67 263.3 16 3050 
Processing: 28 246 814.5 95 6605 
Waiting: 21 240 814.9 90 6599 
Total: 70 312 870.2 113 7556 
Percentage of the requests served within a certain time (ms) 
50% 113 
66% 130 
75% 147 
80% 158 
90% 364 
95% 1111 
98% 3100 
99% 6637 
100% 7556 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 500 
Time taken for tests: 4.306 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2600000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 2322.27 [#/sec] (mean) 
Time per request: 215.307 [ms] (mean) 
Time per request: 0.431 [ms] (mean, across all concurrent requests) 
Transfer rate: 589.64 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 47 100 32.0 97 185 
Processing: 50 110 36.1 108 231 
Waiting: 20 82 30.3 76 188 
Total: 119 210 57.8 220 334 
Percentage of the requests served within a certain time (ms) 
50% 220 
66% 248 
75% 265 
80% 271 
90% 285 
95% 293 
98% 303 
99% 306 
100% 334 (longest request) 
COMPANY CONFIDENTIAL 31 – DO NOT DISTRIBUTE #Dynatrace
StaNc 
HTML, 
10k 
requests, 
concurrency 
1k 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 1000 
Time taken for tests: 9.778 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2660000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 1022.74 [#/sec] (mean) 
Time per request: 977.769 [ms] (mean) 
Time per request: 0.978 [ms] (mean, across all concurrent requests) 
Transfer rate: 265.67 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 28 179 403.5 69 3106 
Processing: 39 452 1262.7 117 6677 
Waiting: 22 427 1267.6 91 6672 
Total: 107 631 1447.3 182 9619 
Percentage of the requests served within a certain time (ms) 
50% 182 
66% 203 
75% 258 
80% 422 
90% 1178 
95% 3190 
98% 7622 
99% 7643 
100% 9619 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.html 
Document Length: 21 bytes 
Concurrency Level: 1000 
Time taken for tests: 5.302 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 2600000 bytes 
HTML transferred: 210000 bytes 
Requests per second: 1886.22 [#/sec] (mean) 
Time per request: 530.160 [ms] (mean) 
Time per request: 0.530 [ms] (mean, across all concurrent requests) 
Transfer rate: 478.92 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 138 238 50.5 229 370 
Processing: 72 269 59.7 257 514 
Waiting: 62 195 58.3 184 377 
Total: 338 507 56.0 518 651 
Percentage of the requests served within a certain time (ms) 
50% 518 
66% 541 
75% 547 
80% 551 
90% 573 
95% 580 
98% 623 
99% 638 
100% 651 (longest request) 
COMPANY CONFIDENTIAL 32 – DO NOT DISTRIBUTE #Dynatrace
Apache 
vs 
Nginx 
(StaNc 
HTML) 
12 
10 
8 
6 
4 
2 
0 
Apache/2.4.7 
nginx/1.4.6 
10 
100 
500 
1000 
COMPANY CONFIDENTIAL 33 – DO NOT DISTRIBUTE #Dynatrace
Image 
841 
bytes, 
10k 
requests, 
concurrency 
500 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /images/plus.gif 
Document Length: 841 bytes 
Concurrency Level: 500 
Time taken for tests: 8.036 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 10880000 bytes 
HTML transferred: 8410000 bytes 
Requests per second: 1244.35 [#/sec] (mean) 
Time per request: 401.817 [ms] (mean) 
Time per request: 0.804 [ms] (mean, across all concurrent requests) 
Transfer rate: 1322.12 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 63 273.3 7 3046 
Processing: 19 229 815.9 80 6596 
Waiting: 16 227 816.0 78 6596 
Total: 54 293 881.4 88 7561 
Percentage of the requests served within a certain time (ms) 
50% 88 
66% 95 
75% 104 
80% 109 
90% 318 
95% 1094 
98% 3289 
99% 6623 
100% 7561 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /images/plus.gif 
Document Length: 841 bytes 
Concurrency Level: 500 
Time taken for tests: 5.239 seconds 
Complete requests: 10000 
Failed requests: 0 
Total transferred: 10820000 bytes 
HTML transferred: 8410000 bytes 
Requests per second: 1908.76 [#/sec] (mean) 
Time per request: 261.950 [ms] (mean) 
Time per request: 0.524 [ms] (mean, across all concurrent requests) 
Transfer rate: 2016.87 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 55 119 22.0 118 183 
Processing: 32 137 27.8 132 260 
Waiting: 29 101 25.4 96 202 
Total: 156 255 28.1 258 351 
Percentage of the requests served within a certain time (ms) 
50% 258 
66% 268 
75% 275 
80% 281 
90% 288 
95% 298 
98% 310 
99% 317 
100% 351 (longest request) 
COMPANY CONFIDENTIAL 34 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
1k 
requests, 
concurrency 
500 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.php 
Document Length: 12 bytes 
Concurrency Level: 500 
Time taken for tests: 13.298 seconds 
Complete requests: 1000 
Failed requests: 0 
Total transferred: 199000 bytes 
HTML transferred: 12000 bytes 
Requests per second: 75.20 [#/sec] (mean) 
Time per request: 6649.092 [ms] (mean) 
Time per request: 13.298 [ms] (mean, across all concurrent requests) 
Transfer rate: 14.61 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 25 30.0 1 68 
Processing: 70 2344 4333.5 167 13205 
Waiting: 69 2343 4333.4 165 13204 
Total: 124 2369 4352.0 171 13264 
Percentage of the requests served within a certain time (ms) 
50% 171 
66% 211 
75% 415 
80% 7240 
90% 13156 
95% 13208 
98% 13249 
99% 13257 
100% 13264 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.php 
Document Length: 12 bytes 
Concurrency Level: 500 
Time taken for tests: 3.230 seconds 
Complete requests: 1000 
Failed requests: 0 
Total transferred: 178000 bytes 
HTML transferred: 12000 bytes 
Requests per second: 309.56 [#/sec] (mean) 
Time per request: 1615.213 [ms] (mean) 
Time per request: 3.230 [ms] (mean, across all concurrent requests) 
Transfer rate: 53.81 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 45 44.7 71 106 
Processing: 72 643 708.7 204 3057 
Waiting: 69 643 708.8 203 3057 
Total: 163 688 732.1 227 3133 
Percentage of the requests served within a certain time (ms) 
50% 227 
66% 1147 
75% 1215 
80% 1249 
90% 1380 
95% 1433 
98% 3128 
99% 3131 
100% 3133 (longest request) 
COMPANY CONFIDENTIAL 35 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
1k 
requests, 
concurrency 
100 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.php 
Document Length: 12 bytes 
Concurrency Level: 100 
Time taken for tests: 1.233 seconds 
Complete requests: 1000 
Failed requests: 0 
Total transferred: 199000 bytes 
HTML transferred: 12000 bytes 
Requests per second: 810.72 [#/sec] (mean) 
Time per request: 123.348 [ms] (mean) 
Time per request: 1.233 [ms] (mean, across all concurrent requests) 
Transfer rate: 157.55 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 3 7.4 1 34 
Processing: 34 112 23.2 107 250 
Waiting: 29 111 22.8 106 249 
Total: 49 116 22.6 109 250 
Percentage of the requests served within a certain time (ms) 
50% 109 
66% 115 
75% 126 
80% 133 
90% 151 
95% 157 
98% 171 
99% 192 
100% 250 (longest request) 
Server Software: nginx/1.4.6 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.php 
Document Length: 12 bytes 
Concurrency Level: 100 
Time taken for tests: 1.628 seconds 
Complete requests: 1000 
Failed requests: 0 
Total transferred: 178000 bytes 
HTML transferred: 12000 bytes 
Requests per second: 614.15 [#/sec] (mean) 
Time per request: 162.826 [ms] (mean) 
Time per request: 1.628 [ms] (mean, across all concurrent requests) 
Transfer rate: 106.76 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 5 10.3 1 76 
Processing: 15 149 35.4 158 210 
Waiting: 15 147 34.7 157 208 
Total: 39 154 29.0 160 211 
Percentage of the requests served within a certain time (ms) 
50% 160 
66% 168 
75% 173 
80% 177 
90% 185 
95% 193 
98% 200 
99% 204 
100% 211 (longest request) 
COMPANY CONFIDENTIAL 36 – DO NOT DISTRIBUTE #Dynatrace
Apache 
vs 
Nginx 
-­‐ 
conclusion 
• Nginx 
faster 
for 
serving 
staNc 
files 
• Apache 
is 
faster 
for 
serving 
PHP 
only 
(low 
load) 
COMPANY CONFIDENTIAL 37 – DO NOT DISTRIBUTE #Dynatrace
Nginx, 
Apache 
and 
PHP 
COMPANY CONFIDENTIAL 38 – DO NOT DISTRIBUTE #Dynatrace
Nginx, 
Apache 
and 
PHP 
COMPANY CONFIDENTIAL 39 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
– 
more 
performance 
tweaks 
• Setup 
caching 
and 
disable 
access 
logging 
location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { 
expires 30d; 
access_log off; 
error_log off; 
try_files $uri $uri/ =404; 
} 
• Change 
Nmeouts 
http { 
keepalive_timeout 15; 
client_body_timeout 12; 
client_header_timeout 12; 
send_timeout 10; 
} 
COMPANY CONFIDENTIAL 40 – DO NOT DISTRIBUTE #Dynatrace
Caching 
COMPANY CONFIDENTIAL 41 – DO NOT DISTRIBUTE #Dynatrace
Caching 
• Server 
Side 
• Opcode 
cache 
• Full 
page 
cache 
• Pagelet 
cache 
• Data 
cache 
• Client 
Side 
• Browser 
cache 
• HTML5 
applicaNon 
cache 
• HTML5 
data 
storage 
(LocalStorage, 
SessionStorage) 
COMPANY CONFIDENTIAL 42 – DO NOT DISTRIBUTE #Dynatrace
PHP 
Opcode 
Cache 
• Integrated 
Zend 
OpCache 
in 
PHP 
5.5 
• Other 
technologies 
available 
hjp://en.wikipedia.org/wiki/List_of_PHP_accelerators 
COMPANY CONFIDENTIAL 43 – DO NOT DISTRIBUTE #Dynatrace
PHP 
OpCache 
example 
COMPANY CONFIDENTIAL 44 – DO NOT DISTRIBUTE #Dynatrace
PHP 
OpCache 
disabled 
COMPANY CONFIDENTIAL 45 – DO NOT DISTRIBUTE #Dynatrace
PHP 
OpCache 
enabled 
COMPANY CONFIDENTIAL 46 – DO NOT DISTRIBUTE #Dynatrace
Full 
page 
cache 
with 
Nginx 
and 
Memcached 
• ngx_hjp_memcached_module 
server { 
location / { 
set $memcached_key "$uri"; 
memcached_pass host:11211; 
error_page 404 502 504 = @fallback; 
} 
location @fallback { 
proxy_pass http://backend; 
} 
} 
COMPANY CONFIDENTIAL 47 – DO NOT DISTRIBUTE #Dynatrace
Full 
page 
cache 
with 
Nginx 
and 
Memcached 
• PHP 
$ sudo apt-get install php5-memcached 
<?php 
… 
function cachePage($content) { 
$c = new Memcached(); 
$c->addServer('localhost',11211); 
$c->set($_SERVER[”REQUEST_URI"], $content); 
} 
... 
$content = $this->renderPage(); 
$this->cachePage($content); 
... 
?> 
COMPANY CONFIDENTIAL 48 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
5k 
requests, 
concurrency 
100 
Server Software: Nginx + PHP 
Server Hostname: test.hzvm01 
Server Port: 80 
Document Path: /index.php 
Document Length: 10 bytes 
Concurrency Level: 100 
Time taken for tests: 4.514 seconds 
Complete requests: 5000 
Failed requests: 0 
Total transferred: 625000 bytes 
HTML transferred: 50000 bytes 
Requests per second: 1107.62 [#/sec] (mean) 
Time per request: 90.284 [ms] (mean) 
Time per request: 0.903 [ms] (mean, across all concurrent requests) 
Transfer rate: 135.21 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 2 3.2 1 38 
Processing: 22 88 13.1 87 148 
Waiting: 21 87 13.1 86 148 
Total: 42 89 12.5 88 148 
Percentage of the requests served within a certain time (ms) 
50% 88 
66% 94 
75% 97 
80% 98 
90% 104 
95% 109 
98% 125 
99% 132 
100% 148 (longest request) 
COMPANY CONFIDENTIAL 49 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
5k 
requests, 
concurrency 
100 
Server Software: Nginx + Apache + PHP 
Server Hostname: test.hzvm01 
Server Port: 81 
Document Path: /index.php 
Document Length: 10 bytes 
Concurrency Level: 100 
Time taken for tests: 9.207 seconds 
Complete requests: 5000 
Failed requests: 0 
Total transferred: 905000 bytes 
HTML transferred: 50000 bytes 
Requests per second: 543.05 [#/sec] (mean) 
Time per request: 184.146 [ms] (mean) 
Time per request: 1.841 [ms] (mean, across all concurrent requests) 
Transfer rate: 95.99 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 10 17.0 2 138 
Processing: 20 173 73.7 156 1254 
Waiting: 19 168 72.3 152 1239 
Total: 55 182 72.4 168 1254 
Percentage of the requests served within a certain time (ms) 
50% 168 
66% 197 
75% 214 
80% 224 
90% 256 
95% 287 
98% 337 
99% 427 
100% 1254 (longest request) 
COMPANY CONFIDENTIAL 50 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
5k 
requests, 
concurrency 
100 
Server Software: Apache/2.4.7 
Server Hostname: test.hzvm01 
Server Port: 88 
Document Path: /index.php 
Document Length: 10 bytes 
Concurrency Level: 100 
Time taken for tests: 7.296 seconds 
Complete requests: 5000 
Failed requests: 0 
Total transferred: 985000 bytes 
HTML transferred: 50000 bytes 
Requests per second: 685.31 [#/sec] (mean) 
Time per request: 145.920 [ms] (mean) 
Time per request: 1.459 [ms] (mean, across all concurrent requests) 
Transfer rate: 131.84 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 6 6.5 4 56 
Processing: 30 138 57.2 120 938 
Waiting: 30 135 56.4 117 937 
Total: 55 144 55.8 126 938 
Percentage of the requests served within a certain time (ms) 
50% 126 
66% 151 
75% 168 
80% 178 
90% 218 
95% 239 
98% 267 
99% 299 
100% 938 (longest request) 
COMPANY CONFIDENTIAL 51 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
5k 
requests, 
concurrency 
100 
Server Software: nginx + Memcached 
Server Hostname: test.hzvm01 
Server Port: 82 
Document Path: /index.php 
Document Length: 23 bytes 
Concurrency Level: 100 
Time taken for tests: 3.058 seconds 
Complete requests: 5000 
Failed requests: 0 
Total transferred: 865000 bytes 
HTML transferred: 115000 bytes 
Requests per second: 1634.92 [#/sec] (mean) 
Time per request: 61.165 [ms] (mean) 
Time per request: 0.612 [ms] (mean, across all concurrent requests) 
Transfer rate: 276.21 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 7 24 6.0 24 59 
Processing: 8 36 7.8 36 75 
Waiting: 6 28 7.4 29 69 
Total: 32 60 9.3 60 101 
Percentage of the requests served within a certain time (ms) 
50% 60 
66% 63 
75% 64 
80% 66 
90% 71 
95% 80 
98% 87 
99% 92 
100% 101 (longest request) 
COMPANY CONFIDENTIAL 52 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
FastCGI 
cache 
• Part 
of 
the 
Nginx 
FastCGI 
module 
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; 
} 
COMPANY CONFIDENTIAL 53 – DO NOT DISTRIBUTE #Dynatrace
TesNng 
FastCGI 
cache 
<?php 
echo time()."n"; 
?> 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229911 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229912 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229915 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229917 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229919 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229921 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229923 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229925 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229927 
root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 
1413229929 
COMPANY CONFIDENTIAL 54 – DO NOT DISTRIBUTE #Dynatrace
TesNng 
FastCGI 
cache 
COMPANY CONFIDENTIAL 55 – DO NOT DISTRIBUTE #Dynatrace
TesNng 
FastCGI 
cache 
• Config 
for 
cached 
requests 
running 
on 
port 
83 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 
1413230226 
COMPANY CONFIDENTIAL 56 – DO NOT DISTRIBUTE #Dynatrace
TesNng 
FastCGI 
cache 
COMPANY CONFIDENTIAL 57 – DO NOT DISTRIBUTE #Dynatrace
TesNng 
FastCGI 
cache 
COMPANY CONFIDENTIAL 58 – DO NOT DISTRIBUTE #Dynatrace
Pagelet 
/ 
Data 
cache 
• Served 
by 
webserver 
or 
applicaNon 
• Technologies 
• Memcached 
• FastCGI 
cache 
• APC 
(alternaNve 
PHP 
cache) 
• Redis 
COMPANY CONFIDENTIAL 59 – DO NOT DISTRIBUTE #Dynatrace
Client 
Side 
Caching 
location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { 
expires 30d; 
access_log off; 
error_log off; 
try_files $uri $uri/ =404; 
} 
• HTML5 
• applicaNon 
cache 
• LocalStorage 
• SessionStorage 
COMPANY CONFIDENTIAL 60 – DO NOT DISTRIBUTE #Dynatrace
PHP, 
5k 
requests, 
concurrency 
100 
Server Software: Nginx + FastCGI cache 
Server Hostname: test.hzvm01 
Server Port: 83 
Document Path: /index.php 
Document Length: 32 bytes 
Concurrency Level: 100 
Time taken for tests: 2.545 seconds 
Complete requests: 5000 
Failed requests: 0 
Total transferred: 735000 bytes 
HTML transferred: 160000 bytes 
Requests per second: 1964.62 [#/sec] (mean) 
Time per request: 50.900 [ms] (mean) 
Time per request: 0.509 [ms] (mean, across all concurrent requests) 
Transfer rate: 282.03 [Kbytes/sec] received 
Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 11 23 5.3 22 46 
Processing: 8 27 6.7 25 59 
Waiting: 6 20 6.0 18 56 
Total: 29 50 7.6 50 85 
Percentage of the requests served within a certain time (ms) 
50% 50 
66% 53 
75% 55 
80% 56 
90% 61 
95% 64 
98% 67 
99% 71 
100% 85 (longest request) 
COMPANY CONFIDENTIAL 61 – DO NOT DISTRIBUTE #Dynatrace
Load 
balancing 
• ngx_hjp_upstream_module 
upstream php_loadbalancer { 
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; 
} 
} 
COMPANY CONFIDENTIAL 62 – DO NOT DISTRIBUTE #Dynatrace
Load 
balancing 
COMPANY CONFIDENTIAL 63 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
and 
other 
technologies 
COMPANY CONFIDENTIAL 64 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
security 
server_tokens off; 
location ~ /. { 
access_log off; 
log_not_found off; 
deny all; 
} 
COMPANY CONFIDENTIAL 65 – DO NOT DISTRIBUTE #Dynatrace
Spelix 
COMPANY CONFIDENTIAL 66 – DO NOT DISTRIBUTE #Dynatrace
Spelix 
COMPANY CONFIDENTIAL 67 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 68 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 69 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 70 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 71 – DO NOT DISTRIBUTE #Dynatrace
COMPANY CONFIDENTIAL 72 – DO NOT DISTRIBUTE #Dynatrace
Spelix 
Technology 
• PHP 
ApplicaNon 
• MySQL 
• CouchDB 
• Memcached 
• Nginx 
+ 
PHP-­‐FPM 
• HTML5 
(LocalStorage, 
Canvas, 
ApplicaNon 
Cache) 
• JavaScript 
(jQuery, 
Leaflet 
API) 
COMPANY CONFIDENTIAL 73 – DO NOT DISTRIBUTE #Dynatrace
Spelix 
COMPANY CONFIDENTIAL 74 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
and 
other 
technologies 
COMPANY CONFIDENTIAL 75 – DO NOT DISTRIBUTE #Dynatrace
Nginx 
and 
other 
technologies 
server { 
server_name services.zitco.net; 
listen 80; 
location / { 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $remote_addr; 
proxy_set_header Host $host; 
proxy_pass http://localhost:8080; 
} 
} 
COMPANY CONFIDENTIAL 76 – DO NOT DISTRIBUTE #Dynatrace
IntegraNon 
COMPANY CONFIDENTIAL 77 – DO NOT DISTRIBUTE #Dynatrace
IntegraNon 
COMPANY CONFIDENTIAL 78 – DO NOT DISTRIBUTE #Dynatrace
Used 
Tools 
• Apache 
Benchmark 
• Dynatrace 
ApplicaNon 
Monitoring 
• Free 
Trial 
for 
30 
days 
• Free 
for 
developers 
on 
local 
machine 
• hjp://www.dynatrace.com 
hjp://bitly.com/djrial 
COMPANY CONFIDENTIAL 79 – DO NOT DISTRIBUTE #Dynatrace
harald.zeitlhofer@dynatrace.com 
@HZeitlhofer 
COMPANY CONFIDENTIAL 80 – DO NOT DISTRIBUTE #Dynatrace

More Related Content

What's hot

Promise of Push (HTTP/2 Web Performance)
Promise of Push (HTTP/2 Web Performance)Promise of Push (HTTP/2 Web Performance)
Promise of Push (HTTP/2 Web Performance)Colin Bendell
 
HTTP2:新的机遇与挑战
HTTP2:新的机遇与挑战HTTP2:新的机遇与挑战
HTTP2:新的机遇与挑战Jerry Qu
 
HAProxy scale out using open source
HAProxy scale out using open sourceHAProxy scale out using open source
HAProxy scale out using open sourceIngo Walz
 
Revisiting HTTP/2
Revisiting HTTP/2Revisiting HTTP/2
Revisiting HTTP/2Fastly
 
Kea DHCP – the new open source DHCP server from ISC
Kea DHCP – the new open source DHCP server from ISCKea DHCP – the new open source DHCP server from ISC
Kea DHCP – the new open source DHCP server from ISCMen and Mice
 
What's New in NGINX Plus R7?
What's New in NGINX Plus R7?What's New in NGINX Plus R7?
What's New in NGINX Plus R7?NGINX, Inc.
 
Building your own CDN using Amazon EC2
Building your own CDN using Amazon EC2Building your own CDN using Amazon EC2
Building your own CDN using Amazon EC2SergeyChernyshev
 
HTTP/2: What no one is telling you
HTTP/2: What no one is telling youHTTP/2: What no one is telling you
HTTP/2: What no one is telling youFastly
 
Developing the fastest HTTP/2 server
Developing the fastest HTTP/2 serverDeveloping the fastest HTTP/2 server
Developing the fastest HTTP/2 serverKazuho Oku
 
Revisiting HTTP/2
Revisiting HTTP/2Revisiting HTTP/2
Revisiting HTTP/2Fastly
 
Maximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINXMaximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINXNGINX, Inc.
 
Introduction to NGINX web server
Introduction to NGINX web serverIntroduction to NGINX web server
Introduction to NGINX web serverMd Waresul Islam
 
Web Server Load Balancer
Web Server Load BalancerWeb Server Load Balancer
Web Server Load BalancerMobME Technical
 
NGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPCNGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPCNGINX, Inc.
 
How happy they became with H2O/mruby and the future of HTTP
How happy they became with H2O/mruby and the future of HTTPHow happy they became with H2O/mruby and the future of HTTP
How happy they became with H2O/mruby and the future of HTTPIchito Nagata
 
HAProxy tech talk
HAProxy tech talkHAProxy tech talk
HAProxy tech talkicebourg
 
Choosing A Proxy Server - Apachecon 2014
Choosing A Proxy Server - Apachecon 2014Choosing A Proxy Server - Apachecon 2014
Choosing A Proxy Server - Apachecon 2014bryan_call
 
NGINX: Basics and Best Practices
NGINX: Basics and Best PracticesNGINX: Basics and Best Practices
NGINX: Basics and Best PracticesNGINX, Inc.
 

What's hot (19)

Promise of Push (HTTP/2 Web Performance)
Promise of Push (HTTP/2 Web Performance)Promise of Push (HTTP/2 Web Performance)
Promise of Push (HTTP/2 Web Performance)
 
HTTP2:新的机遇与挑战
HTTP2:新的机遇与挑战HTTP2:新的机遇与挑战
HTTP2:新的机遇与挑战
 
HAProxy scale out using open source
HAProxy scale out using open sourceHAProxy scale out using open source
HAProxy scale out using open source
 
Revisiting HTTP/2
Revisiting HTTP/2Revisiting HTTP/2
Revisiting HTTP/2
 
Kea DHCP – the new open source DHCP server from ISC
Kea DHCP – the new open source DHCP server from ISCKea DHCP – the new open source DHCP server from ISC
Kea DHCP – the new open source DHCP server from ISC
 
What's New in NGINX Plus R7?
What's New in NGINX Plus R7?What's New in NGINX Plus R7?
What's New in NGINX Plus R7?
 
Nginx
NginxNginx
Nginx
 
Building your own CDN using Amazon EC2
Building your own CDN using Amazon EC2Building your own CDN using Amazon EC2
Building your own CDN using Amazon EC2
 
HTTP/2: What no one is telling you
HTTP/2: What no one is telling youHTTP/2: What no one is telling you
HTTP/2: What no one is telling you
 
Developing the fastest HTTP/2 server
Developing the fastest HTTP/2 serverDeveloping the fastest HTTP/2 server
Developing the fastest HTTP/2 server
 
Revisiting HTTP/2
Revisiting HTTP/2Revisiting HTTP/2
Revisiting HTTP/2
 
Maximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINXMaximizing PHP Performance with NGINX
Maximizing PHP Performance with NGINX
 
Introduction to NGINX web server
Introduction to NGINX web serverIntroduction to NGINX web server
Introduction to NGINX web server
 
Web Server Load Balancer
Web Server Load BalancerWeb Server Load Balancer
Web Server Load Balancer
 
NGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPCNGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPC
 
How happy they became with H2O/mruby and the future of HTTP
How happy they became with H2O/mruby and the future of HTTPHow happy they became with H2O/mruby and the future of HTTP
How happy they became with H2O/mruby and the future of HTTP
 
HAProxy tech talk
HAProxy tech talkHAProxy tech talk
HAProxy tech talk
 
Choosing A Proxy Server - Apachecon 2014
Choosing A Proxy Server - Apachecon 2014Choosing A Proxy Server - Apachecon 2014
Choosing A Proxy Server - Apachecon 2014
 
NGINX: Basics and Best Practices
NGINX: Basics and Best PracticesNGINX: Basics and Best Practices
NGINX: Basics and Best Practices
 

Viewers also liked

Node.js and How JavaScript is Changing Server Programming
Node.js and How JavaScript is Changing Server Programming  Node.js and How JavaScript is Changing Server Programming
Node.js and How JavaScript is Changing Server Programming Tom Croucher
 
Software Architecture for DevOps and Continuous Delivery
Software Architecture for DevOps and Continuous DeliverySoftware Architecture for DevOps and Continuous Delivery
Software Architecture for DevOps and Continuous DeliveryEberhard Wolff
 
Java Application Servers Are Dead!
Java Application Servers Are Dead!Java Application Servers Are Dead!
Java Application Servers Are Dead!Eberhard Wolff
 
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsugSpring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsugToshiaki Maki
 
WAS vs JBoss, WebLogic, Tomcat (year 2015)
WAS vs JBoss, WebLogic, Tomcat (year 2015)WAS vs JBoss, WebLogic, Tomcat (year 2015)
WAS vs JBoss, WebLogic, Tomcat (year 2015)Roman Kharkovski
 
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)Roman Kharkovski
 

Viewers also liked (9)

Baymuratov jonibek
Baymuratov jonibekBaymuratov jonibek
Baymuratov jonibek
 
PHP Application Performance
PHP Application PerformancePHP Application Performance
PHP Application Performance
 
Nginx, PHP and Node.js
Nginx, PHP and Node.jsNginx, PHP and Node.js
Nginx, PHP and Node.js
 
Node.js and How JavaScript is Changing Server Programming
Node.js and How JavaScript is Changing Server Programming  Node.js and How JavaScript is Changing Server Programming
Node.js and How JavaScript is Changing Server Programming
 
Software Architecture for DevOps and Continuous Delivery
Software Architecture for DevOps and Continuous DeliverySoftware Architecture for DevOps and Continuous Delivery
Software Architecture for DevOps and Continuous Delivery
 
Java Application Servers Are Dead!
Java Application Servers Are Dead!Java Application Servers Are Dead!
Java Application Servers Are Dead!
 
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsugSpring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
 
WAS vs JBoss, WebLogic, Tomcat (year 2015)
WAS vs JBoss, WebLogic, Tomcat (year 2015)WAS vs JBoss, WebLogic, Tomcat (year 2015)
WAS vs JBoss, WebLogic, Tomcat (year 2015)
 
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
 

Similar to Nginx, PHP and Performance: Load Balancing and Caching

5 things you didn't know nginx could do velocity
5 things you didn't know nginx could do   velocity5 things you didn't know nginx could do   velocity
5 things you didn't know nginx could do velocitysarahnovotny
 
DevOPS training - Day 1/2
DevOPS training - Day 1/2DevOPS training - Day 1/2
DevOPS training - Day 1/2Vincent Mercier
 
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc  2015 HTTP 1, HTTP 2 and folksDevoxx Maroc  2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folksNicolas Martignole
 
NGINX Installation and Tuning
NGINX Installation and TuningNGINX Installation and Tuning
NGINX Installation and TuningNGINX, Inc.
 
Load Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS ClusterLoad Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS ClusterKevin Jones
 
Your Inner Sysadmin - MidwestPHP 2015
Your Inner Sysadmin - MidwestPHP 2015Your Inner Sysadmin - MidwestPHP 2015
Your Inner Sysadmin - MidwestPHP 2015Chris Tankersley
 
5 things you didn't know nginx could do
5 things you didn't know nginx could do5 things you didn't know nginx could do
5 things you didn't know nginx could dosarahnovotny
 
What’s New in NGINX Plus R16?
What’s New in NGINX Plus R16?What’s New in NGINX Plus R16?
What’s New in NGINX Plus R16?NGINX, Inc.
 
NGINX: High Performance Load Balancing
NGINX: High Performance Load BalancingNGINX: High Performance Load Balancing
NGINX: High Performance Load BalancingNGINX, Inc.
 
What is Nginx and Why You Should to Use it with Wordpress Hosting
What is Nginx and Why You Should to Use it with Wordpress HostingWhat is Nginx and Why You Should to Use it with Wordpress Hosting
What is Nginx and Why You Should to Use it with Wordpress HostingWPSFO Meetup Group
 
A Byte of Software Deployment
A Byte of Software DeploymentA Byte of Software Deployment
A Byte of Software DeploymentGong Haibing
 
Deploying Plack Web Applications: OSCON 2011
Deploying Plack Web Applications: OSCON 2011Deploying Plack Web Applications: OSCON 2011
Deploying Plack Web Applications: OSCON 2011Tatsuhiko Miyagawa
 
Your Inner Sysadmin - Tutorial (SunshinePHP 2015)
Your Inner Sysadmin - Tutorial (SunshinePHP 2015)Your Inner Sysadmin - Tutorial (SunshinePHP 2015)
Your Inner Sysadmin - Tutorial (SunshinePHP 2015)Chris Tankersley
 
NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...
NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...
NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...Dragos Dascalita Haut
 
20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part ITaien Wang
 
Apache Street Smarts Presentation (SANS 99)
Apache Street Smarts Presentation (SANS 99)Apache Street Smarts Presentation (SANS 99)
Apache Street Smarts Presentation (SANS 99)Michael Dobe, Ph.D.
 
Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...
Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...
Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...Chanaka Lasantha
 

Similar to Nginx, PHP and Performance: Load Balancing and Caching (20)

Running php on nginx
Running php on nginxRunning php on nginx
Running php on nginx
 
5 things you didn't know nginx could do velocity
5 things you didn't know nginx could do   velocity5 things you didn't know nginx could do   velocity
5 things you didn't know nginx could do velocity
 
Running PHP on nginx
Running PHP on nginxRunning PHP on nginx
Running PHP on nginx
 
DevOPS training - Day 1/2
DevOPS training - Day 1/2DevOPS training - Day 1/2
DevOPS training - Day 1/2
 
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc  2015 HTTP 1, HTTP 2 and folksDevoxx Maroc  2015 HTTP 1, HTTP 2 and folks
Devoxx Maroc 2015 HTTP 1, HTTP 2 and folks
 
NGINX Installation and Tuning
NGINX Installation and TuningNGINX Installation and Tuning
NGINX Installation and Tuning
 
Load Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS ClusterLoad Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS Cluster
 
Your Inner Sysadmin - MidwestPHP 2015
Your Inner Sysadmin - MidwestPHP 2015Your Inner Sysadmin - MidwestPHP 2015
Your Inner Sysadmin - MidwestPHP 2015
 
5 things you didn't know nginx could do
5 things you didn't know nginx could do5 things you didn't know nginx could do
5 things you didn't know nginx could do
 
What’s New in NGINX Plus R16?
What’s New in NGINX Plus R16?What’s New in NGINX Plus R16?
What’s New in NGINX Plus R16?
 
NGINX: High Performance Load Balancing
NGINX: High Performance Load BalancingNGINX: High Performance Load Balancing
NGINX: High Performance Load Balancing
 
What is Nginx and Why You Should to Use it with Wordpress Hosting
What is Nginx and Why You Should to Use it with Wordpress HostingWhat is Nginx and Why You Should to Use it with Wordpress Hosting
What is Nginx and Why You Should to Use it with Wordpress Hosting
 
A Byte of Software Deployment
A Byte of Software DeploymentA Byte of Software Deployment
A Byte of Software Deployment
 
Deploying Plack Web Applications: OSCON 2011
Deploying Plack Web Applications: OSCON 2011Deploying Plack Web Applications: OSCON 2011
Deploying Plack Web Applications: OSCON 2011
 
Your Inner Sysadmin - Tutorial (SunshinePHP 2015)
Your Inner Sysadmin - Tutorial (SunshinePHP 2015)Your Inner Sysadmin - Tutorial (SunshinePHP 2015)
Your Inner Sysadmin - Tutorial (SunshinePHP 2015)
 
FreeBSD and Hardening Web Server
FreeBSD and Hardening Web ServerFreeBSD and Hardening Web Server
FreeBSD and Hardening Web Server
 
NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...
NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...
NGINX.conf 2016 - Fail in order to succeed ! Designing Microservices for fail...
 
20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I
 
Apache Street Smarts Presentation (SANS 99)
Apache Street Smarts Presentation (SANS 99)Apache Street Smarts Presentation (SANS 99)
Apache Street Smarts Presentation (SANS 99)
 
Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...
Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...
Configuring apache, php, my sql, ftp, ssl, ip tables phpmyadmin and server mo...
 

More from Harald Zeitlhofer

Slow Database in your PHP stack? Don't blame the DBA!
Slow Database in your PHP stack? Don't blame the DBA!Slow Database in your PHP stack? Don't blame the DBA!
Slow Database in your PHP stack? Don't blame the DBA!Harald Zeitlhofer
 
Boost your website by running PHP on Nginx
Boost your website by running PHP on NginxBoost your website by running PHP on Nginx
Boost your website by running PHP on NginxHarald Zeitlhofer
 
PHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on NginxPHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on NginxHarald Zeitlhofer
 
Running PHP on Nginx / PHP wgtn
Running PHP on Nginx / PHP wgtnRunning PHP on Nginx / PHP wgtn
Running PHP on Nginx / PHP wgtnHarald Zeitlhofer
 
PHP App Performance / Sydney PHP
PHP App Performance / Sydney PHPPHP App Performance / Sydney PHP
PHP App Performance / Sydney PHPHarald Zeitlhofer
 
Nginx performance monitoring with Dynatrace
Nginx performance monitoring with DynatraceNginx performance monitoring with Dynatrace
Nginx performance monitoring with DynatraceHarald Zeitlhofer
 
Performance optimisation - scaling a hobby project to serious business
Performance optimisation - scaling a hobby project to serious businessPerformance optimisation - scaling a hobby project to serious business
Performance optimisation - scaling a hobby project to serious businessHarald Zeitlhofer
 

More from Harald Zeitlhofer (12)

Slow Database in your PHP stack? Don't blame the DBA!
Slow Database in your PHP stack? Don't blame the DBA!Slow Database in your PHP stack? Don't blame the DBA!
Slow Database in your PHP stack? Don't blame the DBA!
 
Scaling PHP web apps
Scaling PHP web appsScaling PHP web apps
Scaling PHP web apps
 
PHP and databases
PHP and databasesPHP and databases
PHP and databases
 
Boost your website by running PHP on Nginx
Boost your website by running PHP on NginxBoost your website by running PHP on Nginx
Boost your website by running PHP on Nginx
 
Running PHP on Nginx
Running PHP on NginxRunning PHP on Nginx
Running PHP on Nginx
 
Improve Magento Performance
Improve Magento PerformanceImprove Magento Performance
Improve Magento Performance
 
PHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on NginxPHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on Nginx
 
Running PHP on Nginx / PHP wgtn
Running PHP on Nginx / PHP wgtnRunning PHP on Nginx / PHP wgtn
Running PHP on Nginx / PHP wgtn
 
PHP App Performance / Sydney PHP
PHP App Performance / Sydney PHPPHP App Performance / Sydney PHP
PHP App Performance / Sydney PHP
 
PHP application performance
PHP application performancePHP application performance
PHP application performance
 
Nginx performance monitoring with Dynatrace
Nginx performance monitoring with DynatraceNginx performance monitoring with Dynatrace
Nginx performance monitoring with Dynatrace
 
Performance optimisation - scaling a hobby project to serious business
Performance optimisation - scaling a hobby project to serious businessPerformance optimisation - scaling a hobby project to serious business
Performance optimisation - scaling a hobby project to serious business
 

Recently uploaded

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 

Recently uploaded (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 

Nginx, PHP and Performance: Load Balancing and Caching

  • 1. Nginx, PHP, Apache and Spelix Harald Zeitlhofer October 2014 COMPANY CONFIDENTIAL 1 – DO NOT DISTRIBUTE #Dynatrace
  • 2. Harald Zeitlhofer • Technology Strategist at Dynatrace • PHP for more than 15 years • Married, 2 kids • Love to discover new things COMPANY CONFIDENTIAL 2 – DO NOT DISTRIBUTE #Dynatrace
  • 3. Austria COMPANY CONFIDENTIAL 3 – DO NOT DISTRIBUTE #Dynatrace
  • 4. Where I’m from… COMPANY CONFIDENTIAL 4 – DO NOT DISTRIBUTE #Dynatrace
  • 5. COMPANY CONFIDENTIAL 5 – DO NOT DISTRIBUTE #Dynatrace
  • 6. Agenda • MoNvaNon • Nginx • PHP-­‐FPM • IntegraNon • Caching • Load balancing • How this runs in Spelix COMPANY CONFIDENTIAL 6 – DO NOT DISTRIBUTE #Dynatrace
  • 7. Nginx COMPANY CONFIDENTIAL 7 – DO NOT DISTRIBUTE #Dynatrace
  • 8. • Lightweight HTTP server • Fast especially at high load COMPANY CONFIDENTIAL 8 – DO NOT DISTRIBUTE #Dynatrace
  • 9. Leading among top 10.000 websites COMPANY CONFIDENTIAL 9 – DO NOT DISTRIBUTE #Dynatrace
  • 10. COMPANY CONFIDENTIAL 10 – DO NOT DISTRIBUTE #Dynatrace
  • 11. Nginx SeTngs • /etc/nginx/nginx.conf # max_clients = worker_processes * worker_connections worker_processes [number of CPUs]; worker_connections 1024; COMPANY CONFIDENTIAL 11 – DO NOT DISTRIBUTE #Dynatrace
  • 12. Nginx High Load • /etc/sysctl.conf fs.file-max = 80000 • /etc/security/limits.conf • www-data soft nofile 40000 www-data hard nofile 70000 /etc/pam.d/su session required pam_limits.so • /etc/default/nginx ULIMIT="-n 40000" COMPANY CONFIDENTIAL 12 – DO NOT DISTRIBUTE #Dynatrace
  • 13. Nginx High Load worker_processes 8; worker_rlimit_nofile 40000; events { worker_connections 4096; multi_accept on; } • 32768 concurrent requests COMPANY CONFIDENTIAL 13 – DO NOT DISTRIBUTE #Dynatrace
  • 14. PHP FastCGI Process Manager COMPANY CONFIDENTIAL 14 – DO NOT DISTRIBUTE #Dynatrace
  • 15. PHP-­‐FPM • FastCGI Process Manager • Available since 5.3.3, stable since 5.4.1 • Run mulNple PHP worker processes to serve CGI requests • MulNple connecNon pools • Different php.ini files possible • Very helpful: fastcgi_finish_request() COMPANY CONFIDENTIAL 15 – DO NOT DISTRIBUTE #Dynatrace
  • 16. PHP-­‐FPM • InstallaNon sudo apt-get install php5-fpm • Pool configuraNon /etc/php5/fpm/pool.d/www.conf [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 COMPANY CONFIDENTIAL 16 – DO NOT DISTRIBUTE #Dynatrace
  • 17. PHP-­‐FPM • Process Manager [pool_name] ... pm = [dynamic/static] pm.max_children = 5 ; 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 COMPANY CONFIDENTIAL 17 – DO NOT DISTRIBUTE #Dynatrace
  • 18. PHP-­‐FPM • Security /etc/php5/fpm/php.ini expose_php = Off • Use mulNple configuraNons /etc/init.d/php-fpm start or php-fpm -y /path/to/your/php-fpm.conf -c /path/to/your/php.ini COMPANY CONFIDENTIAL 18 – DO NOT DISTRIBUTE #Dynatrace
  • 19. Nginx and PHP / IntegraNon COMPANY CONFIDENTIAL 19 – DO NOT DISTRIBUTE #Dynatrace
  • 20. Nginx and PHP • CommunicaNon 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; COMPANY CONFIDENTIAL 20 – DO NOT DISTRIBUTE #Dynatrace
  • 21. IntegraNon • StaNc content to be served by Nginx • Dynamic requests to be sent to PHP-­‐FPM server { listen 80; root /var/www/test; index index.php index.html index.htm; server_name test.whateveryourdomain.is; location / { try_files $uri $uri/ @notfound; } location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { try_files $uri @notfound; } location ~* .php$ { fastcgi_index index.php; fastcgi_pass php; include fastcgi_params; } locaation @notfound { ... } } COMPANY CONFIDENTIAL 21 – DO NOT DISTRIBUTE #Dynatrace
  • 22. Nginx – PHP transacNon flow COMPANY CONFIDENTIAL 22 – DO NOT DISTRIBUTE #Dynatrace
  • 23. PHAR – PHP Archives • Easy way to deploy your applicaNon • All source files packed into one *.phar file location ~* .(php|phar)$ { 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; } COMPANY CONFIDENTIAL 23 – DO NOT DISTRIBUTE #Dynatrace
  • 24. 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 Applicationn"; } } COMPANY CONFIDENTIAL 24 – DO NOT DISTRIBUTE #Dynatrace
  • 25. PHAR Example 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 location /myapp { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/myapp.phar; } COMPANY CONFIDENTIAL 25 – DO NOT DISTRIBUTE #Dynatrace
  • 26. PHAR execuNon COMPANY CONFIDENTIAL 26 – DO NOT DISTRIBUTE #Dynatrace
  • 27. Performance COMPANY CONFIDENTIAL 27 – DO NOT DISTRIBUTE #Dynatrace
  • 28. Benchmarking Nginx vs Apache • Nginx running with default seTngs • Apache • AllowOverride None • MulN-­‐process mode to allow usage of mod_php COMPANY CONFIDENTIAL 28 – DO NOT DISTRIBUTE #Dynatrace
  • 29. StaNc HTML, 10k requests, concurrency 10 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 10 Time taken for tests: 6.848 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2660000 bytes HTML transferred: 210000 bytes Requests per second: 1460.25 [#/sec] (mean) Time per request: 6.848 [ms] (mean) Time per request: 0.685 [ms] (mean, across all concurrent requests) Transfer rate: 379.32 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 0.9 2 24 Processing: 1 4 1.5 4 26 Waiting: 0 3 1.3 3 24 Total: 2 7 1.7 6 32 Percentage of the requests served within a certain time (ms) 50% 6 66% 7 75% 7 80% 7 90% 8 95% 9 98% 10 99% 12 100% 32 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 10 Time taken for tests: 4.991 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2600000 bytes HTML transferred: 210000 bytes Requests per second: 2003.41 [#/sec] (mean) Time per request: 4.991 [ms] (mean) Time per request: 0.499 [ms] (mean, across all concurrent requests) Transfer rate: 508.68 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 1.1 2 31 Processing: 1 3 2.0 3 38 Waiting: 0 2 1.7 2 34 Total: 1 5 2.2 5 41 Percentage of the requests served within a certain time (ms) 50% 5 66% 5 75% 5 80% 6 90% 6 95% 7 98% 9 99% 12 100% 41 (longest request) COMPANY CONFIDENTIAL 29 – DO NOT DISTRIBUTE #Dynatrace
  • 30. StaNc HTML, 10k requests, concurrency 100 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 100 Time taken for tests: 5.329 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2660000 bytes HTML transferred: 210000 bytes Requests per second: 1876.35 [#/sec] (mean) Time per request: 53.295 [ms] (mean) Time per request: 0.533 [ms] (mean, across all concurrent requests) Transfer rate: 487.41 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 8 4.5 8 54 Processing: 15 45 18.5 51 120 Waiting: 12 42 18.7 49 108 Total: 26 53 18.2 58 132 Percentage of the requests served within a certain time (ms) 50% 58 66% 60 75% 62 80% 64 90% 69 95% 87 98% 99 99% 105 100% 132 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 100 Time taken for tests: 4.908 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2600000 bytes HTML transferred: 210000 bytes Requests per second: 2037.64 [#/sec] (mean) Time per request: 49.076 [ms] (mean) Time per request: 0.491 [ms] (mean, across all concurrent requests) Transfer rate: 517.37 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 9 23 4.4 23 40 Processing: 8 25 5.1 25 48 Waiting: 2 19 4.6 18 41 Total: 22 49 6.4 47 75 Percentage of the requests served within a certain time (ms) 50% 47 66% 50 75% 52 80% 54 90% 58 95% 61 98% 64 99% 65 100% 75 (longest request) COMPANY CONFIDENTIAL 30 – DO NOT DISTRIBUTE #Dynatrace
  • 31. StaNc HTML, 10k requests, concurrency 500 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 500 Time taken for tests: 7.628 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2660000 bytes HTML transferred: 210000 bytes Requests per second: 1310.89 [#/sec] (mean) Time per request: 381.421 [ms] (mean) Time per request: 0.763 [ms] (mean, across all concurrent requests) Transfer rate: 340.52 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 2 67 263.3 16 3050 Processing: 28 246 814.5 95 6605 Waiting: 21 240 814.9 90 6599 Total: 70 312 870.2 113 7556 Percentage of the requests served within a certain time (ms) 50% 113 66% 130 75% 147 80% 158 90% 364 95% 1111 98% 3100 99% 6637 100% 7556 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 500 Time taken for tests: 4.306 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2600000 bytes HTML transferred: 210000 bytes Requests per second: 2322.27 [#/sec] (mean) Time per request: 215.307 [ms] (mean) Time per request: 0.431 [ms] (mean, across all concurrent requests) Transfer rate: 589.64 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 47 100 32.0 97 185 Processing: 50 110 36.1 108 231 Waiting: 20 82 30.3 76 188 Total: 119 210 57.8 220 334 Percentage of the requests served within a certain time (ms) 50% 220 66% 248 75% 265 80% 271 90% 285 95% 293 98% 303 99% 306 100% 334 (longest request) COMPANY CONFIDENTIAL 31 – DO NOT DISTRIBUTE #Dynatrace
  • 32. StaNc HTML, 10k requests, concurrency 1k Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 1000 Time taken for tests: 9.778 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2660000 bytes HTML transferred: 210000 bytes Requests per second: 1022.74 [#/sec] (mean) Time per request: 977.769 [ms] (mean) Time per request: 0.978 [ms] (mean, across all concurrent requests) Transfer rate: 265.67 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 28 179 403.5 69 3106 Processing: 39 452 1262.7 117 6677 Waiting: 22 427 1267.6 91 6672 Total: 107 631 1447.3 182 9619 Percentage of the requests served within a certain time (ms) 50% 182 66% 203 75% 258 80% 422 90% 1178 95% 3190 98% 7622 99% 7643 100% 9619 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.html Document Length: 21 bytes Concurrency Level: 1000 Time taken for tests: 5.302 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 2600000 bytes HTML transferred: 210000 bytes Requests per second: 1886.22 [#/sec] (mean) Time per request: 530.160 [ms] (mean) Time per request: 0.530 [ms] (mean, across all concurrent requests) Transfer rate: 478.92 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 138 238 50.5 229 370 Processing: 72 269 59.7 257 514 Waiting: 62 195 58.3 184 377 Total: 338 507 56.0 518 651 Percentage of the requests served within a certain time (ms) 50% 518 66% 541 75% 547 80% 551 90% 573 95% 580 98% 623 99% 638 100% 651 (longest request) COMPANY CONFIDENTIAL 32 – DO NOT DISTRIBUTE #Dynatrace
  • 33. Apache vs Nginx (StaNc HTML) 12 10 8 6 4 2 0 Apache/2.4.7 nginx/1.4.6 10 100 500 1000 COMPANY CONFIDENTIAL 33 – DO NOT DISTRIBUTE #Dynatrace
  • 34. Image 841 bytes, 10k requests, concurrency 500 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /images/plus.gif Document Length: 841 bytes Concurrency Level: 500 Time taken for tests: 8.036 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 10880000 bytes HTML transferred: 8410000 bytes Requests per second: 1244.35 [#/sec] (mean) Time per request: 401.817 [ms] (mean) Time per request: 0.804 [ms] (mean, across all concurrent requests) Transfer rate: 1322.12 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 63 273.3 7 3046 Processing: 19 229 815.9 80 6596 Waiting: 16 227 816.0 78 6596 Total: 54 293 881.4 88 7561 Percentage of the requests served within a certain time (ms) 50% 88 66% 95 75% 104 80% 109 90% 318 95% 1094 98% 3289 99% 6623 100% 7561 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /images/plus.gif Document Length: 841 bytes Concurrency Level: 500 Time taken for tests: 5.239 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 10820000 bytes HTML transferred: 8410000 bytes Requests per second: 1908.76 [#/sec] (mean) Time per request: 261.950 [ms] (mean) Time per request: 0.524 [ms] (mean, across all concurrent requests) Transfer rate: 2016.87 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 55 119 22.0 118 183 Processing: 32 137 27.8 132 260 Waiting: 29 101 25.4 96 202 Total: 156 255 28.1 258 351 Percentage of the requests served within a certain time (ms) 50% 258 66% 268 75% 275 80% 281 90% 288 95% 298 98% 310 99% 317 100% 351 (longest request) COMPANY CONFIDENTIAL 34 – DO NOT DISTRIBUTE #Dynatrace
  • 35. PHP, 1k requests, concurrency 500 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.php Document Length: 12 bytes Concurrency Level: 500 Time taken for tests: 13.298 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 199000 bytes HTML transferred: 12000 bytes Requests per second: 75.20 [#/sec] (mean) Time per request: 6649.092 [ms] (mean) Time per request: 13.298 [ms] (mean, across all concurrent requests) Transfer rate: 14.61 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 25 30.0 1 68 Processing: 70 2344 4333.5 167 13205 Waiting: 69 2343 4333.4 165 13204 Total: 124 2369 4352.0 171 13264 Percentage of the requests served within a certain time (ms) 50% 171 66% 211 75% 415 80% 7240 90% 13156 95% 13208 98% 13249 99% 13257 100% 13264 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.php Document Length: 12 bytes Concurrency Level: 500 Time taken for tests: 3.230 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 178000 bytes HTML transferred: 12000 bytes Requests per second: 309.56 [#/sec] (mean) Time per request: 1615.213 [ms] (mean) Time per request: 3.230 [ms] (mean, across all concurrent requests) Transfer rate: 53.81 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 45 44.7 71 106 Processing: 72 643 708.7 204 3057 Waiting: 69 643 708.8 203 3057 Total: 163 688 732.1 227 3133 Percentage of the requests served within a certain time (ms) 50% 227 66% 1147 75% 1215 80% 1249 90% 1380 95% 1433 98% 3128 99% 3131 100% 3133 (longest request) COMPANY CONFIDENTIAL 35 – DO NOT DISTRIBUTE #Dynatrace
  • 36. PHP, 1k requests, concurrency 100 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.php Document Length: 12 bytes Concurrency Level: 100 Time taken for tests: 1.233 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 199000 bytes HTML transferred: 12000 bytes Requests per second: 810.72 [#/sec] (mean) Time per request: 123.348 [ms] (mean) Time per request: 1.233 [ms] (mean, across all concurrent requests) Transfer rate: 157.55 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 3 7.4 1 34 Processing: 34 112 23.2 107 250 Waiting: 29 111 22.8 106 249 Total: 49 116 22.6 109 250 Percentage of the requests served within a certain time (ms) 50% 109 66% 115 75% 126 80% 133 90% 151 95% 157 98% 171 99% 192 100% 250 (longest request) Server Software: nginx/1.4.6 Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.php Document Length: 12 bytes Concurrency Level: 100 Time taken for tests: 1.628 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 178000 bytes HTML transferred: 12000 bytes Requests per second: 614.15 [#/sec] (mean) Time per request: 162.826 [ms] (mean) Time per request: 1.628 [ms] (mean, across all concurrent requests) Transfer rate: 106.76 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 5 10.3 1 76 Processing: 15 149 35.4 158 210 Waiting: 15 147 34.7 157 208 Total: 39 154 29.0 160 211 Percentage of the requests served within a certain time (ms) 50% 160 66% 168 75% 173 80% 177 90% 185 95% 193 98% 200 99% 204 100% 211 (longest request) COMPANY CONFIDENTIAL 36 – DO NOT DISTRIBUTE #Dynatrace
  • 37. Apache vs Nginx -­‐ conclusion • Nginx faster for serving staNc files • Apache is faster for serving PHP only (low load) COMPANY CONFIDENTIAL 37 – DO NOT DISTRIBUTE #Dynatrace
  • 38. Nginx, Apache and PHP COMPANY CONFIDENTIAL 38 – DO NOT DISTRIBUTE #Dynatrace
  • 39. Nginx, Apache and PHP COMPANY CONFIDENTIAL 39 – DO NOT DISTRIBUTE #Dynatrace
  • 40. Nginx – more performance tweaks • Setup caching and disable access logging location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { expires 30d; access_log off; error_log off; try_files $uri $uri/ =404; } • Change Nmeouts http { keepalive_timeout 15; client_body_timeout 12; client_header_timeout 12; send_timeout 10; } COMPANY CONFIDENTIAL 40 – DO NOT DISTRIBUTE #Dynatrace
  • 41. Caching COMPANY CONFIDENTIAL 41 – DO NOT DISTRIBUTE #Dynatrace
  • 42. Caching • Server Side • Opcode cache • Full page cache • Pagelet cache • Data cache • Client Side • Browser cache • HTML5 applicaNon cache • HTML5 data storage (LocalStorage, SessionStorage) COMPANY CONFIDENTIAL 42 – DO NOT DISTRIBUTE #Dynatrace
  • 43. PHP Opcode Cache • Integrated Zend OpCache in PHP 5.5 • Other technologies available hjp://en.wikipedia.org/wiki/List_of_PHP_accelerators COMPANY CONFIDENTIAL 43 – DO NOT DISTRIBUTE #Dynatrace
  • 44. PHP OpCache example COMPANY CONFIDENTIAL 44 – DO NOT DISTRIBUTE #Dynatrace
  • 45. PHP OpCache disabled COMPANY CONFIDENTIAL 45 – DO NOT DISTRIBUTE #Dynatrace
  • 46. PHP OpCache enabled COMPANY CONFIDENTIAL 46 – DO NOT DISTRIBUTE #Dynatrace
  • 47. Full page cache with Nginx and Memcached • ngx_hjp_memcached_module server { location / { set $memcached_key "$uri"; memcached_pass host:11211; error_page 404 502 504 = @fallback; } location @fallback { proxy_pass http://backend; } } COMPANY CONFIDENTIAL 47 – DO NOT DISTRIBUTE #Dynatrace
  • 48. Full page cache with Nginx and Memcached • PHP $ sudo apt-get install php5-memcached <?php … function cachePage($content) { $c = new Memcached(); $c->addServer('localhost',11211); $c->set($_SERVER[”REQUEST_URI"], $content); } ... $content = $this->renderPage(); $this->cachePage($content); ... ?> COMPANY CONFIDENTIAL 48 – DO NOT DISTRIBUTE #Dynatrace
  • 49. PHP, 5k requests, concurrency 100 Server Software: Nginx + PHP Server Hostname: test.hzvm01 Server Port: 80 Document Path: /index.php Document Length: 10 bytes Concurrency Level: 100 Time taken for tests: 4.514 seconds Complete requests: 5000 Failed requests: 0 Total transferred: 625000 bytes HTML transferred: 50000 bytes Requests per second: 1107.62 [#/sec] (mean) Time per request: 90.284 [ms] (mean) Time per request: 0.903 [ms] (mean, across all concurrent requests) Transfer rate: 135.21 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 3.2 1 38 Processing: 22 88 13.1 87 148 Waiting: 21 87 13.1 86 148 Total: 42 89 12.5 88 148 Percentage of the requests served within a certain time (ms) 50% 88 66% 94 75% 97 80% 98 90% 104 95% 109 98% 125 99% 132 100% 148 (longest request) COMPANY CONFIDENTIAL 49 – DO NOT DISTRIBUTE #Dynatrace
  • 50. PHP, 5k requests, concurrency 100 Server Software: Nginx + Apache + PHP Server Hostname: test.hzvm01 Server Port: 81 Document Path: /index.php Document Length: 10 bytes Concurrency Level: 100 Time taken for tests: 9.207 seconds Complete requests: 5000 Failed requests: 0 Total transferred: 905000 bytes HTML transferred: 50000 bytes Requests per second: 543.05 [#/sec] (mean) Time per request: 184.146 [ms] (mean) Time per request: 1.841 [ms] (mean, across all concurrent requests) Transfer rate: 95.99 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 10 17.0 2 138 Processing: 20 173 73.7 156 1254 Waiting: 19 168 72.3 152 1239 Total: 55 182 72.4 168 1254 Percentage of the requests served within a certain time (ms) 50% 168 66% 197 75% 214 80% 224 90% 256 95% 287 98% 337 99% 427 100% 1254 (longest request) COMPANY CONFIDENTIAL 50 – DO NOT DISTRIBUTE #Dynatrace
  • 51. PHP, 5k requests, concurrency 100 Server Software: Apache/2.4.7 Server Hostname: test.hzvm01 Server Port: 88 Document Path: /index.php Document Length: 10 bytes Concurrency Level: 100 Time taken for tests: 7.296 seconds Complete requests: 5000 Failed requests: 0 Total transferred: 985000 bytes HTML transferred: 50000 bytes Requests per second: 685.31 [#/sec] (mean) Time per request: 145.920 [ms] (mean) Time per request: 1.459 [ms] (mean, across all concurrent requests) Transfer rate: 131.84 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 6 6.5 4 56 Processing: 30 138 57.2 120 938 Waiting: 30 135 56.4 117 937 Total: 55 144 55.8 126 938 Percentage of the requests served within a certain time (ms) 50% 126 66% 151 75% 168 80% 178 90% 218 95% 239 98% 267 99% 299 100% 938 (longest request) COMPANY CONFIDENTIAL 51 – DO NOT DISTRIBUTE #Dynatrace
  • 52. PHP, 5k requests, concurrency 100 Server Software: nginx + Memcached Server Hostname: test.hzvm01 Server Port: 82 Document Path: /index.php Document Length: 23 bytes Concurrency Level: 100 Time taken for tests: 3.058 seconds Complete requests: 5000 Failed requests: 0 Total transferred: 865000 bytes HTML transferred: 115000 bytes Requests per second: 1634.92 [#/sec] (mean) Time per request: 61.165 [ms] (mean) Time per request: 0.612 [ms] (mean, across all concurrent requests) Transfer rate: 276.21 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 7 24 6.0 24 59 Processing: 8 36 7.8 36 75 Waiting: 6 28 7.4 29 69 Total: 32 60 9.3 60 101 Percentage of the requests served within a certain time (ms) 50% 60 66% 63 75% 64 80% 66 90% 71 95% 80 98% 87 99% 92 100% 101 (longest request) COMPANY CONFIDENTIAL 52 – DO NOT DISTRIBUTE #Dynatrace
  • 53. Nginx FastCGI cache • Part of the Nginx FastCGI module 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; } COMPANY CONFIDENTIAL 53 – DO NOT DISTRIBUTE #Dynatrace
  • 54. TesNng FastCGI cache <?php echo time()."n"; ?> root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229911 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229912 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229915 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229917 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229919 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229921 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229923 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229925 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229927 root@hzvm01:/var/www/test# curl http://test.hzvm01/index.php 1413229929 COMPANY CONFIDENTIAL 54 – DO NOT DISTRIBUTE #Dynatrace
  • 55. TesNng FastCGI cache COMPANY CONFIDENTIAL 55 – DO NOT DISTRIBUTE #Dynatrace
  • 56. TesNng FastCGI cache • Config for cached requests running on port 83 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 root@hzvm01:/var/www/test# curl http://test.hzvm01:83/index.php 1413230226 COMPANY CONFIDENTIAL 56 – DO NOT DISTRIBUTE #Dynatrace
  • 57. TesNng FastCGI cache COMPANY CONFIDENTIAL 57 – DO NOT DISTRIBUTE #Dynatrace
  • 58. TesNng FastCGI cache COMPANY CONFIDENTIAL 58 – DO NOT DISTRIBUTE #Dynatrace
  • 59. Pagelet / Data cache • Served by webserver or applicaNon • Technologies • Memcached • FastCGI cache • APC (alternaNve PHP cache) • Redis COMPANY CONFIDENTIAL 59 – DO NOT DISTRIBUTE #Dynatrace
  • 60. Client Side Caching location ~ .(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { expires 30d; access_log off; error_log off; try_files $uri $uri/ =404; } • HTML5 • applicaNon cache • LocalStorage • SessionStorage COMPANY CONFIDENTIAL 60 – DO NOT DISTRIBUTE #Dynatrace
  • 61. PHP, 5k requests, concurrency 100 Server Software: Nginx + FastCGI cache Server Hostname: test.hzvm01 Server Port: 83 Document Path: /index.php Document Length: 32 bytes Concurrency Level: 100 Time taken for tests: 2.545 seconds Complete requests: 5000 Failed requests: 0 Total transferred: 735000 bytes HTML transferred: 160000 bytes Requests per second: 1964.62 [#/sec] (mean) Time per request: 50.900 [ms] (mean) Time per request: 0.509 [ms] (mean, across all concurrent requests) Transfer rate: 282.03 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 11 23 5.3 22 46 Processing: 8 27 6.7 25 59 Waiting: 6 20 6.0 18 56 Total: 29 50 7.6 50 85 Percentage of the requests served within a certain time (ms) 50% 50 66% 53 75% 55 80% 56 90% 61 95% 64 98% 67 99% 71 100% 85 (longest request) COMPANY CONFIDENTIAL 61 – DO NOT DISTRIBUTE #Dynatrace
  • 62. Load balancing • ngx_hjp_upstream_module upstream php_loadbalancer { 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; } } COMPANY CONFIDENTIAL 62 – DO NOT DISTRIBUTE #Dynatrace
  • 63. Load balancing COMPANY CONFIDENTIAL 63 – DO NOT DISTRIBUTE #Dynatrace
  • 64. Nginx and other technologies COMPANY CONFIDENTIAL 64 – DO NOT DISTRIBUTE #Dynatrace
  • 65. Nginx security server_tokens off; location ~ /. { access_log off; log_not_found off; deny all; } COMPANY CONFIDENTIAL 65 – DO NOT DISTRIBUTE #Dynatrace
  • 66. Spelix COMPANY CONFIDENTIAL 66 – DO NOT DISTRIBUTE #Dynatrace
  • 67. Spelix COMPANY CONFIDENTIAL 67 – DO NOT DISTRIBUTE #Dynatrace
  • 68. COMPANY CONFIDENTIAL 68 – DO NOT DISTRIBUTE #Dynatrace
  • 69. COMPANY CONFIDENTIAL 69 – DO NOT DISTRIBUTE #Dynatrace
  • 70. COMPANY CONFIDENTIAL 70 – DO NOT DISTRIBUTE #Dynatrace
  • 71. COMPANY CONFIDENTIAL 71 – DO NOT DISTRIBUTE #Dynatrace
  • 72. COMPANY CONFIDENTIAL 72 – DO NOT DISTRIBUTE #Dynatrace
  • 73. Spelix Technology • PHP ApplicaNon • MySQL • CouchDB • Memcached • Nginx + PHP-­‐FPM • HTML5 (LocalStorage, Canvas, ApplicaNon Cache) • JavaScript (jQuery, Leaflet API) COMPANY CONFIDENTIAL 73 – DO NOT DISTRIBUTE #Dynatrace
  • 74. Spelix COMPANY CONFIDENTIAL 74 – DO NOT DISTRIBUTE #Dynatrace
  • 75. Nginx and other technologies COMPANY CONFIDENTIAL 75 – DO NOT DISTRIBUTE #Dynatrace
  • 76. Nginx and other technologies server { server_name services.zitco.net; listen 80; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://localhost:8080; } } COMPANY CONFIDENTIAL 76 – DO NOT DISTRIBUTE #Dynatrace
  • 77. IntegraNon COMPANY CONFIDENTIAL 77 – DO NOT DISTRIBUTE #Dynatrace
  • 78. IntegraNon COMPANY CONFIDENTIAL 78 – DO NOT DISTRIBUTE #Dynatrace
  • 79. Used Tools • Apache Benchmark • Dynatrace ApplicaNon Monitoring • Free Trial for 30 days • Free for developers on local machine • hjp://www.dynatrace.com hjp://bitly.com/djrial COMPANY CONFIDENTIAL 79 – DO NOT DISTRIBUTE #Dynatrace
  • 80. harald.zeitlhofer@dynatrace.com @HZeitlhofer COMPANY CONFIDENTIAL 80 – DO NOT DISTRIBUTE #Dynatrace