running php on nginx
Post on 19-Jul-2015
78 Views
Preview:
TRANSCRIPT
1 #Dynatrace
Proper configura-on for high performance websites
Harald Zeitlhofer April 2015
Boost your website by running PHP on Nginx
@HZeitlhofer harald.zeitlhofer@dynatrace.com
7 #Dynatrace
PHP run modes
Apache Module
– tradi-onal approach – used for most PHP
environments
CGI
– Command Line Interface (CLI)
FastCGI (PHP-‐FPM)
– PHP applica-on server – Run mul-ple PHP worker
processes to serve CGI requests
8 #Dynatrace
Nginx
Lightweight HTTP server
Fast especially at high load
Event based request handling
Open Source project (BSD) by Igor Sysoev
Nginx, Inc. founded in 2011
11 #Dynatrace
it’s not only the FPM
yes, but ...
it’s Nginx' event based processing that creates the performance advantage
14 #Dynatrace
prefork mode one process per request
worker mode mul-ple threads per process, one per request
worker event mode
event based request handling
17 #Dynatrace
• Installa-on
• Pool configura-on /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
18 #Dynatrace
• Pool configura-on /etc/php5/fpm/pool.d/www.conf
PHP-‐FPM
[pool_name] ... pm = [dynamic/static] pm.max_children = 10 ;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
20 #Dynatrace
• /etc/nginx/nginx.conf
# max_clients = worker_processes * worker_connections worker_processes 8; # number of CPUs worker_rlimit_nofile 40000; events { worker_connections 1024; multi_accept on; }
21 #Dynatrace
• Communica-on 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;
23 #Dynatrace
• Sta-c content to be served by Nginx • Dynamic requests to be sent to PHP-‐FPM
Integra-on
server { listen 80; root /var/www/test; index index.php index.html index.htm; server_name test.whateveryourdomain.is; 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 #Dynatrace
hbp://www.mysite.com/news/browse/2014
è to be handled by index.php
URL rewrite
... RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php ...
25 #Dynatrace
hbp://www.mysite.com/news/browse/2014
è to be handled by index.php
URL rewrite
upstream php { server unix:/var/run/php5-fpm.sock; } 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 php;
} }
26 #Dynatrace
using Nginx/PHP-‐FPM there’s a beber way:
URL rewrite
upstream php { server unix:/var/run/php5-fpm.sock; } 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 php; }
}
<?php
$params = explode('/', $_SERVER["DOCUMENT_URI"]); ...
27 #Dynatrace
• Easy way to deploy your applica-on • All source files packed into one *.phar file
PHAR – PHP Archives
location ~* \.(php|phar)$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/myapp.phar; }
28 #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 Application\n"; }
}
29 #Dynatrace
PHAR example
location /myapp { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/myapp.phar; }
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
32 #Dynatrace
• Nginx running with default segngs
• Apache • AllowOverride None
• Mul--‐process mode to allow usage of mod_php
Benchmarking Nginx vs Apache
33 #Dynatrace
Sta-c 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 -m
e [sec]
35 #Dynatrace
• Part of the 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; }
39 #Dynatrace
• ngx_hbp_memcached_module
Full page cache with Nginx and Memcached
server { location / { set $memcached_key "$uri"; memcached_pass localhost:11211; error_page 404 502 504 = @fallback; } location @fallback { proxy_pass http://backend; } }
40 #Dynatrace
• PHP
Full page cache with Nginx and Memcached
<?php ... function cachePage($content) { $c = new Memcached(); $c->addServer('localhost',11211); $c->set($_SERVER[”REQUEST_URI"], $content);
} ... $content = $this->renderPage(); $this->cachePage($content); ... ?>
41 #Dynatrace
PHP, 5k requests, concurrency 100
0
1
2
3
4
5
6
7
8
Apache+PHP Nginx+PHP Nginx+Memcached
<?php echo “Hello World”; ?>
42 #Dynatrace
• 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; }
43 #Dynatrace
• keep handlers for requested sta-c 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;
44 #Dynatrace
• ngx_hbp_upstream_module
Load balancing PHP
upstream php_loadbalancer { ip_hash; 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; }
}
46 #Dynatrace
Load balancing / Reverse Proxy upstream backend { ip_hash; server 192.168.56.11 weight=5; server 192.168.56.12 weight=2; server 192.168.56.13;
} server { listen 80; root /var/www/mysite.com/html; server_name www.mysite.com; location / { try_files $uri =405; proxy_pass http://backend; }
}
47 #Dynatrace
Reverse Proxy / Load balancing / Caching proxy_cache_path /etc/nginx/cache keys_zone=APPKEY:10m; proxy_cache_key "$host$request_uri$cookie_user"; proxy_cache_min_uses 5; proxy_cache_methods GET HEAD; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; upstream backend { ip_hash; server 192.168.56.11 weight=5; server 192.168.56.12 weight=2; server 192.168.56.13;
} server { listen 80; root /var/www/mysite.com/html; server_name www.mysite.com; proxy_cache APPKEY; location / { proxy_pass http://backend; }
}
59 #Dynatrace
• PHP agent since DT 5.5 • Nginx agent since DT 6.0 • 100% transac-on tracing • Process monitoring
• Auto-‐Sensor to trace slow func-on/method execu-ons
• OOTB Sensor Packs • Custom Sensor Rules
• Error handling
60 #Dynatrace
• Free trial license for 30 days • Free for developers on local machine
Dynatrace Free Trial
hbp://bit.ly/dbrial
top related