%3F.png)
Я запускаю Nginx, FCGI и Request Tracker на сервере Debian Jessie. Request Tracker обслуживается Nginx, но FCGI находится между ними. Важно то, что сервер FCGI иногда выходит из строя, в результате чего пользователи RT видят ошибку 502. Исправление достаточно простое, но только потому, что я делал это бесчисленное количество раз за последний месяц или около того. Если меня нет рядом, а кому-то другому приходится перезапускать сервер FCGI, у него могут возникнуть трудности. Кроме того, остановка и перезапуск сервера раздражают, но это нужно сделать, чтобы применить изменения к RT.
Все это приводит меня к следующему: как мне лучше всего сделать команды более простыми? Скрипт? Служба, чтобы она находилась в /etc/init.d
? Что-то еще? Я новичок в Debian и Linux в целом, поэтому не знаю своих вариантов или насколько каждый из них может быть сложным. Вот команды, которые вам нужно выполнить:
netstat -antp | grep LIST | grep 12345
(Это находит сервер FCGI, привязанный к порту 12345, поэтому я могу получить PID. Допустим, наш PID — 8091.)
kill 8091
spawn-fcgi -u someUser -g someGroup -a 127.0.0.1 -p 12345 /opt/rt4/sbin/rt-server.fcgi
Важное замечание здесь: команда netstat
может ничего не вернуть. Если это так, сервер FCGI молча отказывает, поэтому вы пропускаете команду kill
и переходите сразу к spawn-fcgi
ней. В противном случае вы сохраняете kill
команду.
В идеале я бы хотел иметь опции запуска/остановки/перезапуска для чего-то вроде /etc/init.d/rt-fcgi-server
. Я понятия не имею, что делать, чтобы убить процесс, хотя, из-за необходимости сначала найти PID. Я думал об использовании файла .pid
, но я не знаю, как указать, spawn-fcgi
чтобы использовать его, и что делать с таким файлом, даже если бы он у меня был. Я даже не знаю, сделает ли это то, что я хочу (сохранить PID, чтобы я мог избежать использования команды netstat
).
Надеюсь, все это имеет смысл. По сути, я хочу иметь одну команду или что-то, связанное с /etc/init.d
, для управления результатом команды spawn-fcgi
. Я хочу, чтобы не-root-пользователи, которые знают о Linux меньше, чем даже я, могли войти в систему и выполнить одну команду, и я бы не отказался от способа запроса статуса этого процесса без использования netstat
, даже если мне не нужно будет получать PID, чтобы завершить его. Таким образом, я могу использовать что-то вроде Monit для автоматического перезапуска сервера в случае его сбоя.
решение1
Я собираюсь написать этот ответ с точки зрения FreeBSD, но он должен быть применим к Linux и Debian... названия пакетов и т. д. могут измениться.
Я был так же недоволен spawn-fcgi. На FreeBSD у него есть скрипт rc.d, но он не подчиняется правилам rc.d (например, не может "перезапуститься").
Однако в нижней части руководства spawn-fcgi упоминается supervisor. После некоторого поиска это дало "daemontools" ... На FreeBSD были пакеты для daemontools и daemontools-encore. -encore, похоже, был новее и обладал большими возможностями, поэтому я выбрал его. Моя версия — 1.10_1 daemontools-encore.
На FreeBSD для svscan предоставляется скрипт rc.d. На FreeBSD он сканирует /var/service на предмет подкаталогов и запускает "supervise" для каждого из них. Я принял эту конфигурацию по умолчанию и вставил svscan_enable="YES"
в /etc/rc.conf. Для Linux я не знаю о скрипте rc, но он говорит, что /service — это каталог по умолчанию.
Внутри /var/service я создал rt-fcgi, а внутри rt-fcgi я создал run. "run" содержит:
#!/bin/sh
spawn-fcgi -u www -g www -s /tmp/rt.sock -n -- /usr/local/sbin/rt-server.fcgi
Очевидно, что в Linux для этого необходимо указать используемого вами пользователя и группу, а также расположение вашего rt-server.fcgi.
Система svscan, похоже, объявляет последние несколько строк ошибки в заголовке процесса. Есть и другие варианты. Мой выглядит так:
46495 - IJ 0:00.01 /usr/local/bin/readproctitle service errors: ...tory (/var/run/rt44/data/gpg). GnuPG support has been disabled (/usr/local/lib/perl5/site_perl/RT/Config.pm:790)\n[52465] [Tue Mar 7 21:09:54 2017] [warning]: The requested port (443) does NOT match the configured WebPort (80). Perhaps you should Set($WebPort, 443); in RT_SiteConfig.pm, otherwise your internal hyperlinks may be broken. (/usr/local/lib/perl5/site_perl/RT/Interface/Web.pm:1328)\n
... это значит, что у меня не настроен правильно gnupg. Похоже, вы можете искать ошибки и все такое там, если вы не настроите журнал для svscan.
Это довольно тяжелый кусок для одного fcgi, но он консервирован и работает. Он имеет дело со скриптом, завершающимся по любой причине, но он не управляет файлом PID или сокетом (кроме создания файла сокета).
Должен сказать, что стандарт WSGI мне нравится гораздо больше, чем вся эта неразбериха.