मेरे पास localhost:8080
पर एक साधारण HTTP सेवा होस्ट करने वाला एक गो प्रोग्राम है, इसलिए मैं nginx
को proxy_pass
निर्देश के माध्यम से इसे होस्ट करने के लिए एक रिवर्स प्रॉक्सी के रूप में कनेक्ट कर सकता हूं मेरी साइट के अनुरोध का हिस्सा। यह सब बहुत अच्छा काम कर रहा है, कोई समस्या नहीं है।गो प्रोग्रामिंग भाषा में एक यूनिक्स डोमेन सॉकेट को विश्वसनीय रूप से अनलिंक कैसे करें (
मैं बेहतर सुरक्षा के लिए स्थानीय टीसीपी सॉकेट की बजाय यूनिक्स डोमेन सॉकेट पर HTTP सेवा होस्ट करने और टीसीपी के अनावश्यक प्रोटोकॉल ओवरहेड को कम करने के लिए गो प्रोग्राम को कनवर्ट करना चाहता हूं।
समस्या: समस्या यह है कि यूनिक्स डोमेन सॉकेट पुन: उपयोग नहीं किया जा सकता है एक बार वे bind()
लिए कर रहे हैं, इस कार्यक्रम समाप्ति के बाद भी है। दूसरी बार (और हर बार बाद में) मैं गो प्रोग्राम चलाता हूं यह एक घातक त्रुटि "address already in use"
से निकलता है।
सामान्य अभ्यास unlink()
यूनिक्स डोमेन सॉकेट (यानी फ़ाइल को हटा दें) जब सर्वर बंद हो जाता है। हालांकि, यह गो में मुश्किल है। मेरा पहला प्रयास मेरे मुख्य func में defer
कथन का उपयोग करना था (नीचे देखें), लेकिन अगर मैं CTRL-C जैसे सिग्नल के साथ प्रक्रिया को बाधित करता हूं तो यह दौड़ नहीं रहा है। मुझे लगता है कि यह उम्मीद की जा रही है। निराशाजनक, लेकिन अप्रत्याशित नहीं।
प्रश्न: वहाँ कैसे सॉकेट unlink()
जब सर्वर प्रक्रिया बंद हो जाती है (या तो शान से या ungracefully) पर एक सबसे अच्छा अभ्यास है?
यहाँ मेरी func main()
की बात यह है कि सर्वर संदर्भ के लिए सुन शुरू होता है:
// Create the HTTP server listening on the requested socket:
l, err := net.Listen("unix", "/tmp/mysocket")
if err != nil {
log.Fatal(err)
} else {
// Unix sockets must be unlink()ed before being reused again.
// Unfortunately, this defer is not run when a signal is received, e.g. CTRL-C.
defer func() {
os.Remove("/tmp/mysocket")
}()
log.Fatal(http.Serve(l, http.HandlerFunc(indexHtml)))
}
http : //stackoverflow.com/questions/11268943/golang-is-it-possible-to-capture-a-ctrlc-sigterm-signal-and-run-a-cleanup-fu – thwd
@ टॉम धन्यवाद। वह प्रश्न/उत्तर एक वर्ष पुराना है और गो अभी भी सुधार रहा है इसलिए मैं देखना चाहता था कि कुछ नया/बेहतर आया है या नहीं। –
'ओ। रीमोव ("/ tmp/mysocket") पहले पंक्ति से पहले कोशिश करें, क्या यह काम कर रहा है? –