Nginx'i start-up ile nasıl başlatabilirim?


9

Arka fon:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

Nginx oluşturdum ve başlatmak için upstart kullanmak istiyorum:

siteden nginx upstart komut dosyası:

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

Çalıştırmak için initctl kullanmaya çalıştığımda "bilinmeyen bir iş" alıyorum, görünüşe göre öğrendiğim gibi bir hata var (hataları tanımlamak için "Hata" ile ilgili sorun nedir?)

Birisi beni doğru yönde gösterebilir mi? Belgeleri olduğu gibi okudum ve bir SysV init değiştirme için biraz seyrek görünüyor ... ama sadece bu işi listeye eklemek, çalıştırmak ve hayatımın geri kalanıyla devam etmek için ne gerekiyorsa. .. Herhangi bir ipucu?

DÜZENLEME: initctl sürüm init (başlangıç ​​0.6.5)


1
'Bilinmeyen iş' ve 'Hata' hakkında bir yorum. Sadece yanlış yere bakıyorsun. Initctl yapılandırma dosyasını okumuyor, sadece Upstart'dan bilinen bir işi yüklemesini istiyor - ve initctl komutu verdiğinizde uptart bu işi bilmiyor. Upstart iş dosyasını okumaya çalıştığında hata oluştu. Sistem günlüğünde bir hata mesajı olmalıdır (/ var / log / syslog, / var / log / messages veya sisteminizin bu günlükleri nerede sakladığı)
Jacek Konieczny

Bu arada, / sbin'de sonradan başlatma işleri için başlatma ve durdurma komutları olduğu ortaya çıkıyor. Benim için çalıştılar. Şimdi, initctl'e geri bağlanıyorlar, bu yüzden neden çalıştıklarından emin değilim, ama çalışıyorlar.
Ekim'de chiggsy

Yanıtlar:


3

stop onUpstart> = 0.5 için bir uptart iş tanımında birden fazla direktifiniz olamaz .

Ve console ownermuhtemelen istediğiniz şey değildir (bu, nginx'i sistem konsolunun sahibi yapar).

Deneyin:

description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"
respawn

Hala bilinmeyen bir iş, ne yazık ki. Bu bilgiyi nereden alıyorsunuz? Adam? Bilgi? internet üzerinden? 0.6.5 nerede belgelenir?
chiggsy

biraz çalıştı .. thnx
chiggsy

Evet, mevcut Upstart belgelerini, en azından web'de bulmak zor. Ancak manuel sayfa oldukça iyi. Deneyin: man 5 init
Jacek Konieczny

1
Üretim sunucularında nginx'i çalıştırmanın doğru yolu bu değildir. daemon offSeçeneği yalnızca gelişimi içindir.
PhilT

16

Buraya bir kereden fazla geldim, bu yüzden buradaki cevapları kullandıktan sonra kendi deneyimlerime dayanarak güncellenmiş bir cevap sağlayacağımı düşündüm. Cevapları için özellikle @ danorton ve @ orj'a teşekkürler.

Bu komut dosyası, Ubuntu 12.04 üzerinde Nginx 1.0.11 ve Passenger 3.0.11 ile çalışan Upstart 1.5 üzerinde test edilmiştir. Yolcu kullanmıyorsanız, post-stophatla oynamanız gerekebilir . Upstart yemek kitabına bakın.

Boş bir /etc/init/nginx.confsatırda aşağıdaki satırları ekleyin (İsterseniz yorumları kaldırabilirsiniz):

description "nginx http daemon"

start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]

env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid

# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork

# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t

# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT

# Start Nginx
exec $DAEMON

Upstart betiğini Nginx Wiki'den aldım ve bir dizi satıra ihtiyaç duyulmadığı, karışıklığa neden olduğu veya çalışmadığı için değiştirdim.

Nginx'i yüklediğiniz yere ve PID'yi yazdığınız yere bağlı olarak değiştirmeniz env DAEMONve env PIDsatır yapmanız gerekebilir . PID, nginx olarak yapılandırılabilir.

Tüm biçimlerini denedim expect. Sadece expect forkişe yarıyor gibi görünüyor. Yolcu ile nginx 61 çatal oluşturur. Upstart, 0, 1 veya 2 gerektirir. Diğerleri ima ettiği gibi, Upstart yanlış PID'yi izleyecektir. respawnMuhtemelen aynı nedenden dolayı hiçbir şey yapmadığı için de kaldırdım . Bazı ek başlatma öncesi / sonrası komut dosyaları, gerçek PID'yi yakalayarak bunu düzeltebilir. Ancak, yeniden başlatmak için monit kullanın, bu yüzden gerek yok.

Kullanmayın daemon off. Bu sadece geliştirme amaçlıdır. Bkz. Http://wiki.nginx.org/CoreModule#daemon

Referanslar:


1
Bunu düşünürdüm ediyorum kullanarak çalıştırmak istediğiniz daemon off;zıpçıktı ihtiyaç duymadan doğru süreci / PID saatler böylece expect forkveya post-stopdirektifleri. Wiki bölüm cin seçeneği açıklayan da "Sen ancak yapamaz, runit / daemontools ile üretim modunda güvenle kapalı zarif bir yükseltme cin kullanabilirsiniz." Devletler, ben atıfta varsayıyorum ki yeni bir ikili yükseltme uçma özelliği.
Gary

3

Yapamazsın. En azından düzgün değil, her neyse.

Nginx, artalan sürecini “beklemek çatal” veya “artalan beklemek” yoluyla iki başlangıç ​​yolundan biriyle üretmez; Bazı hackler var, ama kendi sorunları var.

Uptart'ın ana işlemi takip edememesi ve kapatma sırasında öldürememesi konusunda iyiyseniz, bu işe yarayacaktır:

start on local-filesystems \
  and (net-device-added INTERFACE=lo) \
  and (runlevel [12345])
stop on runlevel [06]

env DAEMON=/usr/sbin/nginx

respawn
respawn limit 10 5

expect daemon

pre-start script
  $DAEMON -t
end script

$DAEMON

expect daemonupstart'ın benim için askıda kalmasına neden oluyor (Ubuntu 12.04, Upstart 1.5, Nginx). expect fork@danorton ipuçları gibi çalıştı, Upstart yanlış PID'yi izleyecek. Ayrıca çalışmak için yeniden doğamadım (Tam cevabımı görün).
PhilT

2

NGINX Wiki'de bir Upstart yapılandırma dosyası örneği vardır .

Yapılandırma dosyasındaki nginx ikili dosyasının yolunu ayarlamanız gerekebilir.

Bu yapılandırma dosyası Ubuntu 10.04 ve nginx 1.0.5 ile benim için iyi çalışıyor.

Ayrıca , başlatmak ve durdurmak için standart komutu kullanabilmem için bir işaret nginxbağlantısı kurdum ./etc/init.d/lib/init/upstart-jobservicenginx

Not: Phusion Passenger'ı NGINX ile kurarsanız, Upstart yapılandırma komut dosyasına aşağıdaki stanzaları eklemeniz gerekebilir:

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

Bunu Ubuntu yapılandırmamda buldum. Aksi takdirde yayınladığımda initctl stop nginxveya service nginx stopnginx aslında durmadı. Upstart'ın nginx işleminin aslında Yolcu işlemlerinden birinin PID'si olan bir PID olduğunu düşündüğünü de fark ettim. NGINX / Yolcu açıkça Upstart'ı biraz karıştırıyor.


Bu senaryo için yolcu için teşekkürler. Bu süreçleri durduruyor gibiydi ama bunu stop: Job failed while stoppingyaparken anladım . Bunu gördün mü?
PhilT

@PhilT ile aynı sorunum var, bu konuda herhangi bir kelime?
Claudio Poli

0

Kullanırım:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

Üzerinde durmak runlevel [!...]daha standart gibi görünüyor. Stok ssh / samba betiklerinin yaptığı budur. Ayrıca, respawnbit varsa yeniden başlaması için biti eklemelisiniz . Ayrıca neden console outputkonsol çıktısını stdout'a göndermesini istediğinizden emin değilim . Varsayılan davranış, konsol çıktısını kaydediciye göndermektir.

Upstart wiki'sindeki tüm stanza dokümanlarını görebilirsiniz


Ne yazık ki, bu wiki sadece 0.5 sürümü olduğunu ima ediyor gibi görünüyor. Böyle önemli bir değişikliğin bu şekilde belgelenmesi benim için çok garip.
chiggsy

Sadece 0.5 sürümü nedir?
Jim Mitchener

Genel olarak wiki. Man sayfaları tamam, ancak genellikle çok daha ayrıntılı olan 'bilgi' sayfaları olmadığından eminler.
Ekim'de chiggsy


0

Garip bir şekilde, buradaki cevapların hiçbiri tam olarak çalışmadığından, başka bir çalışmaya başlamalarını engelleyen bir durdurma / öldürme durumunda başlamayı bırakıyorlar. Bu restart nginxbaşarısız olduğu anlamına gelir .

Uptart ile hata https://bugs.launchpad.net/upstart/+bug/406397 adresinde iyi belgelenmiştir ve uptart yazarının düzeltmek için yeterince umursamadığına şaşırdım. Çalıştığını gördüğüm tek çözüm şudur (aynı hata raporundan çalındı):

# nginx - Nginx Web Server
#

description "Nginx Web Server"

start on (local-filesystems and
    (net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]

env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid

respawn

pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script

script
sleepWhileAppIsUp(){
    while pidof $1 >/dev/null; do
    sleep 1
    done
}
sleepWhileAppIsUp $DAEMON
end script

post-stop script
if pidof > /dev/null $DAEMON;
then
    $DAEMON -s stop
fi
end script

Bu şekilde yazmanın avantajı, yeniden doğmanın bile çalışmasıdır. Dezavantajı, çirkin ve kötü bir hack olmasıdır.


Upstart hemen hemen ölü bir üründür; Ubuntu bunu kullanan son dağıtımdır. Diğerlerinin tümü değişiyor ya da daha önce değişmiş durumda.
Michael Hampton

Ubuntu'nun kendisi bile daha yeni sürümlerde systemd'e geçti. Ancak bazılarımız sistem yöneticileri hala 14.04 ile sıkışıp kaldık çünkü LTS.
Ivan Anishchuk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.