गो प्रोग्राम पोर्ट 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 अनुरोधों को पूरा करने का कोई तरीका होना चाहिए। अभ्यास में, गो इस सामान के लिए बहुत स्थिर साबित हुआ है।
"मशीन पुनरारंभ होने पर सर्वर स्वचालित रूप से पुनरारंभ नहीं होगा (अतिरिक्त कॉन्फ़िगरेशन स्क्रिप्ट के बिना)।" मुझे नहीं लगता कि यह किया जा सकता है। आदर्श रूप से आप सेवा के लिए init/systemd/अपस्टार्ट स्क्रिप्ट बनाएंगे। किसी यूनिक्स डिमन को नियंत्रित करने के लिए यह अनुशंसित तरीका है। – Intermernet
ठीक है आप हैं। मुझे लगता है कि मेरा मतलब यह है कि यह अपाचे जैसे सर्वर के विपरीत है, जो स्वचालित रूप से इंस्टॉल समय पर उन सुविधाओं को सेट करता है। – Chaseph