2009-05-14 3 views
0

Ich richte einen Debian Etch Server ein, um Ruby und PHP Anwendungen mit nginx zu hosten. Ich habe erfolgreich inittab konfiguriert, um den PHP-CGI-Prozess beim Booten mit der Respawn-Aktion zu starten. Nach dem Ausfüllen von 1000 Anfragen, sterben die php-cgi worker Prozesse ab und werden von init erneut gespawnt. Der inittab Datensatz sieht wie folgt aus:Wie verkürzt man einen inittab-Prozesseintrag, a.k.a., wo Umgebungsvariablen platziert werden, die von init gesehen werden?

50:23:respawn:/usr/local/bin/spawn-fcgi -n -a 127.0.0.1 -p 8000 -C 3 -u someuser -- /usr/bin/php-cgi 

ich zunächst den Prozess Eintrag geschrieben (alles nach dem 3. Doppelpunkt) in einem separaten Skript (einfach, weil es lange war) und in der inittab Datensatz, die Skriptnamen setzen, sondern weil das Skript laufen würde war seine einzige Zeile und sterben, die syslog mit Fehlern wie folgt gefüllt:

May 7 20:20:50 sb init: Id "50" respawning too fast: disabled for 5 minutes 

So wurde ich der Skriptdatei zu befreien und einfach die ganze Zeile in der inittab setzen. Im syslog werden fortan keine Fehler mehr angezeigt.

Jetzt versuche ich das gleiche mit thin, um eine Schienen-Anwendung zu dienen. Ich kann erfolgreich den Thin-Server starten, indem Sie diesen Befehl ausführen:

sudo thin -a 127.0.0.1 -e production -l /var/log/thin/thin.log -P /var/run/thin/thin.pid -c /path/to/rails/app -p 8010 -u someuser -g somegroup -s 2 -d start 

Es funktioniert anscheinend genau das gleiche, ob ich die -d (daemonize) Flag verwenden oder nicht. Die Befehlszeilensteuerung kommt sofort zurück (die Prozesse wurden dämonisiert). Wenn ich den ganzen Befehl (minus sudo und mit absoluten Pfaden) in inittab schreibe, beschwert sich init (in syslog), dass der Prozesseintrag zu lang ist, also lege ich die Optionen in eine exportierte Umgebungsvariable in/etc/profile. Jetzt kann ich den Server erfolgreich mit Start:

sudo thin $THIN_OPTIONS start 

Aber wenn ich diesen in einem inittab Datensatz mit der Respawn Aktion

51:23:respawn:/usr/local/bin/thin $THIN_OPTIONS start 

die Protokolle zeigen deutlich, dass der Umgebungsvariable nicht sichtbar ist zu init; es ist, als ob der Befehl einfach "dünner Anfang" wäre.

Wie kann ich den inittab-Prozesseintrag verkürzen? Gibt es eine andere Datei als/etc/profile, wo ich die Umgebungsvariable THIN_OPTIONS setzen könnte? Meine früheren Erfahrungen mit php-cgi sagen mir, dass ich nicht den gesamten Befehl in ein separates Skript schreiben kann.

Antwort

0

init.d Skript

Verwenden Sie ein Skript in

/etc/rc.d/init.d 

und stellen Sie den Runlevel

Hier sind einige Beispiele mit dünn, Rubin, Apache

http://articles.slicehost.com/2009/4/17/centos-apache-rails-and-thin

http://blog.fiveruns.com/2008/9/24/rails-automation-at-slicehost

http://elwoodicious.com/2008/07/15/nginx-haproxy-thin-fastcgi-php5-load-balanced-rails-with-php-support/

Welches Beispiel Init-Skripte zur Verfügung stellen zu können.

bearbeiten: Asker wies darauf hin, dass Respawning nicht zulassen wird. Ich schlug vor, im Init-Skript zu verzweigen und den Prozess zu verwerfen, so dass init nicht hängen bleibt (es könnte fork() das Skript selbst, wird überprüfen). Und dann Erstellen einer Endlosschleife, die auf dem Serverprozess wartet, um zu sterben und neu zu starten.

edit2: Es scheint, init wird das Skript abzweigen. Nur eine Schleife sollte es tun.

+0

Danke - ein Problem, das diese Antwort nicht behandelt, ist das Respawnen des Thin-Servers, wenn/wenn er abbricht. Eine Person müsste sich an diesem Punkt anmelden und manuell starten, was wir bereits tun können. Soweit ich weiß, erlaubt nur inittab das automatische Respawnen. Wenn irgendjemand eine Möglichkeit kennt init zu sagen, init.d Skripte respawnen zu können, würde das auch mein Problem lösen. – towynlin

+0

Vielleicht verzweigen (Sorry) in der Init-Skript in eine Schleife, die den Server wiederholt gestartet, und wenn der Prozess stirbt, startet die Schleife neu und der Server, ad infinitum. –

+0

Nach mehrtägigem Betrieb ist der dünne Prozess nicht abgestorben. Das lässt mich glauben, dass Thin anders funktioniert als entweder (1) der php-cgi-Prozess selbst oder (2) alles begann mit spawn-fcgi (ich bin mir nicht sicher, welches) - inhärent beabsichtigt, nach dem Servieren einer bestimmten Anzahl von zu sterben Anfragen. Bewaffnet mit diesem Wissen glaube ich jetzt, dass ich mich nicht mehr um Respawn kümmern muss, obwohl Aidens Antwort den Job erledigen würde, wenn ich sicherstellen müsste, dass Thin Respawn würde. Ich habe ein sehr einfaches init.d-Skript erstellt, das einfach entweder "Thin Start" oder "Thin Stop" mit den entsprechenden Argumenten aufruft. – towynlin

1

Und warum rufen Sie nicht einen Wrapper, die mit Ihren Optionen dünn beginnen?

start_thin.sh:
#/bin/bash
/usr/local/bin/dünn -a 127.0.0.1 -e Produktion -l /var/log/thin/thin.log -P/var/run/thin/thin.pid -c/path/to/Schienen/app -p 8010 -u EinUser -G Einegruppe es 2 -D

beginnen und dann:
51: 23: RESPAWN:/usr/local/bin/start_thin

Verwandte Themen