जाओ कार्यक्रम पोर्ट 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 अनुरोधों की सेवा करता है। व्यवहार में, गो इस सामान के लिए बहुत स्थिर साबित हुई है।