boost your website by running php on nginx

Post on 07-Apr-2017

1.093 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Boost your website by running PHP on NginxTips and tricks for high performance websites

Harald Zeitlhofer @HZeitlhoferharald.zeitlhofer@dynatrace.com

Harald Zeitlhofer

• Technology Strategist at Dynatrace• Database and Web Development• Love to discover new things

Tips and tricks for high performance websites

Once upon a time...

performance matters !!!

performance matters !!!

performance matters !!!

overloaded pages

Modern Web Pages: lots of static content

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

more than 20MB page size

Fifa.com during Worldcup 2014

http://blog.dynatrace.com/2014/05/21/is-the-fifa-world-cup-website-ready-for-the-tournament/

largest item on page:favicon.ico with 370 KB!!!

but also some heavyweightCSS and JS files with up to 288 KB!!!

• Expires• Last-Modified• Etag• Cache-Control

cached content

can still create roundtrips to the network!

Web Request handling

Web Request handling

PHP-FPMFastCGI Process Manager

Available since 5.3.3

Stable since 5.4.1

PHP-FPM• Installation

• Pool configuration/etc/php/7.0/fpm/pool.d/www.conf

[www]user = www-datagroup = www-datalisten = 127.0.0.1:9000 # for Unix socket: unix:/var/run/php7.0-fpm.sock;

root@hzvm01:/etc/nginx/sites-enabled# ps -ef | grep phproot 6435 1 0 14:39 ? 00:00:32 php-fpm: master process (/etc/php/7.0/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 php7.0-fpm

NginxLightweight HTTP serverEvent based request handlingOpen Source project (BSD) Development started in 2002 by Igor Sysoev to solve the c10k problemCommercial version NGINX Plus

Leading among top 100.000 websites

/etc/nginx/nginx.conf

# max_clients = worker_processes * worker_connections

worker_processes 8; # number of CPUs

pcre_jit on; # enable JIT for regex

events {worker_connections 1024;multi_accept on;

}

Integration• Static content served by Nginx• Dynamic requests sent to PHPserver {

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 127.0.0.1:9000; include fastcgi_params;

}}

Communication 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/php7.0-fpm.sock;

Transaction flow

URL rewrite

...RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-lRewriteRule ^(.+)$ index.php...

http://www.mysite.com/news/browse/2014 to be processed by index.php

URL rewrite

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

location / { try_files $uri $uri/ @missing;

}

location @missing { rewrite (.*) /index.php;

}

location ~ .php$ { fastcgi_index index.php; include fastcgi_params; fastcgi_pass unix:/var/run/php5-

fpm.sock;}

}

http://www.mysite.com/news/browse/2014 to be processed by index.php

URL rewriteusing Nginx/PHP-FPM there’s a better way:

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

location /images { try_files $uri =404;

}

location /scripts { try_files $uri =404;

}

location / { fastcgi_index index.php;

include fastcgi_params;fastcgi_param SCRIPT_FILENAME

/var/www/index.php;fastcgi_pass unix:/var/run/php5-fpm.sock;

}

}

<?php

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

Finish Web Request

<?php

do_some_processing();

render_page();

fastcgi_finish_request();

do_slower_stuff(Array(‘convert_uploaded_videos’,

‘post_to_social_media_platforms’,‘backup_data’,‘much more’

));

?>

Nginx and Caching

Nginx FastCGI cache• Part of 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;}

FastCGI cache in action<?phpecho time()."\n";?>

FastCGI cache in action<?phpecho time()."\n";?>

FastCGI cache in action<?phpecho time()."\n";?>

Full page 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$html = $this->renderPage();$this->setCache($_SERVER['REQUEST_URI'], $html);echo $html;...

?>

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 data structure$newslist = $this->getNewsList();$this->setCache('/data/news/getlist', json_encode($newslist));...

?>

Full page / data cache with Nginx and Memcached• ngx_http_memcached_module

server { location / {

set $memcached_key "$uri";memcached_pass localhost:11211;

error_page 404 502 504 = @notincache; }

location @notincache { fastcgi_pass unix:/var/run/php5-fpm.sock;

fastcgi_index index.php;include fastcgi_params;

}}

PHP, 5k requests, concurrency 100

Apache+PHP Nginx+PHP Nginx+Memcached0

1

2

3

4

5

6

7

8

<?php echo "Hello World";?>

7,28 4,6 3,05tota

l tim

e in

sec

Caching Static Content• set HTTP response expires header

location ~ \.(html|js|css|gif|jpg|jpe|jpeg|png|bmp|tif|pdf|ico)$ { expires 365d; access_log off; error_log off; log_not_found off; add_header Cache-Control "public"; try_files $uri =404;}

Filehandle Caching• keep handlers for requested static files open

open_file_cache max=1000 inactive=5m;open_file_cache_valid 60s;open_file_cache_min_uses 5;open_file_cache_errors off;

FastCGI request forwardingserver {

listen 80;root /var/www/mysite;server_name www.mysite.com;location / {

try_files $uri =405;}location ~ \.php$ {

fastcgi_pass 192.168.56.12:9000;fastcgi_index index.php;include fastcgi_params;

}}

FastCGI request forwardingupstream php {

server 192.168.56.12:9000;}

server {listen 80;root /var/www/mysite;server_name www.mysite.com;location / {

try_files $uri =405;}location ~ \.php$ {

fastcgi_pass php;fastcgi_index index.php;include fastcgi_params;

}}

Load balancingupstream 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 /var/www/mysite;server_name www.mysite.com;location / {

try_files $uri =405;}location ~ \.php$ {

fastcgi_pass php;fastcgi_index index.php;include fastcgi_params;

}}

High scalability

High availability

Performance

Maintainability

desktop traffic

response time

slow response time

traffic using chrome

My favorite performance tools

• Load Generator (Apache Benchmark, Selenium, JMeter)

• Firebug, Google Developer Tools

• Dynatrace Application Monitoring Free Trial• Free trial license for 30 days• Free personal license for developers

• Dynatrace Ruxit• 2016 free hours for monitoring

http://bit.ly/monitoring-2016http://bit.ly/dttrial

Thank you !!!Harald ZeitlhoferPerformance Advocate@HZeitlhoferharald.zeitlhofer@dynatrace.comhttp://blog.dynatrace.com

Dynatrace Free TrialFree Personal LicenseRuxit Free Trialhttp://bit.ly/monitoring-2016events@dynatrace.com

top related