Возвращаясь к теме серверов приложений. В прошлый раз я писал, что в alpine linux нету модуля psgi в сервере приложений uwsgi. И это проблема, так как мне нравится идея, что у меня для приложения есть собственно инстанс сервера приложений и ничего больше. Здесь же запускается master, router кто-то ещё и собственно экземпляры серверов приложений. Да можно держать целый пул приложений, причём динамический пул. Можно на одном сервере приложений держать целый зоопарк приложений. Но мне это всё не нужно. В моём случае прекрасно работает 1 экземпляр приложения. Но другого нам не дали, придётся обходиться тем что есть. Да, кстати, если приложение не запускается под unit-ом, то иногда понять почему оно так делает бывает не просто - unit не всегда пишет, что мешает приложению взлететь в отличие от uwsgi, который, если перл что-то скажет, обязательно запишет это в лог.

Итак, задачка стоит сконфигурять unit под psgi-приложения. Первое, на что мы нарываемся - вестимо занятный способ конфигурирования и, вероятно, баг в парсере unit-а. То есть, в версии 1.12 получается сохранить конфиг для контекста http://localhost, но не получаестя его загрузить. Самое интересное, что для контекста http://localhost/config конфигурация сохраняется хорошо и также хорошо вгружается обратно. На данном этапе развития непосредственно у localhost-а других контекстов, кроме config-а нету, поэтому можно смело брать его за базовый. Соответственно, это означает что надо произвести правку init-скрипта nginx-а. Мерж-реквест мэйнтэйнерам я сделал, думаю, что они его примут в ближайшее никогда, поэтому, делаем правки локально, на системе.

В нашем случае задача стоит так: у нас есть 3 приложения, хотим запускать каждое из них в своём сервере приложений. Конкретно для unit-а есть возможность запускать несколько инстансов этого сервера приложений "штатными средствами" дистрибутива - симлинки в /etc/init.d и конфиги в /etc/conf.d. Эта часть задачи тривиальна и рассматривать её тут я не буду.

Переходим сразу к приложениям. Первое - joyproxy и, как ни странно, это веб-приложение, то есть в него можно зайти по http, значит нам понадобится некоторый листенер. Особо разграничивать роутинг по запросам смысла нет, поэтому фигачим всё в приложение с дефолтными настройками роутера. У нас получается

{
    "access_log" : "/var/log/access.log",
    "applications" : {
        "joyproxy" : {
            "processes" : {
                "idle_timeout" : 20,
                "max" : 3,
                "spare" : 1
            },
            "script" : "/var/lib/myapi/joyproxy.psgi",
            "type" : "perl",
            "working_directory" : "/var/lib/myapi/"
        }
    },
    "listeners" : {
        "0.0.0.0:80" : {
            "pass" : "applications/joyproxy"
        }
    }
}

И заталкиваем это дело в nginx unit, в нужный нам инстанс. Unit тутже поднимает инстанс приложения и готов к работе.

Далее, у меня есть бот для телеги и бот для джаббера и это приложения, которые по крайней мере пока что не имеют возможности что-то принимать по http. То есть нам для них не понадобится listener. И у нас получается более лаконичный конфиг

{
    "access_log" : "/var/log/access.log",
    "applications" : {
        "myapitelegrambot" : {
            "processes" : 1,
            "script" : "/var/lib/myapi/myapi-telegram-bot.psgi",
            "type" : "perl",
            "working_directory" : "/var/lib/myapi/"
        }
    }
}

Собственно, на этом и заканчивается конфигурирование сервера приложений. Ясное дело, что в голом виде наружу их никто выставлять не будет, они будут за nginx-ом.

Next Post