nginx.pm
DESCRIPTION
Nginx.pm is full-featured perl support for nginx.TRANSCRIPT
Nginx.pmuse nginx or die;
Андрей Гейн, УрФУ
/images /search /about …
/images /search /about …
Nginx
Nginx• Высокая нагрузка
Nginx• Высокая нагрузка• Кроссплатформенность
Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер
Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки
Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки• Безопасность
Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки• Безопасность• Модульность
Nginx• Высокая нагрузка• Кроссплатформенность• Обратный прокси-сервер• Балансировщик нагрузки• Безопасность• Модульность• Плюшки
Конфигурация
Конфигурацияserver { listen 80; server_name urfu.ru ustu.ru usu.ru; root /data/www;
} location / { index index.html index.pl }
Конфигурация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;
Конфигурация
location / { index index.html index.pl
}
perl_handler My::App::handler;perl_access My::App::access_handler;perl_app /path/to/app.pl;
Общие настройки
Общие настройкиperl_inc /path/to/lib;
Общие настройкиperl_inc /path/to/lib;perl_require My/App.pm;
Общие настройкиperl_inc /path/to/lib;perl_require My/App.pm;perl_eval '$My::App::CONF{foo} = "bar"';
HTTP API
HTTP APIsub handler { my $r = shift; my $buf = "Hello world!\n";
}
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');
}
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;}
HTTP APIsub access_handler { my $r = shift;
return NGX_OK;}
HTTP APIsub access_handler { my $r = shift;
return NGX_OK;}
if ($r->uri eq '/private') { return 403; }
Изнутри
Изнутри$r->send_http_header($content_type)
Изнутри$r->send_http_header($content_type)$r->header_only
Изнутри$r->send_http_header($content_type)$r->header_only$r->status($error_code);
Изнутри$r->send_http_header($content_type)$r->header_only$r->status($error_code);$r->header_in("User-Agent")
Изнутри$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] }
Изнутри$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
Изнутри$r->uri$r->args
Изнутри$r->uri$r->args$r->request_method
Изнутри$r->uri$r->args$r->request_method$r->remote_addr
Изнутри$r->uri$r->args$r->request_method$r->remote_addr$r->location_name
Изнутри$r->uri$r->args$r->request_method$r->remote_addr$r->location_name$r->root
Изнутри$r->uri$r->args$r->request_method$r->remote_addr$r->location_name$r->root$r->request_body
$r->print($data, ...)
Изнутри$r->print($data, ...)$r->unescape($data)
Изнутри$r->print($data, ...)$r->unescape($data)$r->sendfile($filename, $offset, $length)
Асинхронно?
Асинхронно?ngx_timer $after, $repeat, sub { }
my $repeat = 5; ngx_timer $repeat, $repeat, sub { $repeat--; };
Асинхронно?ngx_timer $after, $repeat, sub { }ngx_resolver $name, $timeout, sub { }
Асинхронно?ngx_timer $after, $repeat, sub { }ngx_resolver $name, $timeout, sub { }ngx_http "$ip:$port:key=value;key=value...",
$request, sub { }
Nginx::Test
Nginx::Test$nginx = find_nginx_perl
Nginx::Test$nginx = find_nginx_perl$port = get_unused_port
Nginx::Test$nginx = find_nginx_perl$port = get_unused_port$text = cat_nginx_logs $dir
Nginx::Test$nginx = find_nginx_perl$port = get_unused_port$text = cat_nginx_logs $dirprepare_nginx_dir_die $dir, $conf, $package1, $package2, ...
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
Nginx::Redis
Nginx::Redisngx_redis "$ip:$port:$auth:$timeout",
['GET', 'mykey'], sub { };
Тесты
Тесты
nginx-perl
Node.js
Тесты/ /single /multi
nginx-perl
Node.js
10 потоков, 10 000 запросов, 3 запуска
Тесты/ /single /multi
nginx-perl 3 (22) 5 (27) 7 (31)
Node.js 5 (40) 6 (30) 14 (45)
Nginx::Questions