- PVSM.RU - https://www.pvsm.ru -

Ожидание длиной в 15 лет. Nginx Application Server

Начиная с момента появления Nginx в 2004 году, мы все задавались вопросом: когда же на nginx можно будет запускать приложения? Мы запускали PHP в php-fpm и на апаче, запускали Python через uWSGI, иногда жили с Apache, а если нам нужны были разные версии PHP — жили с зоопарком из FPM-ов.

image

Только что на конференции NginxConf в Портленде Nginx, Inc. объявил о запуске Nginx Application Platform. ITSumma тестировала один из его компонентов, собственно сам Application Server под названием Nginx Unit с закрытой версии. В этом посте мы расскажем о том, как выглядит Nginx Unit, и как на нем запускать приложения.

Nginx Unit — это сервер приложений для веба, позволяющий запускать веб-приложения, написанные на различных языках программирования (php, python, go). Этот инструмент достаточно легок и позволяет на лету переконфигурировать настройки и количество приложений по мере необходимости при разработке.

Основной сайт проекта [1]
Поддерживаемые на текущий момент платформы:
Python 2.6, 2.7, 3
PHP 5, 7
Go 1.6 or later
Важная и крутая возможность для людей с зоопарком платформ: разные версии одной и той же платформы можно запустить в рамках одного конфига, одного аппсервера — прощай, зоопарк PHP-FPM-ов.

Исходный код проекта загружен на Гитхаб [2].
Что классно и интересно: ребята загрузили на Гитхаб код начиная с первого коммита и обещают принимать пулл-реквесты в классическом для Гитхаба стиле. Среди всего прочего можно посмотреть историю, логику и стиль разработки — очень интересно.

Установка

Важно: текущая версия все еще бета, с огромным количеством отладочного кода, который добавляет свой оверхед. В следующих версиях обещают значительную оптимизацию, которая должна переплюнуть текущие апп-серверы по производительности.

Пакеты сейчас доступны для CentOS 7.0 и Ubuntu 16.04 LTS

Установка для CentOS
1. Создайте файл /etc/yum.repos.d/unit.repo со следующим содержимым:

[unit]
name=unit repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

2. Запустите установку пакета:

# yum install unit

Установка для Ubuntu
1. Скачайте PGP-ключ NGINX [3], Inc.
2. Добавьте ключ в связку ключей apt. После этого не должно быть оповещений об отсутствующем PGP-ключе во время установки Unit.
3.

# sudo apt-key add nginx_signing.key

4. Добавьте в конец файла /etc/apt/sources.list строки:

deb http://nginx.org/packages/ubuntu/ xenial unit
deb-src http://nginx.org/packages/ubuntu/ xenial unit

5. Скачайте Unit:

# apt-get update
# apt-get install unit

Nginx Unit состоит из нескольких служебных процессов (master/controller/router) и непосредственно самих процессов-приложений. Конфигурация производится через REST API, через юникс сокет unit.control.sock.

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

curl --unix-socket ./control.unit.sock http://localhost/

Загрузка нового

curl -X PUT -d @/path/to/start.json  --unix-socket ./control.unit.sock http://localhost/

Конфигурация состоит из набора приложений (application) и воркеров (listener).

Запуск приложения

Рассмотрим запуск приложения на примере запуска «1С-Битрикс» и Laravel:
Фронтэндом выступает классический nginx, а бэкэндом — Nginx Unit. Сейчас каждое «приложение» Nginx Unit для PHP подразумевает одну точку входа. В случае с Битриксом их может быть две — urlrewrite.php и index.php, соответственно в бете — нужно либо объединить эту логику в один файл в коде, либо запускать два приложения. В ближайших версиях Nginx Unit ребята обещают сделать роутинг, чтобы избежать этой проблемы.

Конфигурация для Laravel:

    location / {
        proxy_pass       http://127.0.0.1:8300;
        proxy_redirect   http://127.0.0.1:8300/ /;
        proxy_read_timeout 60s;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ .php$ {
        proxy_pass       http://127.0.0.1:8300;
        proxy_redirect   http://127.0.0.1:8300/ /;
        proxy_read_timeout 60s;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

Конфигурация для «1С-Битрикс»:

 location = / {
        proxy_pass       http://127.0.0.1:8601;
        proxy_redirect   http://127.0.0.1:8601/ /;
        proxy_read_timeout 60s;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        break;
    }


    location / {
        try_files $uri /bitrix/urlrewrite.php =404;
        proxy_pass       http://127.0.0.1:8600;
        proxy_redirect   http://127.0.0.1:8600/ /;
        proxy_read_timeout 60s;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

Для замены конфигурации запускаем

curl -sS -X PUT -d @/path/to/server.config http://127.0.0.1:8443/

В настоящий момент конфигурацию надо подгружать при запуске апп-сервера, в следующих версиях Unit будет сохранять загруженную конфигурацию при перезапуске.

8443 — порт по умолчанию апп-сервера.

Сначала перечисляем приложения, при этом для каждого приложения указываем версию интерпретатора. В качестве точки входа можно указать параметр index (и тогда скрипт будет браться из строки запроса), или, в случае точки входа, script — и тогда запросы будут идти на конкретный скрипт. Опять же, обратите внимание, для «1С-Битрикс» запускаются два приложения:

Конфиг:

{                                                             
        "applications": {                                     
                "laravel": {                                     
                        "type": "php 7.0",                    
                        "user": "nobody",                     
                        "group": "nobody",                    
                        "workers": 2,                         
                        "root": "/var/www/vhosts/laravel/public",
                        "script": "index.php",                
                },                                            
                "plain": {                                     
                        "type": "php 7.0",                    
                        "user": "nobody",                     
                        "group": "nobody",                    
                        "workers": 2,                         
                        "root": "/var/www/vhosts/test",       
                        "index": "index.php"                 
                },                                            
                "bitrix": {                                   
                        "type": "php 5.6",                    
                        "user": "nobody",                     
                        "group": "nobody",                    
                        "workers": 2,                         
                        "root": "/var/www/vhosts/bitrix",  
                        "script": "/bitrix/urlrewrite.php"    
                },                                            
                "bitrix_index": {                             
                        "type": "php 5.6",                    
                        "user": "nobody",                     
                        "group": "nobody",                    
                        "workers": 2,                         
                        "root": "/var/www/vhosts/bitrix",  
                        "script": "index.php"                 
                }                                             
        },       

Затем апы вешаются на порты:

        "listeners": {                                        
                "*:8300": {                                   
                        "application": "laravel"                 
                },                                            
                "*:8500": {                                   
                        "application": "plain"                 
                },                                            
                "*:8600": {                                   
                        "application": "bitrix"               
                },                                            
                "*:8601": {                                   
                        "application": "bitirx_index"         
                }                                             
        }                                                     
}        

Мы все ждали этого довольно давно, однако давайте все-таки рассмотрим случаи, когда Unit принесет серьезное преимущество:

  • гетерогенная инфраструктура приложения. Сейчас в рамках одного app-сервера можно держать разные версии PHP, запускать Python и Go. К концу года ожидается NodeJS, Java и, возможно, Ruby. Все это в одном конфиге, одном и том же app-сервере. Приложения больше не пишут на одном языке, и это действительно облегчит всем нам жизнь.
  • зоопарк версий на одной системе. Устали от многочисленных конфигураций и сборок fpm с разными версиями? Теперь это может быть запущено в пределах одного приложения. Понятно, что это не «чистая» ситуация, но она часто встречается и, опять же — серьезное облегчение жизни.
  • если пункты 1 и 2 мы чувствуем на себе, то третий, о котором говорит Nginx, еще предстоит попробовать. Единое и простое управление конфигурацией микросервисной архитектурой. Единая система управления конфигурациями через REST API, единый продукт в целом.

Пока Application Platform еще бета, но уже можно пробовать и готовить свои конфигурации к продакшену. Ждем дальнейших новостей!

Автор: eapotapov

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/nginx/263416

Ссылки в тексте:

[1] Основной сайт проекта: http://unit.nginx.org/

[2] Гитхаб: https://github.com/nginx/unit

[3] PGP-ключ NGINX: http://nginx.org/keys/nginx_signing.key

[4] Источник: https://habrahabr.ru/post/337346/