Các chương trình Go có thể lắng nghe trên cổng 80 và phục vụ các yêu cầu HTTP trực tiếp. Thay vào đó, bạn có thể muốn sử dụng proxy ngược trước chương trình Go của mình, để nó lắng nghe trên cổng 80 và kết nối với chương trình của bạn trên cổng, chẳng hạn, 4000. Có nhiều lý do để thực hiện điều này: không cần phải chạy chương trình Go của bạn dưới dạng gốc, phục vụ các trang web / dịch vụ khác trên cùng một máy chủ lưu trữ, kết thúc SSL, cân bằng tải, ghi nhật ký, v.v.
Tôi sử dụng HAProxy ở phía trước. Bất kỳ proxy ngược nào cũng có thể hoạt động. Nginx cũng là một lựa chọn tuyệt vời (phổ biến hơn nhiều so với HAProxy và có khả năng làm được nhiều việc hơn).
HAProxy rất dễ cấu hình nếu bạn đọc tài liệu của nó ( phiên bản HTML ). Toàn bộ haproxy.cfg
hồ sơ của tôi cho một trong những dự án cờ vây của tôi sau đây, trong trường hợp bạn cần một điểm khởi đầu.
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 thậm chí còn dễ dàng hơn.
Về kiểm soát dịch vụ, tôi chạy chương trình Go của mình như một dịch vụ hệ thống. Tôi nghĩ rằng mọi người đều làm điều đó. Máy chủ của tôi chạy Ubuntu, vì vậy nó sử dụng Upstart. Tôi đã đặt điều này tại /etc/init/myapp.conf
để Upstart kiểm soát chương trình của tôi:
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
Một khía cạnh khác là triển khai. Một tùy chọn là triển khai bằng cách chỉ gửi tệp nhị phân của chương trình và các tài sản cần thiết. Đây là một giải pháp IMO khá tuyệt vời. Tôi sử dụng tùy chọn khác: biên dịch trên máy chủ. (Tôi sẽ chuyển sang triển khai với các tệp nhị phân khi tôi thiết lập cái gọi là hệ thống “Tích hợp / Triển khai liên tục”.)
Tôi có một tập lệnh shell nhỏ trên máy chủ để kéo mã cho dự án của tôi từ kho lưu trữ Git từ xa, xây dựng nó bằng Go, sao chép mã nhị phân và các nội dung khác vào ~/myapp/
và khởi động lại dịch vụ.
Nhìn chung, toàn bộ điều không khác nhiều so với bất kỳ thiết lập máy chủ nào khác: bạn phải có cách chạy mã của mình và để nó phục vụ các yêu cầu HTTP. Trong thực tế, cờ vây đã được chứng minh là rất ổn định cho nội dung này.