nginScript - JS для nginx

hell0w0rd

Продвинутый новичок
Если кратко, видимо последние 5 лет Игорь Сысоев занимался, в частности, созданием своего JS движка для встраивания в nginx, по аналогии с lua.
http://sysoev.ru/prog/v8.html - вот пост пятилентей давности, где описывается, почему v8 еще тогда не подошел.
Как я понял основное:
  • Прежде всего, V8 не умеет обрабатывать ошибки выделения памяти — он просто завершает процесс
  • V8 исполняет скрипты внутри контекстов .... Время создания контекста — 2 миллисекунды.
  • V8 использует автоматическую сборку мусора
Собственно nginScript не использует GC, быстро запускается и убивается и, видимо, по другому работает с памятью.
https://www.nginx.com/blog/launching-nginscript-and-looking-ahead/ - пост в блоге

Кто, что думает?
 

fixxxer

К.О.
Партнер клуба
nginScript это не настоящий JS, это такой простенький js-подобный язык, чтобы реализовать вещи, для которых не хватает гибкости директив конфигурации nginx. Скажем, какая-нибудь необычная балансировка по апстримам, или хитрый реврайт. Application server-ом это никогда не будет и не надо этого хотеть - проксируй на ноду.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
круто, не хватает, можно будет выносить на уровень nginx почти весь роутинг и ЧПУ
 

hell0w0rd

Продвинутый новичок
@grigori, ну по идее и сейчас можно, для этого есть lua. Я, правда, вообще не знаю lua, знаю что его в игры любят встраивать, тк это делается достаточно просто.
An ngx_lua script looks at the incoming request and makes a decision about which fileserver to route it to. This involves querying one of our MySQL read replicas to look up which backend storage server pair a Pages site has been allocated to.

Once our Lua router has made a routing decision, we just use nginx's stock proxy_passfeature to proxy back to the fileserver.
http://githubengineering.com/rearchitecting-github-pages/
Думаю со всем известным языком подобные финты ушами будет проще делать. Ну и логику, которую раньше на си переносили в виде модуля, можно будет так писать. Только вот у lua есть возможность указать файл скрипта, чего пока нет для js. Но думаю появится.
 

fixxxer

К.О.
Партнер клуба
круто, не хватает, можно будет выносить на уровень nginx почти весь роутинг и ЧПУ
так это и сейчас никто не мешает :)

PHP:
location /users/ {
   location ~ ^/users/(\d+) {
       fastcgi_param action "UserController@userProfile";
       fastcgi_param action_args "user_id=$1";
   }
   location ~ ^/users/(?:page-(\d+))?$ {
       fastcgi_param action "UsersController@list";
       fastcgi_param action_args "page=$1";
   }
   location ~ ^ {
       return 404;
   }
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ага, но я про более сложную логику, условно
PHP:
if ($_COOKIE['version']=='mobile' && $_GET['force_version']!='desktop') {
   header('Location: m.site.ru');
   exit;
}
 

fixxxer

К.О.
Партнер клуба
PHP:
map $cookie_version_and_force_arg $redirect_to_mobile {
    "mobile:" 1;
    "mobile:mobile" 1;
    "mobile:desktop" 0;
    ~^mobile 1;
}
server {
    set $cookie_version_and_force_arg "$cookie_version:$arg_force_version";
    if ($redirect_to_mobile) {
        return 302 "http://m.site.ru$request_uri";
    }
}
:)
 
Сверху