सिस्टमड सर्विस निर्भरता कैसे सेट करें?


17

CentOS 7 सिस्टम बूट के दौरान nginx प्रारंभ निम्न त्रुटि के साथ विफल रहता है:

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

मुझे संदेह है कि नेटवर्क इंटरफेस के कारण अभी तक ऐसा नहीं हो रहा है क्योंकि एसएसएल पर वीएचएस परोसने के लिए उस आईपी पते पर बाँधने का प्रयास नहीं किया गया है।

मेरा अनुमान है कि मुझे nginx.service के लिए आवश्यकता के रूप में network.service निर्दिष्ट करने की आवश्यकता है, लेकिन मैं नेटवर्क सेवा को / etc / systemd / बिल्कुल भी नहीं ढूँढ सकता।

मैं सिस्टम ऑर्डर या सिस्टमडेंड पर निर्भरता को कैसे कॉन्फ़िगर कर सकता हूं?


1
क्या आप ऑर्डर से अधिक सेवा निर्भरता की तलाश में नहीं हैं ?
बजे एक CVn

अच्छी बात! अपडेट किया गया।
विन्सेंट.आईओ


धन्यवाद, जो इसे हल करता है! मन इसे एक जवाब में लगाने के लिए तो मैं इसे बंद कर सकता हूं? :)
विन्सेंट.आईओ

मेरा उत्तर हटा दिया। उस उत्तर का स्रोत पोस्ट किया गया (श्री हैम्पटन)। उसका सही उत्तर के रूप में निशान लगाना चाहिए।
Belmin फर्नांडीज

जवाबों:


19

आपको अपनी यूनिट फ़ाइल After=network.targetके [Unit]अनुभाग में न्यूनतम, यह सुनिश्चित करने की आवश्यकता है कि नेटवर्क शुरू करने से पहले यह सुनिश्चित करना है। मुझे नहीं पता कि आपकी इकाई फ़ाइल में ऐसा क्यों नहीं है।

यहाँ मेरा आसान फेडोरा प्रणाली से एक पूर्ण उदाहरण है, जैसा कि फेडोरा द्वारा शिप किया गया है:

[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

धन्यवाद, शानदार जवाब! मैंने रेमी रिपॉजिटरी (थर्ड-पार्टी) से नगीनेक्स स्थापित किया, जो समझा सकता है कि यूनिट फाइल में "आफ्टर" क्यों गायब है।
vincent.io

1
दिलचस्प। मैं उसे एक नोट छोड़ दूंगा और उसे समस्या के बारे में बता दूंगा। उनके पैकेज आमतौर पर बहुत उच्च गुणवत्ता वाले हैं और मुझे यकीन नहीं है कि वह कैसे चूक गए।
माइकल हैम्पटन

शानदार सुझाव, किया।
vincent.io

5

त्रुटि लॉग से, यह आपके nginx कॉन्फ़िगरेशन जैसा दिखता है। फ़ाइल में स्पष्ट आईपी पते के साथ सुनने का निर्देश है:

listen a.b.c.d:443

इसका मतलब यह है कि जब तक आपका नेटवर्क इंटरफ़ेस नहीं है, तब तक nginx शुरू नहीं होगा और IP abcd इंटरफ़ेस को सौंपा गया है।

आपके पास दो विकल्प हैं:

  • सुनने के निर्देश को बदलें: 443 सुनो; (सभी आईपी पते पर बाँधें)
  • nginx नेटवर्क-online.target पर निर्भर करते हैं

जैसा कि http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ network.target में वर्णित है, केवल यह बताता है कि नेटवर्क प्रबंधन स्टैक ऊपर है [...] किसी भी नेटवर्क इंटरफेस को पहले से ही कॉन्फ़िगर किया गया है जब यह पहुंच जाता है अपरिभाषित है।

यदि आप यह सुनिश्चित करना चाहते हैं कि IP पता पहले से ही असाइन किया गया है और इंटरफ़ेस ऊपर है, तो आपको अपनी nginx की systemd यूनिट फ़ाइल में network-online.target को जोड़ना होगा।

आपकी /etc/systemd/system/multi-user.target.wants/nginx.service फ़ाइल के बाद = में नेटवर्क-online.target होना चाहिए और = लाइनों की आवश्यकता होगी।

[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
+1 का उल्लेख करने के लिए network-online.target- यदि कोई व्यक्ति भी आश्चर्यचकित है : हाँ, दोनों आवश्यक हैं Requires=और ( After=क्योंकि Requires=आश्चर्यजनक रूप से) आवश्यक इकाई और आवश्यक एक के बीच एक आदेश का अर्थ नहीं है।
मैक्सक्लेपज़िग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.