Running PHP on Nginx / PHP wgtn
-
Upload
harald-zeitlhofer -
Category
Technology
-
view
130 -
download
2
Transcript of Running PHP on Nginx / PHP wgtn
1
Tips%and%tricks%for%high%performance%websites%
Harald%Zeitlhofer%April%2015%
%
Boost%your%website%by%running%PHP%on%Nginx%
@HZeitlhofer%[email protected]%
%
2
• Technology%Strategist%at%Dynatrace%• Database%and%Web%Development%
• PHP%for%more%than%15%years%
• Love%to%discover%new%things%
Harald%Zeitlhofer%
3
I’m%from%Austria%
4
Also%from%Austria%
5
6
But%%
probably%
you%%
already%
know%%
that%...%
7
Web%ApplicaMons%
8
9
Modern%Web%Pages:%lots%of%staMc%content%
434#Resources#in%total%on%that%page:%230%JPEGs,%75%PNGs,%50%GIFs,%…%
10
cached%content%
can%sMll%create%roundtrips%%to%the%network!%
11
Web%Request%handling%
12
Web%Request%handling%
13
Tips and tricks for high performance websites
14
Web%Request%handling%
15
Leading%among%%top%10.000%websites%
16
PHP%run%modes%
Apache%Module%
– tradiMonal%approach%– used%for%most%PHP%environments%
PHP[FPM%
– PHP%applicaMon%server%– run%mulMple%PHP%worker%processes%to%
serve%FastCGI%requests%
HHVM%
– Virtual%machine%for%HipHop%
– fast%PHP%engine%– can%serve%FastCGI%requests%%
%
17
PHP[FPM%FastCGI%Process%Manager%%%
Available%since%5.3.3%
Stable%since%5.4.1%
%%%
18
• InstallaMon%%
• Pool%configuraMon%/etc/php5/fpm/pool.d/www.conf
PHP[FPM%
[www] user = www-data group = www-data listen = 127.0.0.1:9000 # for Unix socket: unix:/var/run/php5-fpm.sock;
root@hzvm01:/etc/nginx/sites-enabled# ps -ef | grep php root 6435 1 0 14:39 ? 00:00:32 php-fpm: master process (/etc/php5/fpm/php-fpm.conf) spelix 6439 6435 0 14:39 ? 00:00:00 php-fpm: pool batch spelix 6440 6435 0 14:39 ? 00:00:00 php-fpm: pool batch www-data 10576 6435 1 18:45 ? 00:00:48 php-fpm: pool www www-data 10920 6435 1 18:47 ? 00:00:47 php-fpm: pool www www-data 10927 6435 1 18:47 ? 00:00:46 php-fpm: pool www
sudo apt-get install php5-fpm
19
HHVM%HipHop%Virtual%Machine%
Facebook's%PHP%engine%
JIT%compiler%
supports%PHP%and%Hack%
%
20
• InstallaMon%
%
• start%server% cd /your/root/folder hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000
echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list sudo apt-get update sudo apt-get install hhvm
hhvm --mode server -vServer.Type=fastcgi –vServer.FileSocket=/var/run/hhvm.sock
21
Nginx%
Lightweight%HTTP%server%
Event%based%request%handling%
Fast%especially%at%high%load%
Open%Source%project%(BSD)%%
Commercial%version%Nginx+%
22
/etc/nginx/nginx.conf%
%
%# max_clients = worker_processes * worker_connections worker_processes 8; # number of CPUs events { worker_connections 1024; multi_accept on; }
23
• StaMc%content%to%be%served%by%Nginx%
• Dynamic%requests%to%be%sent%to%PHP%
IntegraMon%
server { listen 80; server_name www.yourdomain.com; root /var/www/test; index index.php index.html index.htm;
location ~* \.(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { try_files $uri =404; }
location / { try_files $uri $uri/ =404; }
location ~* \.php$ {
fastcgi_index index.php; fastcgi_pass php; include fastcgi_params; }
}
24
CommunicaMon%via%sockets%
• TCP%vs%Unix%
• Unix%slightly%faster%when%used%on%localhost%
• Use%TCP%for%high%load%
location ~* \.php$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; }
fastcgi_pass unix:/var/run/php5-fpm.sock;
25
TransacMon%flow%
26
Nginx%and%Caching%
27
• Part%of%Nginx'%FastCGI%module%
Nginx%FastCGI%cache%
fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=APPKEY:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri";
location ~* \.php$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_cache APPKEY; fastcgi_cache_valid 200 60m; }
28
TesMng%FastCGI%cache%
29
TesMng%FastCGI%cache%
<?php echo time()."\n"; ?>
30
TesMng%FastCGI%cache%
<?php echo time()."\n"; ?>
31
Full%page%/%data%cache%with%Memcached%<?php ... function __construct () { $this->c = new Memcached(); $this->c->addServer('localhost',11211);
} function setCache ($key, $content) { $this->c->set($key, $content);
} ... // get HTML content $this->setCache($_SERVER['REQUEST_URI'], $this->renderPage()); ... // get JSON structure $this->setCache('/data/news/getlist', $this->getNewsList()); ... ?>
32
• ngx_hjp_memcached_module%
Full%page%/%data%cache%with%Nginx%and%Memcached%
upstream php { server unix:/var/run/php5-fpm.sock; } server { location / { set $memcached_key "$uri"; memcached_pass localhost:11211; error_page 404 502 504 = @notincache; } location @notincache { fastcgi_pass php; } }
33
PHP,%5k%requests,%concurrency%100%
0%
1%
2%
3%
4%
5%
6%
7%
8%
Apache+PHP% Nginx+PHP% Nginx+Memcached%
<?php echo "Hello World"; ?>
34
• set%HTTP%response%expires%header%
Client%Side%Caching%
location ~ \.(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { expires 90d; access_log off; error_log off; try_files $uri =404; }
35
• keep%handlers%for%requested%staMc%files%open%
Filehandle%Caching%
open_file_cache max=1000 inactive=5m; open_file_cache_valid 60s; open_file_cache_min_uses 5; open_file_cache_errors off;
36
Load%balancing%PHP%upstream php { ip_hash; server unix:/var/run/php5-fpm.sock weight=5; server 192.168.56.12:9000 weight=2; server 192.168.56.13:9000; server 192.168.56.14:9000 backup;
} server { listen 80; root /home/www/test; server_name test.hzvm01; location / { try_files $uri =405; } location ~ \.php$ { fastcgi_pass php; fastcgi_index index.php; include fastcgi_params; }
}
37
• Nginx%running%with%default%semngs%
• Apache%• AllowOverride%None%
• MulM[process%(prefork)%mode%%to%allow%usage%of%mod_php%
Benchmarking%Nginx%vs%Apache%
38
StaMc%HTML,%10k%requests%
0%
1%
2%
3%
4%
5%
6%
7%
8%
9%
100% 500% 1000% 2000%
Apache/2.4.9%
nginx/1.1.19%
concurrency%
Total%respo
nse%Mme%[sec]%
39
Performance%Monitoring%
40
Performance%Tools%
41
monitor'all'transac,ons'in'all'channels'
42
monitor'your'infrastructure'
43
process'monitoring'
44
iden,fy'response',me'hotspots'in'the'backend'
45 drill'down'to'find'the'root'cause'
46
• Load%Generator%%(Apache%Benchmark,%Selenium,%JMeter)%
• Firebug,%Google%Developer%Tools%Dynatrace%Ajax%EdiMon%
• Google%PageSpeed%• Dynatrace%Free%Trial%
• Free%trial%license%for%30%days%
• Free%personal%license%for%developers%
My%favorites%
hjp://bit.ly/djrial%
47
www.dynatrace.com%
Thank%you%!!!%
Harald'Zeitlhofer'Senior%Technology%Strategist%
#HZeitlhofer%[email protected]%
hjp://blog.dyntrace.com%