Bagaimana saya bisa memulai nginx via pemula?

9

Latar Belakang:

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

Saya telah membangun nginx, dan saya ingin menggunakan pemula untuk memulainya:

skrip pemula nginx dari situs:

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

Saya mendapatkan "pekerjaan tidak dikenal" ketika saya mencoba menggunakan initctl untuk menjalankannya, yang baru saya pelajari ternyata berarti ada kesalahan, (apa yang salah dengan "Kesalahan" untuk menggambarkan kesalahan?)

Bisakah seseorang mengarahkan saya ke arah yang benar? Saya sudah membaca dokumentasinya, dan sepertinya agak jarang untuk penggantian inisial SysV ... tapi apa pun yang perlu ditambahkan pekerjaan ini ke daftar, jalankan, dan lanjutkan dengan apa yang tersisa dalam hidup saya. .. Ada tips?

EDIT: initctl versi init (pemula 0.6.5)

chiggs
sumber
1
Satu komentar tentang 'pekerjaan tidak dikenal' vs 'Kesalahan'. Anda hanya mencari di tempat yang salah. Initctl tidak membaca file konfigurasi, ia hanya meminta Upstart untuk memuat pekerjaan yang diketahui - dan pemula tidak tahu pekerjaan ini ketika Anda mengeluarkan perintah initctl. Kesalahan terjadi sebelumnya ketika Upstart mencoba membaca file pekerjaan. Seharusnya ada pesan kesalahan di log sistem (/ var / log / syslog, / var / log / messages atau di mana pun sistem Anda menyimpan log ini)
Jacek Konieczny
By the way, ternyata di / sbin ada perintah start dan stop untuk pekerjaan pemula. Mereka bekerja untuk saya. Sekarang, mereka terhubung kembali ke initctl, jadi saya tidak yakin mengapa mereka bekerja, tetapi mereka melakukannya.
chiggsy

Jawaban:

3

Anda tidak dapat memiliki banyak stop onarahan dalam deskripsi pekerjaan pemula untuk pemula>> 0,5.

Dan console ownermungkin bukan yang Anda inginkan (ini membuat nginx pemilik sistem konsol).

Mencoba:

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
Jacek Konieczny
sumber
Pekerjaan masih belum diketahui, sayangnya. Dari mana Anda mendapatkan informasi ini? Pria? Info? on line? Di mana 0.6.5 didokumentasikan?
chiggsy
agak berhasil .. thnx
chiggsy
Ya, sulit untuk menemukan dokumentasi Pemula saat ini, setidaknya di web. Tapi halaman manualnya cukup bagus. Coba: man 5 init
Jacek Konieczny
1
Ini bukan cara yang tepat untuk menjalankan nginx di server produksi. The daemon offpilihan adalah untuk pengembangan saja.
PhilT
16

Saya berakhir di sini lebih dari sekali jadi saya pikir saya akan memberikan jawaban yang diperbarui berdasarkan pengalaman saya sendiri setelah menggunakan jawaban di sini. Terima kasih terutama kepada @danorton dan @orj atas jawaban mereka.

Script ini telah diuji pada Upstart 1.5 yang berjalan di Ubuntu 12.04 dengan Nginx 1.0.11 dan Passenger 3.0.11. Jika Anda tidak menggunakan Penumpang, Anda mungkin perlu bermain-main dengan post-stopgaris. Lihat buku masak pemula.

Dalam kosong /etc/init/nginx.conftambahkan baris berikut (Anda dapat menghapus komentar jika Anda suka):

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

Saya telah mengambil skrip Pemula dari Nginx Wiki dan mengubahnya karena sejumlah baris tidak diperlukan, menyebabkan kebingungan atau tidak berfungsi.

Anda mungkin perlu mengubah env DAEMONdan env PIDbaris tergantung di mana Anda telah menginstal nginx dan sedang menulis PID. PID dapat dikonfigurasi dalam nginx.

Saya mencoba semua bentuk expect. expect forkSepertinya hanya berfungsi. Dengan Penumpang nginx menciptakan 61 garpu. Pemula membutuhkan 0, 1 atau 2. Seperti orang lain telah mengisyaratkan, Pemula akan melacak PID yang salah. Saya juga dihapus respawnkarena tidak melakukan apa-apa mungkin karena alasan yang sama. Beberapa skrip pre / post-start tambahan mungkin dapat memperbaikinya dengan meraih PID yang sebenarnya. Saya, bagaimanapun, menggunakan monit untuk menangani restart sehingga tidak membutuhkannya.

Jangan gunakan daemon off. Ini hanya untuk pengembangan. Lihat http://wiki.nginx.org/CoreModule#daemon

Referensi:

PhilT
sumber
1
Saya akan berpikir bahwa Anda akan ingin menjalankan menggunakan daemon off;sehingga kaya baru jam tangan proses yang benar / PID tanpa perlu untuk expect forkatau post-stoparahan. Bagian wiki yang menjelaskan opsi daemon juga menyatakan "Anda dapat menggunakan daemon off dengan aman dalam mode produksi dengan runit / daemontools, namun Anda tidak dapat melakukan pemutakhiran yang baik.", Yang saya asumsikan merujuk pada peningkatan ke biner baru pada fitur terbang .
Gary
3

Kamu tidak bisa Setidaknya setidaknya tidak tepat.

Nginx tidak menelurkan daemonnya di salah satu dari dua cara yang dibutuhkan pemula, baik melalui "fork" atau "ekspektasi daemon", sehingga pemula tidak dapat melacak proses master nginx. Ada beberapa peretasan, tetapi mereka memiliki masalah sendiri.

Jika Anda setuju dengan fakta bahwa pemula tidak dapat melacak proses master dan membunuhnya saat shutdown, ini akan berhasil:

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
danorton
sumber
expect daemonmenyebabkan pemula untuk menggantung untuk saya (Ubuntu 12,04, pemula 1,5, Nginx). expect forkberfungsi meskipun seperti yang ditunjukkan oleh @danorton, Upstart akan melacak PID yang salah. Saya juga tidak bisa mendapatkan respawn untuk bekerja (Lihat jawaban lengkap saya).
PhilT
2

Ada Upstart file konfigurasi contoh di nginx Wiki .

Anda mungkin perlu menyesuaikan jalur ke biner nginx di file konfigurasi.

File konfigurasi ini berfungsi baik untuk saya dengan Ubuntu 10.04 dan nginx 1.0.5.

Saya juga memasang nginxsymlink di /etc/init.dmenunjuk /lib/init/upstart-jobjadi saya bisa menggunakan serviceperintah standar untuk memulai dan berhenti nginx.

Catatan: Jika Anda menginstal Penumpang Phusion dengan NGINX Anda mungkin perlu menambahkan bait berikut ke skrip konfigurasi Pemula:

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

Saya menemukan ini diperlukan pada konfigurasi Ubuntu saya. Kalau tidak, ketika saya mengeluarkan initctl stop nginxatau service nginx stopnginx tidak benar-benar berhenti. Saya juga memperhatikan bahwa Upstart berpikir proses nginx memiliki PID yang sebenarnya adalah PID dari salah satu proses Penumpang. Jadi jelas NGINX / Penumpang sedikit membingungkan Upstart.

orj
sumber
Terima kasih untuk skrip untuk penumpang. Ini sepertinya menghentikan proses tetapi saya dapat stop: Job failed while stoppingmelakukannya. Apakah kamu melihat ini?
PhilT
Saya memiliki masalah yang sama dengan @PhilT, ada kata tentang ini?
Claudio Poli
0

Saya menggunakan:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

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

Berhenti pada runlevel [!...]tampaknya lebih standar. Itulah yang dilakukan skrip ssh / samba saham. Anda juga harus menambahkan respawnbit sehingga restart jika mati. Saya juga tidak yakin mengapa Anda ingin console outputitu hanya mengirimkan output konsol ke stdout. Perilaku default adalah dengan hanya mengirim output konsol ke logger.

Anda dapat melihat semua dokumen bait di wiki pemula

Jim Mitchener
sumber
Sayangnya, wiki itu sepertinya menyiratkan bahwa itu hanya versi 0.5. Sangat aneh bagi saya bahwa perubahan penting seperti itu didokumentasikan dengan cara itu.
chiggsy
Apa itu hanya versi 0.5?
Jim Mitchener
Wiki secara umum. Halaman manual tidak apa-apa, tetapi mereka jelas bukan halaman 'info', yang biasanya jauh lebih detail.
chiggsy
0

Anehnya, tidak ada jawaban di sini yang benar-benar berfungsi sepenuhnya ketika mereka meninggalkan pemula dalam keadaan berhenti / terbunuh yang mencegah orang lain mulai bekerja. Ini berarti restart nginxgagal.

Bug dengan pemula ini didokumentasikan dengan baik di https://bugs.launchpad.net/upstart/+bug/406397 dan saya heran bahwa penulis pemula tersebut tampaknya tidak cukup peduli untuk memperbaikinya. Satu-satunya solusi yang saya lihat berfungsi adalah sebagai berikut (dicuri dari laporan bug yang sama):

# 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

Keuntungan dari menulisnya seperti ini adalah bahkan respawn bekerja. Kerugiannya adalah itu jelek dan hack jahat.

Cliff Stanford
sumber
Pemula cukup banyak produk mati; Ubuntu hampir merupakan distribusi terakhir yang menggunakannya. Semua yang lain sudah pindah atau sudah beralih.
Michael Hampton
Bahkan Ubuntu sendiri telah beralih ke systemd di versi yang lebih baru. Tetapi beberapa dari kita sysadmin masih terjebak dengan 14,04 karena LTS.
Ivan Anishchuk