dsb53973 2013-07-03 05:34
浏览 81
已采纳

Golang生产Web应用程序配置

For those of you running Go backends in production:

What is your stack / configuration for running a Go web application?

I haven't seen much on this topic besides people using the standard library net/http package to keep a server running. I read using Nginx to pass requests to a Go server - nginx with Go

This seems a little fragile to me. For instance, the server would not automatically restart if the machine was restarted (without additional configuration scripts).

Is there a more solid production setup?

An aside about my intent - I'm planning out a Go powered REST backend server for my next project and want to make sure Go is going to be viable for launching the project live before I invest too much into it.

  • 写回答

4条回答 默认 最新

  • douqin7086 2013-07-03 07:49
    关注

    Go programs can listen on port 80 and serve HTTP requests directly. Instead, you may want to use a reverse proxy in front of your Go program, so that it listens on port 80 and and connects to your program on port, say, 4000. There are many reason for doing the latter: not having to run your Go program as root, serving other websites/services on the same host, SSL termination, load balancing, logging, etc.

    I use HAProxy in front. Any reverse proxy could work. Nginx is also a great option (much more popular than HAProxy and capable of doing more).

    HAProxy is very easy to configure if you read its documentation (HTML version). My whole haproxy.cfg file for one of my Go projects follows, in case you need a starting pont.

    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 is even easier.

    Regarding service control, I run my Go program as a system service. I think everybody does that. My server runs Ubuntu, so it uses Upstart. I have put this at /etc/init/myapp.conf for Upstart to control my program:

    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
    

    Another aspect is deployment. One option is to deploy by just sending binary file of the program and necessary assets. This is a pretty great solution IMO. I use the other option: compiling on server. (I’ll switch to deploying with binary files when I set up a so-called “Continuous Integration/Deployment” system.)

    I have a small shell script on the server that pulls code for my project from a remote Git repository, builds it with Go, copies the binaries and other assets to ~/myapp/, and restarts the service.

    Overall, the whole thing is not very different from any other server setup: you have to have a way to run your code and have it serve HTTP requests. In practice, Go has proved to be very stable for this stuff.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算