Bagaimana cara mengatur dependensi layanan systemd?

17

Selama sistem CentOS 7 boot, nginx start gagal dengan kesalahan berikut:

2014/08/04 17:27:34 [emerg] 790#0: bind() to a.b.c.d:443 failed (99: Cannot assign requested address)

Saya menduga ini terjadi karena antarmuka jaringan belum bangun sebelum mencoba mengikat ke alamat IP untuk melayani vhost melalui SSL.

Dugaan saya adalah saya perlu menentukan network.service sebagai persyaratan untuk nginx.service, tetapi saya tidak dapat menemukan layanan jaringan di / etc / systemd / at all.

Bagaimana saya bisa mengkonfigurasi urutan layanan atau dependensi dalam systemd?

vincent.io
sumber
1
Apakah Anda lebih mencari dependensi layanan daripada pesanan ?
CVn
Poin bagus! Diperbarui.
vincent.io
1
Ini dapat membantu: serverfault.com/questions/482730/…
Belmin Fernandez
Terima kasih, itu menyelesaikannya! Pikiran untuk memasukkannya ke dalam jawaban sehingga saya bisa menutupnya? :)
vincent.io
Menghapus jawaban saya. Sumber jawaban itu diposting (Tn. Hampton). Harus menandai sebagai jawaban yang benar.
Belmin Fernandez

Jawaban:

19

Anda perlu, setidaknya, After=network.targetdi [Unit]bagian file unit Anda, untuk memastikan bahwa jaringan sudah aktif sebelum memulai nginx. Saya tidak tahu mengapa file unit Anda tidak memilikinya.

Ini adalah contoh lengkap dari sistem Fedora saya yang praktis, seperti yang dikirimkan oleh Fedora:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Michael Hampton
sumber
Terima kasih, jawaban yang bagus! Saya menginstal nginx dari repositori remi (pihak ketiga), yang mungkin menjelaskan mengapa "Setelah" hilang dalam file unit.
vincent.io
1
Menarik. Saya akan memberinya pesan dan memberi tahu dia tentang masalahnya. Paket-paketnya biasanya berkualitas sangat tinggi dan saya tidak yakin bagaimana dia melewatkannya.
Michael Hampton
Saran bagus, sudah selesai.
vincent.io
5

Dari log kesalahan, sepertinya konfigurasi nginx Anda. file memiliki arahan mendengarkan dengan alamat ip eksplisit:

listen a.b.c.d:443

Ini berarti bahwa nginx tidak akan memulai kecuali antarmuka jaringan Anda dan IP abcd telah ditetapkan untuk antarmuka.

Anda memiliki dua opsi:

  • ubah arahan listen to: listen 443; (ikat ke semua alamat ip)
  • buat nginx bergantung pada network-online.target

Seperti yang dijelaskan dalam http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ the network.target hanya menunjukkan bahwa tumpukan manajemen jaringan sudah habis [...] Apakah ada antarmuka jaringan yang sudah dikonfigurasi ketika tercapai tidak terdefinisi.

Jika Anda ingin memastikan bahwa alamat IP sudah ditetapkan dan antarmuka sudah habis, Anda perlu menambahkan network-online.target ke file unit systemd nginx Anda.

File /etc/systemd/system/multi-user.target.wants/nginx.service Anda seharusnya memiliki network-online.target di baris After = dan Membutuhkan =.

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target network-online.target
Requires=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Luca Gibelli
sumber
1
+1 untuk disebutkan network-online.target- jika seseorang juga bertanya-tanya: ya, keduanya Requires=dan After=perlu karena Requires=(bisa dibilang mengejutkan) tidak menyiratkan pemesanan antara unit yang diperlukan dan yang membutuhkan.
maxschlepzig