Systemd hizmet bağımlılıkları nasıl ayarlanır?


17

CentOS 7 sistem önyüklemesi sırasında nginx start aşağıdaki hatayla başarısız olur:

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

Bunun, ağ arayüzlerinin henüz SSL üzerinden bir vhost sunmak için bu IP adresine bağlanmaya çalışmadan önce olmaması nedeniyle gerçekleştiğinden şüpheleniyorum.

Sanırım nginx.service için bir network.service belirtmem gerekiyor, ancak / etc / systemd / içinde ağ hizmetini bulamıyorum.

Systemd'deki servis siparişini veya bağımlılıkları nasıl yapılandırabilirim?


1
Eğer hizmet için daha aramıyorsanız bağımlılıkları daha sipariş ?
CVn

İyi bir nokta! Güncellenmiş.
vincent.io


Teşekkürler, bu çözüldü! Bir cevaba koymamın bir sakıncası var mı? :)
vincent.io

Cevabımı sildim. Bu cevabın kaynağı gönderildi (Bay Hampton). Doğru cevap olarak işaretlemeliyiz.
Belmin Fernandez

Yanıtlar:


19

Sen, en azından ihtiyaç After=network.targetiçinde [Unit]ağ nginx başlamadan önce olmasını sağlamak için, sizin birim dosyasının bölümüne. Birim dosyanızda neden bulunmadığı hakkında hiçbir fikrim yok.

İşte Fedora tarafından gönderilen kullanışlı Fedora sistemimin tam bir örneği:

[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

Teşekkürler, harika cevap! Nginx'i remi deposundan (üçüncü taraf) kurdum. Bu, birim dosyasında neden "After" ın eksik olduğunu açıklayabilir.
vincent.io

1
İlginç. Ona bir not bırakacak ve sorun hakkında bilgi verecektim. Paketleri genellikle çok kaliteli ve bunu nasıl özlediğinden emin değilim.
Michael Hampton

Büyük öneri, bitti.
vincent.io

5

Hata günlüğünden, nginx yapılandırmanıza benziyor. dosyasında açık bir ip adresi bulunan bir dinleme talimatı bulunur:

listen a.b.c.d:443

Bu, ağ arayüzünüz açık değilse ve IP abcd arayüze atanmamışsa nginx'in başlamayacağı anlamına gelir .

İki seçeneğiniz var:

  • dinleme yönergesini şu şekilde değiştirin: dinle 443; (tüm ip adreslerine bağlan)
  • nginx'i network-online.target dosyasına bağımlı hale getirin

Http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ ağ.target adresinde açıklandığı gibi, yalnızca ağ yönetimi yığınının yukarıda olduğunu gösterir [...] Herhangi bir ağ arabiriminin ulaşıldığında yapılandırılmış olup olmadığı tanımsız.

IP adresinin önceden atandığından ve arabirimin açık olduğundan emin olmak istiyorsanız, nginx'in systemd birim dosyasına network-online.target eklemeniz gerekir.

/Etc/systemd/system/multi-user.target.wants/nginx.service dosyanızın After = ve Require = satırlarında network-online.target olmalıdır.

[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

1
Söz +1 network-online.target- durumda biri de merak: Evet, hem Requires=ve After=nedeniyle gerekli olan Requires=(muhtemelen doğal olarak) gerekli birim ve gerektiren bir arasındaki bir sıralama anlamına gelmemektedir.
maxschlepzig
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.