2013-07-03 7 views
109

आप में से जो उत्पादन में जाओ बैकेंड चल के लिए:Golang उत्पादन वेब अनुप्रयोग विन्यास

एक जाओ वेब अनुप्रयोग को चलाने के लिए अपने ढेर/विन्यास क्या है?

मैंने सर्वर पर चलने के लिए मानक लाइब्रेरी नेट/http पैकेज का उपयोग करने वाले लोगों के अलावा इस विषय पर बहुत कुछ नहीं देखा है। मैंने गो सर्वर पर अनुरोध पास करने के लिए Nginx का उपयोग करके पढ़ा - nginx with Go

यह मेरे लिए थोड़ा नाजुक लगता है। उदाहरण के लिए, मशीन को पुनरारंभ होने पर सर्वर स्वचालित रूप से पुनरारंभ नहीं होगा (अतिरिक्त कॉन्फ़िगरेशन स्क्रिप्ट के बिना)।

क्या कोई ठोस उत्पादन सेटअप है?

मेरे इरादे के बारे में एक तरफ - मैं अपनी अगली परियोजना के लिए एक गो संचालित आरईएसटी बैकएंड सर्वर की योजना बना रहा हूं और यह सुनिश्चित करना चाहता हूं कि परियोजना में लाइव निवेश करने के लिए गो व्यवहार्य होने जा रहा है इससे पहले कि मैं इसमें बहुत निवेश कर सकूं।

+1

"मशीन पुनरारंभ होने पर सर्वर स्वचालित रूप से पुनरारंभ नहीं होगा (अतिरिक्त कॉन्फ़िगरेशन स्क्रिप्ट के बिना)।" मुझे नहीं लगता कि यह किया जा सकता है। आदर्श रूप से आप सेवा के लिए init/systemd/अपस्टार्ट स्क्रिप्ट बनाएंगे। किसी यूनिक्स डिमन को नियंत्रित करने के लिए यह अनुशंसित तरीका है। – Intermernet

+0

ठीक है आप हैं। मुझे लगता है कि मेरा मतलब यह है कि यह अपाचे जैसे सर्वर के विपरीत है, जो स्वचालित रूप से इंस्टॉल समय पर उन सुविधाओं को सेट करता है। – Chaseph

उत्तर

127

गो प्रोग्राम पोर्ट 80 पर सुन सकते हैं और सीधे HTTP अनुरोधों को पूरा कर सकते हैं। इसके बजाय, आप अपने गो प्रोग्राम के सामने एक रिवर्स प्रॉक्सी का उपयोग करना चाह सकते हैं, ताकि यह पोर्ट 80 पर सुन सके और पोर्ट पर अपने प्रोग्राम से कनेक्ट हो, 4000 कहें। बाद वाले करने के कई कारण हैं: चलाने के लिए नहीं रूट के रूप में आपका गो प्रोग्राम, एक ही मेजबान पर अन्य वेबसाइटों/सेवाओं की सेवा, एसएसएल समाप्ति, भार संतुलन, लॉगिंग इत्यादि

मैं सामने HAProxy का उपयोग करता हूं। कोई रिवर्स प्रॉक्सी काम कर सकता है। Nginx भी एक अच्छा विकल्प है (हैप्रोक्सी से कहीं अधिक लोकप्रिय और अधिक करने में सक्षम)।

यदि आप documentation (HTML version) पढ़ते हैं तो हैप्रोक्सी कॉन्फ़िगर करना बहुत आसान है। मेरी गो परियोजनाओं में से एक के लिए मेरी पूरी haproxy.cfg फ़ाइल निम्नानुसार है, यदि आपको प्रारंभिक पोंट की आवश्यकता है।

global 
     log  127.0.0.1  local0 
     maxconn 10000 
     user haproxy 
     group haproxy 
     daemon 

defaults 
     log  global 
     mode http 
     option httplog 
     option dontlognull 
     retries 3 
     timeout connect 5000 
     timeout client 50000 
     timeout server 50000 

frontend http 
     bind :80 
     acl is_stats hdr(host)  -i  hastats.myapp.com 
     use_backend stats if  is_stats 
     default_backend  myapp 
     capture  request header Host  len  20 
     capture  request header Referer len  50 

backend myapp 
     server main 127.0.0.1:4000 

backend stats 
     mode  http 
     stats enable 
     stats scope http 
     stats scope myapp 
     stats realm Haproxy\ Statistics 
     stats uri /
     stats auth username:password 

Nginx भी आसान है।

सेवा नियंत्रण के संबंध में, मैं अपने गो प्रोग्राम को सिस्टम सेवा के रूप में चलाता हूं। मुझे लगता है कि हर कोई ऐसा करता है। मेरा सर्वर उबंटू चलाता है, इसलिए यह उपस्टार्ट का उपयोग करता है। मैं /etc/init/myapp.conf पर इस डाल दिया है कल का नवाब मेरा कार्यक्रम को नियंत्रित करने के लिए:

start on runlevel [2345] 
stop on runlevel [!2345] 

chdir /home/myapp/myapp 
setgid myapp 
setuid myapp 
exec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log 

एक अन्य पहलू यह तैनाती है। एक विकल्प केवल प्रोग्राम और आवश्यक संपत्तियों की बाइनरी फाइल भेजकर तैनात करना है। यह आईएमओ का एक बहुत अच्छा समाधान है। मैं दूसरे विकल्प का उपयोग करता हूं: सर्वर पर संकलन। (जब मैं एक तथाकथित "निरंतर एकीकरण/परिनियोजन" प्रणाली स्थापित करता हूं तो मैं द्विआधारी फ़ाइलों के साथ तैनाती पर स्विच करूंगा।)

मेरे पास सर्वर पर एक छोटी खोल स्क्रिप्ट है जो मेरे प्रोजेक्ट के लिए रिमोट गिट से कोड खींचती है भंडार, इसे गो के साथ बनाता है, द्विआधारी और अन्य संपत्तियों को ~/myapp/ पर प्रतिलिपि बनाता है, और सेवा को पुनरारंभ करता है।

कुल मिलाकर, पूरी चीज किसी अन्य सर्वर सेटअप से बहुत अलग नहीं है: आपको अपना कोड चलाने और HTTP अनुरोधों को पूरा करने का कोई तरीका होना चाहिए। अभ्यास में, गो इस सामान के लिए बहुत स्थिर साबित हुआ है।

+7

महान जवाब! एक अनुशंसित बुनियादी सेटअप के लिए आवश्यक सब कुछ के अच्छे उदाहरण। – Intermernet

+0

लॉग रोटेशन के बारे में आप क्या करते हैं? यह बहुत ही कारण है कि मैं पर्यवेक्षक का उपयोग क्यों करता हूं लेकिन जब बहुत अधिक लॉगिंग चल रही है तो यह पीड़ित है। – fiorix

+0

@fiorix, मुझे पूरा यकीन है कि आप लॉग रोटेशन के बारे में एक अलग SO प्रश्न खोल सकते हैं, लेकिन फिर भी यदि आप यूनिक्स पर हैं और मानक टूल का उपयोग करना चाहते हैं, तो लॉग्रोटेट देखें: http://linuxcommand.org/man_pages/logrotate8। एचटीएमएल। इसका उपयोग कई प्रसिद्ध सेवाओं (अपाचे, यम, इत्यादि) द्वारा किया जाता है और इसे कॉन्फ़िगर करने में काफी आसान है। –

56

nginx के लिए:

  • मेरी गो आवेदन करने के लिए रिवर्स HTTP प्रॉक्सी
  • स्टेटिक फ़ाइल से निपटने
  • एसएसएल समाप्ति
  • HTTP हेडर (कैश-नियंत्रण, एट अल।)
  • पहुँच लॉग (और इसलिए सिस्टम लॉग रोटेशन का लाभ उठाने)
  • रिवाइट्स (www, http: // से https: //, आदि)

nginx यह बहुत आसान बनाता है, और यद्यपि आप सीधे net/http पर धन्यवाद से सेवा कर सकते हैं, वहां बहुत सारे "पहिया का पुन: आविष्कार" है और वैश्विक HTTP शीर्षकों जैसी चीजें शामिल हैं जिनमें कुछ बॉयलरप्लेट शामिल है जो आप शायद टाल सकते हैं।

supervisord मेरी गो बाइनरी के प्रबंधन के लिए। उबंटू का अपस्टार्ट (जैसा कि मोस्टाफा द्वारा उल्लिखित है) भी अच्छा है, लेकिन मुझे पर्यवेक्षक पसंद है क्योंकि यह अपेक्षाकृत विकृत-अज्ञेयवादी है और अच्छी तरह से प्रलेखित है।

Supervisord, मेरे लिए:

  • मेरी गो बाइनरी रूप में की जरूरत चलाता
  • यह लाता है ऊपर एक दुर्घटना
  • धारण मेरी पर्यावरण चर (सत्र प्रमाणीकरण कुंजियों, आदि) के लिए एक एकल के हिस्से के रूप के बाद config।
  • चलाता है मेरी डीबी
4

आप अपने द्विआधारी एक सॉकेट से इंटरनेट डोमेन विशेषाधिकार प्राप्त बंदरगाहों के लिए (1024 पोर्ट से कम संख्या) बाँध का उपयोग कर सकते हैं (यकीन है कि मेरे जाने द्विआधारी इसके बिना नहीं चल रहा है बनाने के लिए) setcap

setcap 'cap_net_bind_service=+ep' /path/to/binary

  1. यह आदेश परिवर्धित किया जाना चाहिए। sudo के रूप में आवश्यक
  2. अपने कार्यक्रम के प्रत्येक नए संस्करण के लिए एक नया बाइनरी कि setcap

setcap documentation

cap_net_bind_service documentation

2

द्वारा पुनः प्रमाणित होना करने के लिए जो लोग सरल जाने एप्लिकेशन चल रहा है चाहता हूँ के लिए की आवश्यकता होगी में परिणाम होगा एक डिमन के रूप में, अपस्टार्ट के बजाय systemd (कई लिनक्स डिस्ट्रोज़ द्वारा समर्थित) का उपयोग करें।

touch /etc/systemd/system/my-go-daemon.service 

पर एक सेवा फ़ाइल बनाएँ दर्ज

[Unit] 
Description=My Go App 

[Service] 
Type=simple 
WorkingDirectory=/my/go/app/directory 
ExecStart=/usr/lib/go run main.go 

[Install] 
WantedBy=multi-user.target 

तो सक्षम और शुरू सेवा

systemctl enable my-go-daemon 
systemctl start my-go-daemon 
systemctl status my-go-daemon 

systemd एक अलग जर्नलिंग प्रणाली है कि आप के लिए पूंछ लॉग दूँगी है आसान मुसीबत शूटिंग।

संबंधित मुद्दे