View
2.634
Download
2
Category
Preview:
DESCRIPTION
In den meisten Projekten wird Apache mit mod_php zur Auslieferung der Webseiten eingesetzt. Doch wird der Funktionsumfang von Apache für die meisten Projekte nicht genutzt. In dieser Session geht es um die Vorteile, die sich durch den Umstieg auf den leichtgewichtigen nginx und die Einbindung von PHP als FastCGI-Service erzielen lassen.
Citation preview
© Mayflower GmbH 2011
Mit nginx und FastCGI skalieren
Michel Hartmann I 01.06.2011
Michel Hartmann
● Studium der Informatik an der Universität Würzburg
● Seit 2008 Entwickler bei der Mayflower GmbH
Mayflower GmbH I 3
Kurt Ringsock
Mayflower GmbH I 4
Apache
Mayflower GmbH I 5
Verarbeitung
. . .
Mayflower GmbH I 6
Lösung
Mayflower GmbH I 7
Nutzung
Quelle: netcraft.com
Totals for Active Servers Across All DomainsJune 2000 - May 2011
Mayflower GmbH I 8
Apache (mpm_worker)
RAM 60 MB
CPU 100 %
Netzwerk 45 %
Requests / s 1.500
Mayflower GmbH I 9
nginx
RAM 60 MB 12 MB
CPU 100 % 5 %
Netzwerk 40 % 100 %
Requests / s 1.500 4.000
Mayflower GmbH I 10
lighttpd
RAM 60 MB 12 MB X
CPU 100 % 5 % X
Netzwerk 40 % 100 % X
Requests / s 1.500 4.000 X
Mayflower GmbH I 11
nginx
Mayflower GmbH I 12
Verarbeitung – Reverse Proxy
. . .
Mayflower GmbH I 13
Konfiguration – Basis
user www-data www-data;worker_processes 10;
events {
worker_connections 1000;
}
http {
include conf/mime.types;default_type application/octet-stream;
sendfile on;
gzip on;gzip_min_length 1000;gzip_types text/plain application/xml;
keepalive_timeout 75 20;
include sites-enabled/*;
}
Mayflower GmbH I 14
Konfiguration – VHOST
server {
server_name ringsock.de www.ringsock.de;root /var/www/ringsock.de/httpdocs;
location / {
try_files $uri /index.php?q=$uri&$args;
}
location ~* \.php$ {
proxy_pass http://127.0.0.1:8000/;
}
location = /favicon.ico {
access_log off;
}
}
Mayflower GmbH I 15
Benchmark
Mayflower GmbH I 16
Caching
proxy_cache_path /data/proxy-cache/ringsock levels=1:2keys_zone=ringsock:10m max_size=1g inactive=30m;
proxy_temp_path /data/proxy-temp/ 1;
server {
[...]
location ~* \.php$ {
proxy_cache ringsock;proxy_cache_key "$host$request_uri";proxy_cache_methods GET;proxy_cache_bypass $cookie_nocache $arg_nocache;proxy_no_cache $cookie_nocache $arg_nocache;proxy_cache_valid 200 302 60m;proxy_cache_valid 404 1m;proxy_pass http://127.0.0.1:8000/;
}
}
Mayflower GmbH I 17
Verarbeitung
. . .
Mayflower GmbH I 18
Verarbeitung
. . .
FastCGI
Mayflower GmbH I 19
FastCGI Process Manager (FPM)
Mayflower GmbH I 20
Konfiguration – php-fpm
[global]
pid = /var/run/php5-fpm.piderror_log = /var/log/php5-fpm.log
[ringsock]
listen = /tmp/ringsock-fpm.socketuser = ringsock_degroup = ringsock_de
pm = dynamicpm.start_servers = 20pm.max_children = 100pm.min_spare_servers = 5pm.max_spare_servers = 20
Mayflower GmbH I 21
Konfiguration – nginx
server {
server_name ringsock.de www.ringsock.de;root /var/www/ringsock.de/httpdocs;
location / {
try_files $uri /index.php?q=$uri&$args;
}
location ~* \.php$ {
fastcgi_pass unix:/tmp/ringsock-fpm.socket;include fastcgi_params;
}
}
Mayflower GmbH I 22
Konfiguration – nginx (fastcgi_params)
fastcgi_param GATEWAY_INTERFACE CGI/1.1;fastcgi_param SERVER_SOFTWARE nginx;fastcgi_param QUERY_STRING $query_string;fastcgi_param REQUEST_METHOD $request_method;fastcgi_param CONTENT_TYPE $content_type;fastcgi_param CONTENT_LENGTH $content_length;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param SCRIPT_NAME $fastcgi_script_name;fastcgi_param REQUEST_URI $request_uri;fastcgi_param DOCUMENT_URI $document_uri;fastcgi_param DOCUMENT_ROOT $document_root;fastcgi_param SERVER_PROTOCOL $server_protocol;fastcgi_param REMOTE_ADDR $remote_addr;fastcgi_param REMOTE_PORT $remote_port;fastcgi_param SERVER_ADDR $server_addr;fastcgi_param SERVER_PORT $server_port;fastcgi_param SERVER_NAME $server_name
Mayflower GmbH I 23
Benchmark
Mayflower GmbH I 24
Features
Mayflower GmbH I 25
php-fpm – Worker Pools
[global]
pid = /var/run/php5-fpm.piderror_log = /var/log/php5-fpm.log
[ringsock]
listen = /tmp/ringsock-fpm.socketuser = ringsock_degroup = ringsock_de
…
[ringschuh]
listen = /tmp/ringschuh-fpm.socketuser = ringschuh_degroup = ringschuh_de
…
Mayflower GmbH I 26
php-fpm – fastcgi_finsish_request()
<?php
require_once 'My/Application.php';
$application = new My_Application();
$application->run();
fastcgi_finish_request();
$application->postRun();
Mayflower GmbH I 27
php-fpm – Slowlog
[global]
pid = /var/run/php5-fpm.piderror_log = /var/log/php5-fpm.log
[ringsock]
listen = /tmp/ringsock-fpm.socketuser = ringsock_degroup = ringsock_de
pm = dynamicpm.start_servers = 20pm.max_children = 100pm.min_spare_servers = 5pm.max_spare_servers = 20
request_slowlog_timeout = 30slowlog = /var/log/php5/ringsock-slow.log
Mayflower GmbH I 28
php-fpm – Status & Ping
[global]
pid = /var/run/php5-fpm.piderror_log = /var/log/php5-fpm.log
[ringsock]
listen = /tmp/ringsock-fpm.socketuser = ringsock_degroup = ringsock_de
pm = dynamicpm.start_servers = 20pm.max_children = 100pm.min_spare_servers = 5pm.max_spare_servers = 20
pm.status_path = /statusping.path = /pingping.response = pong
pool ringsock
process manager dynamic
accepted conn 158
listen queue len 0
max listen queue len 12
idle processes 20
active processes 2
total processes 22
max children reached 25
Mayflower GmbH I 29
php-fpm – Emergency Restart
[global]
pid = /var/run/php5-fpm.piderror_log = /var/log/php5-fpm.log
[ringsock]
listen = /tmp/ringsock-fpm.socketuser = ringsock_degroup = ringsock_de
pm = dynamicpm.start_servers = 20pm.max_children = 100pm.min_spare_servers = 5pm.max_spare_servers = 20
emergency_restart_threshold = 10emergency_restart_interval = 5m
Mayflower GmbH I 30
Sicherheit
www.ringsock.de
All your stockingsare belong to us
Mayflower GmbH I 31
Konfiguration – nginx
server {
server_name ringsock.de www.ringsock.de;root /var/www/ringsock.de/httpdocs;
location / {
try_files $uri /index.php?q=$uri&$args;
}
location ~* \.php$ {
fastcgi_pass unix:/tmp/ringsock-fpm.socket;include fastcgi_params;
}
}
Mayflower GmbH I 32
Konfiguration – nginx
server {
server_name ringsock.de www.ringsock.de;root /var/www/ringsock.de/httpdocs;
location / {
try_files $uri /index.php?q=$uri&$args;
}
location /index.php {
fastcgi_pass unix:/tmp/ringsock-fpm.socket;include fastcgi_params;
}
}
Mayflower GmbH I 33
Konfiguration – nginx
server {
server_name ringsock.de www.ringsock.de;root /var/www/ringsock.de/httpdocs;
location / {
try_files $uri /index.php?q=$uri&$args;
}
location ^~ /index.php {
fastcgi_pass unix:/tmp/ringsock-fpm.socket;include fastcgi_params;
}
location ~* \.php$ {
deny all;
}
}
Mayflower GmbH I 34
Weiter skalieren
Mayflower GmbH I 35
Lastverteilung
. . .
-fpm
. . .
-fpm
Mayflower GmbH I 36
Loadbalancing
upstream worker_pool {
server worker01.ringsock.de:9000 weight=2;server worker02.ringsock.de:9000 weight=3;
}
server {
[...]
location ^~ /index.php {
fastcgi_pass worker_pool;include fastcgi_params;
}
[…]
}
Mayflower GmbH I 37
ip_hash
upstream worker_pool {
ip_hash;server worker01.ringsock.de:9000;server worker02.ringsock.de:9000 down;
}
server {
[...]
location ^~ /index.php {
fastcgi_pass worker_pool;include fastcgi_params;
}
[…]
}
Mayflower GmbH I 38
Failover
upstream worker_pool {
server worker01.ringsock.de:9000 weight=2 max_fails=2 fail_timeout=60s;server worker02.ringsock.de:9000 weight=3 max_fails=2 fail_timeout=60s;server unix:/tmp/ringsock-fpm.socket backup;
}
server {
[...]
location ^~ /index.php {
fastcgi_pass worker_pool;fastcgi_next_upstream error timeout;include fastcgi_params;
}
[…]
}
Mayflower GmbH I 39
Resümee
Mayflower GmbH I 40
Fragen?
06/01/11 Mayflower GmbH 41
Vielen Dank für Ihre Aufmerksamkeit!
Kontakt Michel Hartmann
michel.hartmann@mayflower.de
+49 931 35965 1146
Mayflower GmbH
Pleichertorstr. 2
97070 Würzburg
Mayflower GmbH I 42
Load Balancer
http {upstream webserver {
server web01:80 weight=3;server web02:80;server web03:80;
}
server {server_name www.domain.com;location / {
proxy_pass http://webserver;}
}}
Recommended