Nginx - Unit


Cookbook/Shortcuts

Рестарт unitd

К сожалению на текущий момент у unit нет команды reload или restart, есть issues на это дело и также есть лайфхак issues


sudo curl -X PUT -d '{"APPVERSION":"'$(date +"%s")'"}' --unix-socket /var/run/control.unit.sock http://localhost/config/applications/hello-catalyst/environment

Запуск и tail

Как dev сервер не получиться, придеться делать скрипт запуска


$ cat ./start.sh 
#!/usr/bin/env bash

sudo unitd --no-daemon &
sudo tail -f /var/log/unit.log

Установка из пакетов в Ubuntu 16.04

1) Ключики


wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

2) Добавить пути


sudo echo "deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx" | sudo tee -a /etc/apt/sources.list
sudo echo "deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx" | sudo tee -a /etc/apt/sources.list

3) update и install


sudo apt-get update
sudo apt-get -y install unit

По умолчанию, в пекетах собран unit с поддержкой модулей php и python. Для остальных нужно отдельно собирать

Собираем свой

1) качаем исходники


git clone https://github.com/nginx/unit.git && cd unit

2) настраиваем конфиг


./configure \
  --prefix=/usr \
  --bindir=/usr/bin \
  --sbindir=/usr/sbin \
  --modules=/usr/lib/unit/modules \
  --state=/var/unit/state \
  --pid=/var/run/unit.pid \
  --log=/var/log/unit.log \
  --user="$(id -un)" \
  --group="$(id -gn)" \
  --control=unix:/var/run/control.unit.sock

3) Скачиваем поддержку perl-dev!!!

Без этого (или из любого друого яп) будет ошибка


$ ./configure perl
configuring Perl module
checking for Perl ... not found

./configure: error: no Perl found.
    

sudo apt-get install libperl-dev

3) Добавляем поддержку модуля


$ ./configure perl
configuring Perl module
checking for Perl ... found
checking for Perl version ... 5.22.1
 + Perl module: perl.unit.so

4) Собираем


sudo make install

5) Собираем модуль


sudo make perl-install

6) Проверяем


$ sudo unitd --version
unit version: 1.10.0
configured as ./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --modules=/usr/lib/unit/modules --state=/var/unit/state --pid=/var/run/unit.pid --log=/var/log/unit.log --user=vagrant --group=vagrant --control=unix:/var/run/control.unit.sock
$ ls -l /usr/lib/unit/modules
total 304
-rwxr-xr-x 1 root root 308568 Aug 17 12:05 perl.unit.so

Управление

Если установка через пакеты

1) запуск


sudo service unitd start

2) задаем конфиг файл


sudo service unitd restoreconfig /usr/share/doc/unit/examples/example.config

3) вывести текущий конфиг


sudo service unitd dumpconfig

Из пакетов

Запуск без фонового запуска


sudo unitd --no-daemon

Логи


sudo tail -f /var/log/unit.log

Настройка осуществляется через демона с помощью REST API

Поулчение конфига


vagrant@vagrant:~$ sudo curl -XGET --unix-socket /var/run/control.unit.sock http://localhost/config/

Проба пера - psgi

1) Запскаем простое psgi приложение


$ cat /home/vagrant/projects/hello-unit/index.pl
#!/usr/bin/env perl

use Data::Dumper;

my $app = sub {
      my $env = shift;
      return [
          '200',
          [ 'Content-Type' => 'text/plain' ],
          [ "Hello from Unit, Perl $^V, environment:\n\n", Dumper($env) ],
      ];
};

$ cat /home/vagrant/projects/hello-unit/perl.conf 
{
  "listeners": {
    "*:8080": {
      "application": "hello-unit"
    }
  },
  "applications": {
    "hello-unit": {
        "type": "perl",
        "user": "nobody",
        "processes": 1,
        "working_directory": "/vagrant/projects/hello-unit/",
        "script": "/vagrant/projects/hello-unit/index.pl"
    }
  }
}

2) Скармливаем конфиг демону


$ sudo curl -XPUT -d @perl.conf --unix-socket /var/run/control.unit.sock http://localhost/config/
{
    "success": "Reconfiguration done."
}

Без sudo будет


curl: (7) Couldn't connect to server
        
Т.к. сокет создан из под рута

PS Для получения актуального конфига, также делается REST запрос


$ sudo curl -XGET --unix-socket /var/run/control.unit.sock http://localhost/config/
{
    "listeners": {
        "*:8080": {
            "application": "hello-unit"
        }
    },

    "applications": {
        "hello-unit": {
            "type": "perl",
            "user": "nobody",
            "processes": 1,
            "working_directory": "/vagrant/projects/hello-unit/",
            "script": "/vagrant/projects/hello-unit/index.pl"
        }
    }
}

3) пробуем обратиться к приложению, которое указали в конфиге


$ curl localhost:8080
Hello from Unit, Perl v5.22.1, environment:

$VAR1 = {
          'psgi.input' => bless( , 'IO::File' ),
          'psgi.url_scheme' => 'http',
          'SERVER_PORT' => '80',
          'psgi.run_once' => '',
          'REQUEST_METHOD' => 'GET',
          'REQUEST_URI' => '/',
          'psgi.errors' => bless( , 'IO::File' ),
          'psgi.multithread' => ${\$VAR1->{'psgi.run_once'}},
          'SERVER_PROTOCOL' => 'HTTP/1.1',
          'HTTP_ACCEPT' => '*/*',
          'psgi.streaming' => 1,
          'SERVER_ADDR' => '127.0.0.1',
          'HTTP_USER_AGENT' => 'curl/7.47.0',
          'SERVER_SOFTWARE' => 'Unit/1.10.0',
          'psgi.multiprocess' => ${\$VAR1->{'psgi.streaming'}},
          'SERVER_NAME' => 'localhost',
          'PATH_INFO' => '/',
          'REMOTE_ADDR' => '127.0.0.1',
          'psgi.version' => [
                              1,
                              1
                            ],
          'psgi.nonblocking' => ${\$VAR1->{'psgi.run_once'}},
          'HTTP_HOST' => 'localhost:8080',
          'QUERY_STRING' => ''
        };

Проба пера - catalyst

Установка каталиста см. Perl - Catalyst

Создаем конфиг



Конфиг

applications - список запускаемых приложений

listeners -

make perl-5.22-install make perl-5.22