उबंटू पर कॉन्फ़िगरेशन परीक्षण सफल होने के बाद ही मैं नेग्नेक्स को कैसे पुनः आरंभ करूं?


111

जब मैं उबंटू सर्वर पर कमांड लाइन पर nginx सेवा को पुनरारंभ करता हूं, तो nginx कॉन्फ़िगरेशन फ़ाइल में त्रुटियां होने पर सेवा क्रैश हो जाती है। मल्टी-साइट सर्वर पर यह सभी साइटों को नीचे रख देता है, यहां तक ​​कि बिना कॉन्फ़िगरेशन त्रुटियों के भी।

इसे रोकने के लिए, मैं पहले nginx कॉन्फ़िगरेशन परीक्षण चलाता हूं:

nginx -t

परीक्षण सफल होने के बाद, मैं इस सेवा को पुनः आरंभ कर सका:

/etc/init.d/nginx restart

या केवल पुनरारंभ किए बिना nignx साइट को फिर से लोड करें:

nginx -s reload

क्या उन दो आदेशों को संयोजित करने का एक तरीका है जहां पुनरारंभ कमांड कॉन्फ़िगरेशन परीक्षण के परिणाम के लिए सशर्त है?

मुझे यह ऑनलाइन नहीं मिला और इस पर आधिकारिक प्रलेखन बल्कि बुनियादी है। मुझे नहीं पता कि लिनक्स के आसपास मेरा रास्ता ठीक है, इसलिए मुझे नहीं पता कि मैं जो खोज रहा हूं वह मेरे सामने सही है या नहीं।

मैं nginx v1.1.19 का उपयोग कर रहा हूं।


एक छोटी सी शेल स्क्रिप्ट के बारे में क्या है जो nginx -t ($ के साथ?) की वापसी स्थिति की जांच करता है और फिर रिटर्न स्टेट के आधार पर रीस्टार्ट करता है?
टीटीईटी

जवाबों:


49

दरअसल, जहां तक ​​मुझे पता है, नगनेक्स एक खाली संदेश दिखाएगा और कॉन्फ़िगरेशन खराब होने पर यह वास्तव में पुनरारंभ नहीं होगा।

इसे पेंच करने का एकमात्र तरीका एक नगनेक्स स्टॉप करना है और फिर फिर से शुरू करना है। यह रोकने में सफल होगा, लेकिन शुरू करने में विफल।


1
आप किस नगीनेक्स के बारे में बात कर रहे हैं? मैं v 1.1.19 के साथ काम कर रहा हूं और यह विन्यास फाइल में किसी भी त्रुटि की परवाह किए बिना पुनः आरंभ करने का प्रयास करेगा। यह मुझे सूचित करेगा कि कोई समस्या है, लेकिन तब तक पहले ही बहुत देर हो चुकी है
Jan

5
ठीक है, मैंने अभी-अभी इसका परीक्षण किया है, मेरे लैपटॉप में nginx 1.2 है और इसने मेरे द्वारा वर्णित के रूप में काम किया है, मेरे VPS में आपके जैसे 1.1.19 हैं, और यह आपके प्रश्न में वर्णित के समान ही है। इसलिए मुझे लगता है कि यह 1.2
मोहम्मद अबूशैदी

महान! मेरे लिए यह पता लगाने के लिए धन्यवाद। मैं यह देखने के लिए सवाल को थोड़ी देर के लिए खुला रखूंगा कि क्या किसी के पास nginx <v1.2
jan

1
मुझे लगता है कि मुझे फिर अपग्रेड करना होगा :-) :-) वैसे भी एक बहाना चाहिए
Jan

1
service nginx reloadकुछ भी नहीं दिखाता है कि कॉन्फ़िगरेशन सही ढंग से लोड किया गया था या नहीं, इसलिए यदि आपको संदेह है कि कॉन्फ़िगरेशन गलत हो सकता है तो यह बेकार है। service nginx restartयदि सर्वर में त्रुटि है तो सर्वर बंद कर देगा!
डैन डस्केल्सस्कु

80

नगीनक्स 1.8.0 के रूप में, सही समाधान है

sudo nginx -t && sudo service nginx reload

ध्यान दें कि बग के कारण, कॉन्फ़िगरेशन फ़ाइल में त्रुटि होने पर भी configtestहमेशा शून्य निकास कोड लौटाया जाता है।


3
nginx -t && sudo nginx -s reload
मैकेनिज़्म

5
@MechanisM: nginx -tबिना सूडो अनुमति त्रुटियों के कारण लगभग निश्चित रूप से विफल हो जाएगा।
डैन डस्केल्सस्कु

मैं पुनः लोडिंग के लिए ज्यादातर अंतिम भाग दिखाना चाहता था। मेरे मामले में, मेरे पास कस्टम संकलित nginx है और /etc/init.d में कोई स्क्रिप्ट भी नहीं है और इसी तरह, इसलिए मेरे मामले में "सेवा nginx reload" कुछ भी नहीं करेगा
मैकेनिज़्म

39

मैं निम्नलिखित कमांड का उपयोग नग्नेक्स (संस्करण १.५.९) को फिर से लोड करने के लिए करता हूँ, यदि कोई विन्यास परीक्षण सफल था:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

यदि आपको अक्सर ऐसा करने की आवश्यकता होती है, तो आप एक उपनाम का उपयोग करना चाह सकते हैं। मैं निम्नलिखित का उपयोग करता हूं:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

यहां ट्रिक "&&" द्वारा की जाती है जो केवल पहली बार सफल होने पर दूसरी कमांड निष्पादित करती है। आप यहां "&&" ऑपरेटर के उपयोग का अधिक विस्तृत विवरण देख सकते हैं ।

यदि आप वास्तव में सर्वर को पुनः आरंभ करना चाहते हैं, तो आप "पुनः लोड" के बजाय "पुनरारंभ" का उपयोग कर सकते हैं।


1.4.2 के लिए खबरदार मैं पाया pkill -1 nginx(प्रभावी रूप से मेरे init.d / nginx पुनः लोड करता है) अगर विन्यास विफल रहता है और भ्रामक रूप से सफल रिटर्न देता है तो पुनः लोड नहीं करता है। अपने स्वयं के संस्करणों की जाँच करें।
KCD

2
यह मेरे लिए काम नहीं करता है। परीक्षण विफल होने पर भी दोनों आदेशों को निष्पादित किया जाता है।
मारियो कैंपा

2
configtest हमेशा शून्य निकास कोड देता है , कम से कम nginx 1.8.0 में। nginx -tइसके बजाय उपयोग करें ।
डैन डस्केल्सस्कु

8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

और फिर कमांड "nginx.reload" आदि का उपयोग करें।


6

आप का उपयोग कर पुनः लोड कर सकते /etc/init.d/nginx reloadहैं औरsudo service nginx reload

यदि nginx -tकुछ त्रुटि होती है तो वह पुनः लोड नहीं होगी

इसलिए एक ही समय में चलाने के लिए && का उपयोग करें

पसंद

nginx -t && /etc/init.d/nginx पुनः लोड करें


मैं आपको बैश के बारे में कुछ सिखाता हूं। && run both at a same timeयह दाईं ओर कमांड नहीं चलाता है। यदि बाईं ओर कमांड 0. nginx -tका एग्जिट कोड देता है, तो यदि यह एरर कोड से बाहर निकलता है, तो 0 नहीं होगा, इसलिए दूसरा कमांड नहीं चलेगा। इसके nginx -s reloadलिए वैसे भी
miknik

@miknik मुझे लगता है कि वह कहने का मतलब है, यह सिर्फ सही नहीं निकला। वह कहता है If nginx -t throws some error then it won't reload। कथन की run both at a same timeव्याख्या एकल आदेश, या एक पंक्ति के रूप में भी की जा सकती है। मैं उसे इस मामले में जरूरी नहीं समझाता in parallel
मैट

2

आप nginx को नियंत्रित करने के लिए संकेतों का उपयोग कर सकते हैं।

प्रलेखन के अनुसार, आपको nginx मास्टर प्रक्रिया को HUP सिग्नल भेजने की आवश्यकता है।

HUP - परिवर्तित कॉन्फ़िगरेशन, परिवर्तित समय क्षेत्र (केवल FreeBSD और Linux के लिए) के साथ रखते हुए, एक नई कॉन्फ़िगरेशन के साथ नई वर्कर प्रक्रियाएँ प्रारंभ करना, पुरानी वर्कर प्रक्रियाओं का शालीन होना

यहां दस्तावेज़ देखें: http://nginx.org/en/docs/control.html

आप इस तरह nginx मास्टर प्रक्रिया PID को HUP संकेत भेज सकते हैं:

kill -HUP $( cat /var/run/nginx.pid )

ऊपर दिया गया कमांड nginx PID से पढ़ता है /var/run/nginx.pid। डिफ़ॉल्ट रूप से nginx pid को लिखा जाता है, /usr/local/nginx/logs/nginx.pidलेकिन इसे कॉन्फ़िगर में ओवरराइड किया जा सकता है। nginx.configयह देखने के लिए अपनी जाँच करें कि यह पीआईडी ​​को कहाँ बचाता है।


1

कम से कम डेबियन पर nginx स्टार्टअप स्क्रिप्ट में एक पुनः लोड फ़ंक्शन होता है जो करता है:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

लगता है जैसे तुम सब करने की आवश्यकता होगी कॉल है service nginx reloadबजाय restartके बाद से यह कहता है test_nginx_config


service nginx reloadकिसी भी तरह का संकेत नहीं देगा कि क्या कॉन्फ़िगरेशन ठीक है या नहीं, या यह फिर से लोड किया गया है या नहीं।
डैन डैस्कलेस्क्यू

test_nginx_configफिर उस मामले में क्या करता है?
डेनीय

1
मुझे लगता है कि आप दोनों के पास एक बिंदु है। service nginx reloadकमांड लाइन पर पर्याप्त है, हालांकि कभी-कभी आप स्टेडर आउटपुट को कैप्चर करना चाहते हैं और समस्या निवारण के लिए वापस स्क्रिप्ट पर लौट सकते हैं। nginx -tआपको बताएगा कि किस फ़ाइल में अमान्य पैरामीटर और किस लाइन पर था।
anastymous
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.