42
© Mayflower GmbH 2011 Mit nginx und FastCGI skalieren Michel Hartmann I 01.06.2011

Mit nginx und FastCGI skalieren

Embed Size (px)

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

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

}}