SlideShare a Scribd company logo
1 of 60
Nginx.pm
 use nginx or die;



                     Андрей Гейн, УрФУ
…
                    /about
          /search
/images
…
                    /about
          /search
/images
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;
     perl_handler
  root               My::App::handler;
                    /data/www;
  location / {
     index          index.html index.pl
  }
}
Конфигурация
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 API
sub handler {
  my $r = shift;
  my $buf = "Hello world!n";




}
HTTP API
sub 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 API
sub 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 API
sub access_handler {
 my $r = shift;



    return NGX_OK;
}
HTTP API
sub access_handler {
  my $r = shift;
  if ($r->uri eq '/private') {
    return 403;
  }
  return NGX_OK;
}
Изнутри
Изнутри
$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->uri
$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->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->print($data, ...)
$r->uri
$r->args
$r->request_method
$r->remote_addr
$r->location_name
$r->root
$r->request_body
Изнутри
$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 $dir
prepare_nginx_dir_die $dir, $conf, $package1,
                            $package2, ...
Nginx::Test
$nginx = find_nginx_perl
$port = get_unused_port
$text = cat_nginx_logs $dir
prepare_nginx_dir_die $dir, $conf, $package1,
                            $package2, ...
$child = fork_nginx_die $nginx, $dir
Nginx::Redis
Nginx::Redis
ngx_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

More Related Content

What's hot

Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPavel Vlasov
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Anatoly Sharifulin
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
Psgi app
Psgi appPsgi app
Psgi appund3f
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubyAlexey Nayden
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor SysoevMedia Gorod
 
Зачем программистам Ansible
Зачем программистам AnsibleЗачем программистам Ansible
Зачем программистам AnsibleDenis Honig
 
Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsИспользование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsSQALab
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном кодеKolya Korobochkin
 
Chef коротко об инфраструктуре
Chef коротко об инфраструктуреChef коротко об инфраструктуре
Chef коротко об инфраструктуреAndrey Subbota
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in railssergeymoiseev
 

What's hot (20)

Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Chef
ChefChef
Chef
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Psgi app
Psgi appPsgi app
Psgi app
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor Sysoev
 
PowerShell
PowerShellPowerShell
PowerShell
 
Зачем программистам Ansible
Зачем программистам AnsibleЗачем программистам Ansible
Зачем программистам Ansible
 
Парсер: что? зачем? как?
Парсер: что? зачем? как?Парсер: что? зачем? как?
Парсер: что? зачем? как?
 
Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsИспользование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в Windows
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном кодеСтрах и ненависть в исходном коде
Страх и ненависть в исходном коде
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 
Chef коротко об инфраструктуре
Chef коротко об инфраструктуреChef коротко об инфраструктуре
Chef коротко об инфраструктуре
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 

Viewers also liked

Tale Comenius Paco for Bori
Tale Comenius Paco for BoriTale Comenius Paco for Bori
Tale Comenius Paco for Borifimarcab
 
Использование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проектаИспользование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проектаIlya Zelenchuk
 
Потоки в перле изнутри
Потоки в перле изнутриПотоки в перле изнутри
Потоки в перле изнутриIlya Zelenchuk
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на PerlIlya Zelenchuk
 
Wanas Strategic Sustainability Prez
Wanas Strategic Sustainability PrezWanas Strategic Sustainability Prez
Wanas Strategic Sustainability PrezCrystal Grover
 
Контрактное программирование
Контрактное программированиеКонтрактное программирование
Контрактное программированиеIlya Zelenchuk
 
Coro - реальные потоки в Perl
Coro - реальные потоки в PerlCoro - реальные потоки в Perl
Coro - реальные потоки в PerlIlya Zelenchuk
 

Viewers also liked (9)

Tale Comenius Paco for Bori
Tale Comenius Paco for BoriTale Comenius Paco for Bori
Tale Comenius Paco for Bori
 
Использование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проектаИспользование Mojolicious::Plugin::AnyData в тестовом режиме проекта
Использование Mojolicious::Plugin::AnyData в тестовом режиме проекта
 
Потоки в перле изнутри
Потоки в перле изнутриПотоки в перле изнутри
Потоки в перле изнутри
 
Функциональные тесты на Perl
Функциональные тесты на PerlФункциональные тесты на Perl
Функциональные тесты на Perl
 
Perl и SPDY
Perl и SPDYPerl и SPDY
Perl и SPDY
 
Wanas Strategic Sustainability Prez
Wanas Strategic Sustainability PrezWanas Strategic Sustainability Prez
Wanas Strategic Sustainability Prez
 
Контрактное программирование
Контрактное программированиеКонтрактное программирование
Контрактное программирование
 
Wcf faq
Wcf faqWcf faq
Wcf faq
 
Coro - реальные потоки в Perl
Coro - реальные потоки в PerlCoro - реальные потоки в Perl
Coro - реальные потоки в Perl
 

Similar to Nginx.pm

Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkOleksandr Torosh
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаIlya Chesnokov
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Tanya Denisyuk
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Vadim Kruchkov
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Open-IT
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 

Similar to Nginx.pm (20)

Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Опыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервисаОпыт разработки и тестирования RESTful JSON сервиса
Опыт разработки и тестирования RESTful JSON сервиса
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
PHP basic
PHP basicPHP basic
PHP basic
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 

Nginx.pm