LINUX.ORG.RU

Получится ли CGI для nginx с помощью socket activation и SCGI?

 ,


2

3

Здравствуйте

Хочется Nginx в режиме «получил запрос -> выполнил програму», но не хочется возиться с отдельным Fastcgi сервером. Возникла такая идея:

В nginx настраиваем SCGI прокси на порт 1234. В systemd настраиваем запуск нашей програмы когда кто-то стучится на порт 1234. Програма запускается, читает SCGI-запрос с порта 1234, возвращает результат и умирает.

SCGI-протокол реализовать вроде-как не сложно на чем угодно (например на lua). А из lua уже (если надо) вызывать нужную програму, словно из командной стороки.

Вопросы:

1. Получится ли?

2. Можно ли усилиями systemd во время сокетной активации перенаправить данные с сокета на stdin вызываемой програмы (чтобы в lua не открывать сокет, а читать данные из стандартного ввода)?

3. Если настроить активацию на именованный unix-сокет, можно ли читать/писать в него функциями для работы с файлами?

★★★★★

Последнее исправление: makoven (всего исправлений: 2)

Я не понял, а что, обычные CGI вообще не рассматриваются? Получил запрос → запустил CGI → отработал.

systemd

Изыди!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

обычные CGI вообще не рассматриваются?

Очень даже рассматриваются. Вот только каким web-сервером их запускать? Эхх )

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

ЯННП. У меня CGI и с апачем, и с NGINX отлично работают. Если есть желание, можно из-под lighthttpd запустить. В чем проблема-то???

Конфиги NGINX'а вообще почти дефолтные получаются, для апача — чуть подрихтовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от makoven

Из моих велосипедов: недопиленный файломенеджер (тупо на CGI работает); пример CGI на баше; древний автогид (тупо CGI, здесь же можешь глянуть про зайчатки IPC); управлялка шаговыми двигателями (тоже древняя).

Для упрощения работы с CGI + авторизации/аутентификации через https я библиотечку накромсал.

Но теперь я решил на вебсокеты переходить, CGI не удобны в определенных вещах.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от makoven

А, блин, точно. Для того, чтобы из-под NGINX'а CGI запускать, надо апач поставить. Теперь-то я вспомнил, почему я с NGINX'ом особо не заморачивался никогда.

Ну, тогда можно не париться и только апачем пользоваться.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от makoven

Читай.

Но таки советую выкинуть эту какашку NGINX и поставить апач.

Другой вариант — запилить свой веб-сервер, если нагрузка невелика, а особых фишек, кроме как html показывать, да CGI запускать, не нужно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

P.S. Если отдельный порт хочется, то можно вообще демона сварганить (см. в моих репах bta_utils пример bta_json). В моем случае (т.к. на серваке я не рут) демон запускается через ssh (раз в час по крону мой компьютер к серваку подключается и дергает демона, если тот не запущен, то запускается). А в случае, когда ты рут, ничего проще нет: пишешь в inittab запуск своего демона с respawn и забываешь про него.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от i_gnatenko_brain

fastcgi — немного не то. В случае с fastcgi все CGI'шки по сути висят в оперативе сервера. А в случае с обычными CGI они тупо дергаются по запросу.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Вебсокеты нужны только если требуется получать большие данные «в реальном времени» с сервера. Для общего назначения их использовать очень заморочено.

Кстати, для «реалтайм» есть HTML5-нативная вещь Server-sent events

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

fastcgi — немного не то

Так он это и хотел:

В systemd настраиваем запуск нашей програмы когда кто-то стучится на порт 1234

А то что оно там в оперативе висит, это все настраивается, сколько их там висеть будет и все такое.

deep-purple ★★★★★
()
Ответ на: комментарий от Eddy_Em

Хипстеры предпочитают раритетные вещи. Апач, например )

Но мы далеко ушли от темы. Господа, если есть тут разбирающиеся в systemd и сокетной активации, прошу поделиться вашими мыслями

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Да, если у вас кодировка не КОИ-8, то надо убрать преобразование имени файла из юникода в КОИ в index.html.

Назло всем сделал свою хрень ещё костыльнее и тормознее.

Deleted
()

2. Можно ли усилиями systemd во время сокетной активации перенаправить данные с сокета на stdin вызываемой програмы (чтобы в lua не открывать сокет, а читать данные из стандартного ввода)?

Да, можно. Accept=true в .socket-юните и сделай соответствующий .service-юнит шаблонным (без внутренних изменений, просто допиши @ в конец имени).

3. Если настроить активацию на именованный unix-сокет, можно ли читать/писать в него функциями для работы с файлами?

Откуда? Из активируемой программы? Или извне (с целью отладки)?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Accept=true

Спасибо, добрый человек. Правда из мануала по Accept не очевидно, что сокет перенаправляется на stdio:

If true, a service instance is spawned for each incoming connection and only the connection socket is passed to it

Получается, что сокет все-таки передается в програму?

Откуда? Из активируемой программы? Или извне (с целью отладки)?

Из програмы. Делать read/write в файл unix.sock, который указывался для активации.

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от deadNightTiger

Вот это то что нужно! Спасибо )

makoven ★★★★★
() автор топика
Ответ на: комментарий от deadNightTiger

Во, точно, забыл. Только без StandardError=, наверное — незачем сыпать в сокет отладочной печатью :]

intelfx ★★★★★
()

Не слушай Эдика, он тут нагнал пурги, но он не понимает что такое cgi, fcgi и почему апач давно пора закопать.

С systemd я бы не стал заморачиваться, проще через fcgi решить проблему. Но если у тебя куча свободного времени...

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Но если у тебя куча свободного времени...

Пара вечеров есть. Хватит чтобы написать парсер SCGI. Его спецификация оказалась такая маленькая, что даже захотелось купить мешок ESP8266 и управлять ими по SCGI прямо из nginx'a

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

А на каком железе сервер крутится? А то я, например, подобные задачи решаю при помощи микрофреймворков (в моём случае bottle.py). Причём, многие уже содержат в себе встроенный веб-сервер и кучу батареек (отдача статики, шаблоны, куки и авторизация, работа с БД, обработка длинных запросов в другом треде итп).

true_admin ★★★★★
()

Можно ли усилиями systemd во время сокетной активации перенаправить данные с сокета на stdin вызываемой програмы (чтобы в lua не открывать сокет, а читать данные из стандартного ввода)?

вот и выросло поколение шиштемди

reprimand ★★★★★
()
Ответ на: комментарий от true_admin

На обычном, интеловском железе. Можно и на питоне. Просто сейчас хочется на lua с минимумом сторонней шелухи.

С systemd я бы не стал заморачиваться

А, собственно, почему нет? Он все-равно уже есть и никуда от него не деться. Значит надо гонять и в хвост и в гриву. И как супервайзер и как замену inetd. И как замену cron

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

Значит надо гонять и в хвост и в гриву.

Я раньше тоже так думал. Но в нём многое сделано через задницу. Потом, с точки зрения экономии ресурсов это не имеет смысла. Если дело только в ресурсах то точно не стоит заморачиваться.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Но в нём многое сделано через задницу

Пока-что не заметил. Хотя опыта в администрировании этого адского комбайна не так уж много

makoven ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Теперь-то я вспомнил, почему я с NGINX'ом особо не заморачивался никогда.
Eddy_Em

Потому что ты дебил? Ну хорошо что вспомнил, главное - не забывай! :)

anonymous
()
Ответ на: комментарий от makoven

Пара вечеров есть. Хватит чтобы написать парсер SCGI.

Чтобы гонять CGI-шки из под nginx?!?!?! Да ты упроролся! :) Мне когда это было надо (~ года 3-4-5 назад) я в nginx прописал proxy-pass для локейшена на маааасенткий сервачок только для CGI-шек. Вот этот: http://acme.com/software/thttpd/

И всё :)

anonymous
()
Ответ на: комментарий от makoven

А зачем тебе «басик аут»? Ты же всеравно дальше в цги передавать будешь, вот пусть он аутом и занимается. Да и реализовывается он в один присест, этот басик аут.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Так хочется чтобы еще и статика вся была под басик аутх. С аутентификацией через cgi получается что весь хтмл и картинки доступны по ссылке и единственная защита от доступа к ним - это незнание их имен? Или предлагаешь отдавать статику через cgi?

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

А, ну если на весь хост, я бы взял нжинкс, а там уже прикрутил бы что подойдет.

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.