गोलंग उत्पादन वेब अनुप्रयोग विन्यास


120

आप में से जो चल रहे हैं उनके उत्पादन में बैकएंड:

गो वेब एप्लिकेशन को चलाने के लिए आपका स्टैक / कॉन्फ़िगरेशन क्या है?

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

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

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

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


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

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

जवाबों:


134

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

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

यदि आप इसके प्रलेखन ( HTML संस्करण ) को पढ़ते हैं तो HAProxy को कॉन्फ़िगर करना बहुत आसान है । मेरी 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

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

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

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


9
बहुत बढ़िया जवाब! अनुशंसित मूल सेटअप के लिए आवश्यक सभी चीजों के अच्छे उदाहरण।
इंटरमरनेट

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

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

गो में अपना खुद का रिवर्स प्रॉक्सी बनाना कितना आसान होगा? क्या यह नगण्य या हैप्रोक्सी का उपयोग करने की तुलना में काफी बुरा विचार होगा? मेरा मतलब है कि गो महान HTTP / HTTPS / HTTP / 2 समर्थन के साथ आता है।
थोमसट्रेटर

58

के लिए nginx:

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

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

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

पर्यवेक्षक, मेरे लिए:

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

8

उन लोगों के लिए जो डेमन के रूप में चलने वाले सरल ऐप चाहते हैं, अपस्टार्ट के बजाय सिस्टमड (कई लिनक्स डिस्ट्रो द्वारा समर्थित) का उपयोग करें।

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

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 में एक अलग जर्नलिंग सिस्टम है जो आपको आसान परेशानी-शूटिंग के लिए लॉग लॉग करने देगा।


5

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

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

  1. इस आदेश को आगे बढ़ाने की आवश्यकता है। sudoजैसा आवश्यक हो
  2. आपके कार्यक्रम के हर नए संस्करण का परिणाम एक नया बाइनरी होगा, जिसके द्वारा reauthorized किए जाने की आवश्यकता होगी setcap

setcap प्रलेखन

cap_net_bind_service प्रलेखन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.