Mit nginx und FastCGI skalieren

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