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