Transcript
Page 1: Mit nginx und FastCGI skalieren

© Mayflower GmbH 2011

Mit nginx und FastCGI skalieren

Michel Hartmann I 01.06.2011

Page 2: Mit nginx und FastCGI skalieren

Michel Hartmann

● Studium der Informatik an der Universität Würzburg

● Seit 2008 Entwickler bei der Mayflower GmbH

Page 3: Mit nginx und FastCGI skalieren

Mayflower GmbH I 3

Kurt Ringsock

Page 4: Mit nginx und FastCGI skalieren

Mayflower GmbH I 4

Apache

Page 5: Mit nginx und FastCGI skalieren

Mayflower GmbH I 5

Verarbeitung

. . .

Page 6: Mit nginx und FastCGI skalieren

Mayflower GmbH I 6

Lösung

Page 7: Mit nginx und FastCGI skalieren

Mayflower GmbH I 7

Nutzung

Quelle: netcraft.com

Totals for Active Servers Across All DomainsJune 2000 - May 2011

Page 8: Mit nginx und FastCGI skalieren

Mayflower GmbH I 8

Apache (mpm_worker)

RAM 60 MB

CPU 100 %

Netzwerk 45 %

Requests / s 1.500

Page 9: Mit nginx und FastCGI skalieren

Mayflower GmbH I 9

nginx

RAM 60 MB 12 MB

CPU 100 % 5 %

Netzwerk 40 % 100 %

Requests / s 1.500 4.000

Page 10: Mit nginx und FastCGI skalieren

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

Page 11: Mit nginx und FastCGI skalieren

Mayflower GmbH I 11

nginx

Page 12: Mit nginx und FastCGI skalieren

Mayflower GmbH I 12

Verarbeitung – Reverse Proxy

. . .

Page 13: Mit nginx und FastCGI skalieren

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/*;

}

Page 14: Mit nginx und FastCGI skalieren

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;

}

}

Page 15: Mit nginx und FastCGI skalieren

Mayflower GmbH I 15

Benchmark

Page 16: Mit nginx und FastCGI skalieren

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/;

}

}

Page 17: Mit nginx und FastCGI skalieren

Mayflower GmbH I 17

Verarbeitung

. . .

Page 18: Mit nginx und FastCGI skalieren

Mayflower GmbH I 18

Verarbeitung

. . .

FastCGI

Page 19: Mit nginx und FastCGI skalieren

Mayflower GmbH I 19

FastCGI Process Manager (FPM)

Page 20: Mit nginx und FastCGI skalieren

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

Page 21: Mit nginx und FastCGI skalieren

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;

}

}

Page 22: Mit nginx und FastCGI skalieren

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

Page 23: Mit nginx und FastCGI skalieren

Mayflower GmbH I 23

Benchmark

Page 24: Mit nginx und FastCGI skalieren

Mayflower GmbH I 24

Features

Page 25: Mit nginx und FastCGI skalieren

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

Page 26: Mit nginx und FastCGI skalieren

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();

Page 27: Mit nginx und FastCGI skalieren

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

Page 28: Mit nginx und FastCGI skalieren

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

Page 29: Mit nginx und FastCGI skalieren

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

Page 30: Mit nginx und FastCGI skalieren

Mayflower GmbH I 30

Sicherheit

www.ringsock.de

All your stockingsare belong to us

Page 31: Mit nginx und FastCGI skalieren

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;

}

}

Page 32: Mit nginx und FastCGI skalieren

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;

}

}

Page 33: Mit nginx und FastCGI skalieren

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;

}

}

Page 34: Mit nginx und FastCGI skalieren

Mayflower GmbH I 34

Weiter skalieren

Page 35: Mit nginx und FastCGI skalieren

Mayflower GmbH I 35

Lastverteilung

. . .

-fpm

. . .

-fpm

Page 36: Mit nginx und FastCGI skalieren

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;

}

[…]

}

Page 37: Mit nginx und FastCGI skalieren

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;

}

[…]

}

Page 38: Mit nginx und FastCGI skalieren

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;

}

[…]

}

Page 39: Mit nginx und FastCGI skalieren

Mayflower GmbH I 39

Resümee

Page 40: Mit nginx und FastCGI skalieren

Mayflower GmbH I 40

Fragen?

Page 41: Mit nginx und FastCGI skalieren

06/01/11 Mayflower GmbH 41

Vielen Dank für Ihre Aufmerksamkeit!

Kontakt Michel Hartmann

[email protected]

+49 931 35965 1146

Mayflower GmbH

Pleichertorstr. 2

97070 Würzburg

Page 42: Mit nginx und FastCGI skalieren

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;}

}}