Cấu hình ứng dụng web sản xuất Golang


120

Đối với những bạn đang chạy chương trình phụ trợ Go trong sản xuất:

Ngăn xếp / cấu hình của bạn để chạy ứng dụng web Go là gì?

Tôi chưa thấy nhiều về chủ đề này ngoài những người sử dụng gói thư viện net / http tiêu chuẩn để giữ cho máy chủ hoạt động. Tôi đã đọc cách sử dụng Nginx để chuyển yêu cầu đến máy chủ Go - nginx with Go

Điều này có vẻ hơi mong manh đối với tôi. Ví dụ: máy chủ sẽ không tự động khởi động lại nếu máy được khởi động lại (không có tập lệnh cấu hình bổ sung).

Có thiết lập sản xuất vững chắc hơn không?

Ngoài ý định của tôi - tôi đang lên kế hoạch cho một máy chủ phụ trợ REST được hỗ trợ bởi Go cho dự án tiếp theo của tôi và muốn đảm bảo rằng Go sẽ khả thi để khởi chạy dự án trực tiếp trước khi tôi đầu tư quá nhiều vào nó.


3
"máy chủ sẽ không tự động khởi động lại nếu máy được khởi động lại (không có tập lệnh cấu hình bổ sung)." Tôi không nghĩ rằng điều này có thể được thực hiện. Tốt nhất là bạn nên tạo các tập lệnh init / systemd / mới nổi cho dịch vụ. Đây là cách được khuyến nghị để kiểm soát mọi trình nền unix.
Intermernet

Bạn đúng. Tôi đoán ý tôi là nó trái ngược với một máy chủ như apache, tự động thiết lập các tính năng đó tại thời điểm cài đặt.
Chaseph

Câu trả lời:


134

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.cfghồ 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.


9
Câu trả lời chính xác! Ví dụ tốt về mọi thứ cần thiết cho một thiết lập cơ bản được đề xuất.
Intermernet

Bạn làm gì về xoay vòng nhật ký? Đó là lý do duy nhất tại sao tôi sử dụng supervisord nhưng nó bị ảnh hưởng khi có quá nhiều ghi nhật ký diễn ra.
fiorix

@fiorix, tôi khá chắc rằng bạn có thể mở một câu hỏi SO khác về xoay bản ghi, nhưng nếu bạn đang sử dụng unix và muốn sử dụng các công cụ tiêu chuẩn, hãy xem logrotate: linuxcommand.org/man_pages/logrotate8.html . Điều này được sử dụng bởi nhiều dịch vụ nổi tiếng (apache, yum, v.v.) và khá dễ cấu hình.
Doody P

Việc tạo proxy ngược của riêng bạn trong Go sẽ dễ dàng như thế nào? Đây sẽ là một ý tưởng tồi tệ hơn đáng kể so với việc sử dụng nginx hoặc haproxy? Ý tôi là Go đi kèm với hỗ trợ HTTP / HTTPS / HTTP / 2 tuyệt vời.
thomasrutter

58

nginx cho:

  • Đảo ngược proxy HTTP sang ứng dụng Go của tôi
  • Xử lý tệp tĩnh
  • Kết thúc SSL
  • Tiêu đề HTTP (Cache-Control, v.v.)
  • Truy cập nhật ký (và do đó tận dụng luân chuyển nhật ký hệ thống)
  • Viết lại (trần trụi với www, http: // thành https: //, v.v.)

nginx làm cho điều này rất dễ dàng và mặc dù bạn có thể phân phát trực tiếp từ Go nhờ nó net/http, có rất nhiều "phát minh lại bánh xe" và những thứ như tiêu đề HTTP toàn cầu liên quan đến một số bảng soạn sẵn mà bạn có thể tránh.

người giám sát quản lý hệ thống nhị phân Go của tôi. Phiên bản Upstart của Ubuntu (như Mostafa đã đề cập) cũng tốt, nhưng tôi thích người giám sát vì nó tương đối khó tin và được ghi chép đầy đủ.

Giám sát viên, cho tôi:

  • Chạy hệ thống nhị phân Go của tôi khi cần thiết
  • Mang nó lên sau một vụ tai nạn
  • Giữ các biến môi trường của tôi (khóa xác thực phiên, v.v.) như một phần của một cấu hình duy nhất.
  • Chạy DB của tôi (để đảm bảo hệ thống nhị phân Go của tôi không chạy nếu không có nó)

8

Đối với những người muốn ứng dụng go đơn giản chạy dưới dạng daemon, hãy sử dụng systemd (Được nhiều bản phân phối linux hỗ trợ) thay vì Upstart.

Tạo tệp dịch vụ tại

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

Đi vào

[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

Sau đó kích hoạt và bắt đầu dịch vụ

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

systemd có một hệ thống ghi nhật ký riêng biệt cho phép bạn cắt các nhật ký để dễ dàng xử lý sự cố.


5

Bạn có thể liên kết tệp nhị phân của mình với một ổ cắm tới các cổng đặc quyền của miền Internet (số cổng nhỏ hơn 1024) bằng cách sử dụng setcap

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

  1. Lệnh này cần được báo cáo. sudokhi cần thiết
  2. Mỗi phiên bản mới của chương trình của bạn sẽ dẫn đến một tệp nhị phân mới cần được ủy quyền lại bởi setcap

setcap tài liệu

cap_net_bind_service tài liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.