Pull to refresh
91.35
ITSumma
Эксперты в производительности

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

Reading time 5 min
Views 58K
Начиная с момента появления 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). Этот инструмент достаточно легок и позволяет на лету переконфигурировать настройки и количество приложений по мере необходимости при разработке.

Основной сайт проекта

Поддерживаемые на текущий момент платформы:
— Python 2.6, 2.7, 3
— PHP 5, 7
— Go 1.6 or later

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

→ Исходный код проекта загружен на Гитхаб.

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

Установка


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

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

Установка для CentOS 7

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

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

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

# yum install unit

Установка для Ubuntu 16.04

1. Скачайте PGP-ключ NGINX, Inc.

2. Добавьте ключ в связку ключей apt. После этого не должно быть оповещений об отсутствующем PGP-ключе во время установки Unit.

# sudo apt-key add nginx_signing.key

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

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

4. Скачайте 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 -X PUT -d @/path/to/start.json  --unix-socket ./control.unit.sock http://localhost/

(По-умолчанию — сокет, проксировать с сокета в TCP порт можно посредством nginx.)

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

Сначала перечисляем приложения, при этом для каждого приложения указываем версию интерпретатора. В качестве точки входа можно указать параметр 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 еще бета, но уже можно пробовать и готовить свои конфигурации к продакшену. Ждем дальнейших новостей!
Tags:
Hubs:
+119
Comments 119
Comments Comments 119

Articles

Information

Website
www.itsumma.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
ITSumma