Golang制作web应用程序configuration

对于那些在生产中运行Go后端的人:

运行Go Web应用程序的堆栈/configuration是什么?

除了使用标准库net / http包保持服务器运行的人之外,我对这个主题还没有多less看到。 我使用Nginx读取Go请求到Go服务器 – nginx

这对我来说似乎有点脆弱。 例如,如果计算机重新启动(不需要额外的configuration脚本),服务器将不会自动重新启动。

有一个更坚实的生产设置?

除了我的意图之外 – 我正在计划为我的下一个项目开发一个Gofunction的REST后端服务器,并且希望确保Go能够在我投入太多资金之前实时启动项目。

Go程序可以侦听端口80并直接提供HTTP请求。 相反,您可能希望在Go程序前面使用反向代理,以便在端口80上侦听,并在端口4000上连接到您的程序。执行后者的原因很多:无需运行您的Go程序以root用户身份运行,在同一主机上提供其他网站/服务,SSL终止,负载平衡,日志logging等。

我在前面使用HAProxy 。 任何反向代理可以工作。 Nginx也是一个不错的select(比HAProxy更受欢迎,能够做更多的事情)。

如果您阅读其文档 ( HTML版本 ),HAProxy非常容易configuration。 我的一个Go项目的整个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更容易。

关于服务控制,我运行我的Go程序作为系统服务。 我想每个人都这样做。 我的服务器运行Ubuntu,所以它使用Upstart。 我已经把这个放在/etc/init/myapp.conf用于Upstart来控制我的程序:

 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 

另一个方面是部署。 一种方法是通过发送程序的二进制文件和必要的资源进行部署。 这是一个相当不错的IMO解决scheme。 我使用其他选项:在服务器上编译。 (当我build立所谓的“持续集成/部署”系统时,我将切换到使用二进制文件进行部署。)

我在服务器上有一个小的shell脚本,它从远程Git仓库中为我的项目提供代码,使用Go构build它,将二进制文件和其他资源复制到~/myapp/ ,然后重新启动服务。

总的来说,整个事情与其他服务器设置并没有什么不同:你必须有一种方法来运行你的代码,并为HTTP请求提供服务。 在实践中,Go已经certificate对于这个东西非常稳定。

nginx为:

  • 反向HTTP代理到我的Go应用程序
  • 静态文件处理
  • SSL终止
  • HTTP报头(Cache-Control等)
  • 访问日志(因此利用系统日志轮换)
  • 重写(裸到www,http://到https://等)

nginx使得这个过程变得非常简单,虽然你可以直接使用Go来感谢net/http ,但是有很多“重新发明轮子”,像全局HTTP头这样的东西涉及到一些你可能会避免的样板文件。

supervisordpipe理我的Go二进制文件。 Ubuntu的Upstart(正如Mostafa所提到的)也不错,但是我喜欢supervisord,因为它相对不受启发,并且有很好的文档logging。

Supervisord,对我来说:

  • 根据需要运行我的Go二进制文件
  • 在事故发生后把它拿来
  • 把我的环境variables(会话授权密钥等)作为单个configuration的一部分。
  • 运行我的数据库(以确保我的Go二进制没有运行)

您可以使用setcap将二进制文件绑定到Internet域特权端口(端口号小于1024)的setcap

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

  1. 这个命令需要升级。 sudo必要
  2. 程序的每一个新版本都会产生一个新的二进制文件,需要通过setcap重新授权

setcap文档

cap_net_bind_service文档

对于那些希望简单的作为守护进程运行的应用程序,请使用systemd (由许多Linux发行版支持)而不是Upstart。

创build一个服务文件

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

input

 [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 

然后启用并启动服务

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

systemd有一个单独的日志系统,可以让你尾巴日志,以方便解决问题。

Interesting Posts