nginx.pm

60
Nginx.pm use nginx or die; Андрей Гейн, УрФУ

Upload: ilya-zelenchuk

Post on 16-Jun-2015

1.005 views

Category:

Education


0 download

DESCRIPTION

Nginx.pm is full-featured perl support for nginx.

TRANSCRIPT

Page 1: Nginx.pm

Nginx.pmuse nginx or die;

Андрей Гейн, УрФУ

Page 2: Nginx.pm
Page 3: Nginx.pm
Page 4: Nginx.pm
Page 5: Nginx.pm

/images /search /about …

Page 6: Nginx.pm

/images /search /about …

Page 7: Nginx.pm

Nginx

Page 8: Nginx.pm

Nginx• Высокая нагрузка

Page 9: Nginx.pm

Nginx• Высокая нагрузка• Кроссплатформенность

Page 10: Nginx.pm

Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер

Page 11: Nginx.pm

Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки

Page 12: Nginx.pm

Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки• Безопасность

Page 13: Nginx.pm

Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки• Безопасность• Модульность

Page 14: Nginx.pm

Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки• Безопасность• Модульность• Плюшки

Page 15: Nginx.pm

Конфигурация

Page 16: Nginx.pm

Конфигурацияserver { listen 80; server_name urfu.ru ustu.ru usu.ru; root /data/www;

} location / { index index.html index.pl }

Page 17: Nginx.pm

Конфигурацияserver { listen 80; server_name urfu.ru ustu.ru usu.ru; root /data/www;

}

location / { index index.html index.pl

}

perl_handler My::App::handler;

Page 18: Nginx.pm

Конфигурация

location / { index index.html index.pl

}

perl_handler My::App::handler;perl_access My::App::access_handler;perl_app /path/to/app.pl;

Page 19: Nginx.pm

Общие настройки

Page 20: Nginx.pm

Общие настройкиperl_inc /path/to/lib;

Page 21: Nginx.pm

Общие настройкиperl_inc /path/to/lib;perl_require My/App.pm;

Page 22: Nginx.pm

Общие настройкиperl_inc /path/to/lib;perl_require My/App.pm;perl_eval '$My::App::CONF{foo} = "bar"';

Page 23: Nginx.pm

HTTP API

Page 24: Nginx.pm

HTTP APIsub handler { my $r = shift; my $buf = "Hello world!\n";

}

Page 25: Nginx.pm

HTTP APIsub handler { my $r = shift; my $buf = "Hello world!\n";

$r->header_out('Content-Length', length($buf)); $r->send_http_header('text/html; charset=UTF-8');

}

Page 26: Nginx.pm

HTTP APIsub handler { my $r = shift; my $buf = "Hello world!\n";

$r->header_out('Content-Length', length($buf)); $r->send_http_header('text/html; charset=UTF-8');

$r->print($buf); return NGX_OK;}

Page 27: Nginx.pm

HTTP APIsub access_handler { my $r = shift;

return NGX_OK;}

Page 28: Nginx.pm

HTTP APIsub access_handler { my $r = shift;

return NGX_OK;}

if ($r->uri eq '/private') { return 403; }

Page 29: Nginx.pm

Изнутри

Page 30: Nginx.pm

Изнутри$r->send_http_header($content_type)

Page 31: Nginx.pm

Изнутри$r->send_http_header($content_type)$r->header_only

Page 32: Nginx.pm

Изнутри$r->send_http_header($content_type)$r->header_only$r->status($error_code);

Page 33: Nginx.pm

Изнутри$r->send_http_header($content_type)$r->header_only$r->status($error_code);$r->header_in("User-Agent")

Page 34: Nginx.pm

Изнутри$r->send_http_header($content_type)$r->header_only$r->status($error_code);$r->header_in("User-Agent")$r->headers_in

{ content-type => ['text/html'], content-length => [1234] }

Page 35: Nginx.pm

Изнутри$r->send_http_header($content_type)$r->header_only$r->status($error_code);$r->header_in("User-Agent")$r->headers_in$r->header_out($name, $value)

$r->uri

Page 36: Nginx.pm

Изнутри$r->uri$r->args

Page 37: Nginx.pm

Изнутри$r->uri$r->args$r->request_method

Page 38: Nginx.pm

Изнутри$r->uri$r->args$r->request_method$r->remote_addr

Page 39: Nginx.pm

Изнутри$r->uri$r->args$r->request_method$r->remote_addr$r->location_name

Page 40: Nginx.pm

Изнутри$r->uri$r->args$r->request_method$r->remote_addr$r->location_name$r->root

Page 41: Nginx.pm

Изнутри$r->uri$r->args$r->request_method$r->remote_addr$r->location_name$r->root$r->request_body

$r->print($data, ...)

Page 42: Nginx.pm

Изнутри$r->print($data, ...)$r->unescape($data)

Page 43: Nginx.pm

Изнутри$r->print($data, ...)$r->unescape($data)$r->sendfile($filename, $offset, $length)

Page 44: Nginx.pm

Асинхронно?

Page 45: Nginx.pm

Асинхронно?ngx_timer $after, $repeat, sub { }

my $repeat = 5; ngx_timer $repeat, $repeat, sub { $repeat--; };

Page 46: Nginx.pm

Асинхронно?ngx_timer $after, $repeat, sub { }ngx_resolver $name, $timeout, sub { }

Page 47: Nginx.pm

Асинхронно?ngx_timer $after, $repeat, sub { }ngx_resolver $name, $timeout, sub { }ngx_http "$ip:$port:key=value;key=value...",

$request, sub { }

Page 48: Nginx.pm

Nginx::Test

Page 49: Nginx.pm

Nginx::Test$nginx = find_nginx_perl

Page 50: Nginx.pm

Nginx::Test$nginx = find_nginx_perl$port = get_unused_port

Page 51: Nginx.pm

Nginx::Test$nginx = find_nginx_perl$port = get_unused_port$text = cat_nginx_logs $dir

Page 52: Nginx.pm

Nginx::Test$nginx = find_nginx_perl$port = get_unused_port$text = cat_nginx_logs $dirprepare_nginx_dir_die $dir, $conf, $package1, $package2, ...

Page 53: Nginx.pm

Nginx::Test$nginx = find_nginx_perl$port = get_unused_port$text = cat_nginx_logs $dirprepare_nginx_dir_die $dir, $conf, $package1, $package2, ...$child = fork_nginx_die $nginx, $dir

Page 54: Nginx.pm

Nginx::Redis

Page 55: Nginx.pm

Nginx::Redisngx_redis "$ip:$port:$auth:$timeout",

['GET', 'mykey'], sub { };

Page 56: Nginx.pm

Тесты

Page 57: Nginx.pm

Тесты

nginx-perl

Node.js

Page 58: Nginx.pm

Тесты/ /single /multi

nginx-perl

Node.js

10 потоков, 10 000 запросов, 3 запуска

Page 59: Nginx.pm

Тесты/ /single /multi

nginx-perl 3 (22) 5 (27) 7 (31)

Node.js 5 (40) 6 (30) 14 (45)

Page 60: Nginx.pm

Nginx::Questions