Bagi Anda yang menjalankan Go backend dalam produksi:
Apa tumpukan / konfigurasi Anda untuk menjalankan aplikasi web Go?
Saya belum melihat banyak tentang topik ini selain orang-orang yang menggunakan paket perpustakaan standar net / http untuk menjaga server tetap berjalan. Saya membaca menggunakan Nginx untuk mengirimkan permintaan ke server Go - nginx dengan Go
Ini tampaknya sedikit rapuh bagi saya. Misalnya, server tidak akan otomatis memulai ulang jika mesin di-restart (tanpa skrip konfigurasi tambahan).
Apakah ada penyiapan produksi yang lebih solid?
Selain maksud saya - saya merencanakan server backend REST bertenaga Go untuk proyek saya berikutnya dan ingin memastikan Go akan layak untuk meluncurkan proyek secara langsung sebelum saya berinvestasi terlalu banyak ke dalamnya.
sumber
Jawaban:
Program Go dapat mendengarkan pada port 80 dan melayani permintaan HTTP secara langsung. Alih-alih, Anda mungkin ingin menggunakan proxy terbalik di depan program Go Anda, sehingga program ini mendengarkan di port 80 dan dan terhubung ke program Anda di port, katakanlah, 4000. Ada banyak alasan untuk melakukan yang terakhir: tidak harus menjalankan program Go Anda sebagai root, melayani situs web / layanan lain di host yang sama, penghentian SSL, load balancing, logging, dll.
Saya menggunakan HAProxy di depan. Proksi terbalik apa pun dapat berfungsi. Nginx juga merupakan opsi yang bagus (jauh lebih populer daripada HAProxy dan mampu melakukan lebih banyak hal).
HAProxy sangat mudah dikonfigurasi jika Anda membaca dokumentasinya ( versi HTML ). Seluruh
haproxy.cfg
file saya untuk salah satu proyek Go saya mengikuti, jika Anda memerlukan pont awal.Nginx bahkan lebih mudah.
Mengenai kontrol layanan, saya menjalankan program Go saya sebagai layanan sistem. Saya pikir semua orang melakukan itu. Server saya menjalankan Ubuntu, jadi menggunakan Upstart. Saya telah meletakkan ini di
/etc/init/myapp.conf
untuk Pemula untuk mengontrol program saya:Aspek lainnya adalah penerapan. Salah satu opsinya adalah menerapkan hanya dengan mengirimkan file biner dari program dan aset yang diperlukan. Ini adalah solusi IMO yang cukup bagus. Saya menggunakan opsi lain: kompilasi di server. (Saya akan beralih ke penerapan dengan file biner ketika saya menyiapkan apa yang disebut sistem "Integrasi / Penerapan Berkelanjutan".)
Saya memiliki skrip shell kecil di server yang menarik kode untuk proyek saya dari repositori Git jarak jauh, membangunnya dengan Go, menyalin binari dan aset lainnya ke
~/myapp/
, dan memulai ulang layanan.Secara keseluruhan, semuanya tidak jauh berbeda dari penyiapan server lainnya: Anda harus memiliki cara untuk menjalankan kode Anda dan membuatnya melayani permintaan HTTP. Dalam praktiknya, Go terbukti sangat stabil untuk hal ini.
sumber
nginx untuk:
nginx membuatnya sangat mudah, dan meskipun Anda dapat melayani langsung dari Go berkat
net/http
, ada banyak "menemukan kembali roda" dan hal-hal seperti header HTTP global melibatkan beberapa boilerplate yang mungkin dapat Anda hindari.supervisord untuk mengelola biner Go saya. Pemula Ubuntu (seperti yang disebutkan oleh Mostafa) juga bagus, tetapi saya suka supervisord karena relatif distro-agnostik dan didokumentasikan dengan baik.
Supervisord, untuk saya:
sumber
Bagi mereka yang menginginkan aplikasi simple go yang dijalankan sebagai daemon, gunakan systemd (Didukung oleh banyak distro linux) daripada Upstart.
Buat file layanan di
Memasukkan
Kemudian aktifkan dan mulai layanan
systemd memiliki sistem penjurnalan terpisah yang memungkinkan Anda mengikuti log untuk pemecahan masalah yang mudah.
sumber
Anda dapat mengikat biner Anda ke soket ke port istimewa domain Internet (nomor port kurang dari 1024) menggunakan
setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
sudo
seperlunyasetcap
setcap
dokumentasicap_net_bind_service
dokumentasisumber