Go程序可以监听80端口并直接提供HTTP请求服务。不过,你可能希望在Go程序前使用一个反向代理,这样它将监听80端口,并连接到你的程序所在的端口,比如说4000端口。这样做的原因有很多,例如:不需要将Go程序以root用户身份运行、在同一主机上提供其他网站/服务、SSL终止、负载均衡、日志记录等。
我使用HAProxy作为反向代理,任何反向代理都可以工作。Nginx也是一个很棒的选择(比HAProxy更受欢迎并且能够做更多的事情)。
如果你阅读了文档(HTML版本),就会发现配置HAProxy非常容易。我的整个haproxy.cfg
文件用于我的一个Go项目,以防你需要一个起点。
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
另一个方面是部署。一种选择是通过发送程序和必要资产的二进制文件来部署。在我看来,这是一个相当不错的解决方案。我使用另一种选项:在服务器上编译。(当我设置所谓的“持续集成/部署”系统时,我将切换到使用二进制文件进行部署。)
我的服务器上有一个小的shell脚本,从远程Git存储库中拉取我的项目代码,使用Go构建它,将二进制文件和其他资产复制到~/myapp/
,然后重新启动服务。
总的来说,整个过程与任何其他服务器设置并没有太大区别:你必须有一种运行代码并处理HTTP请求的方式。在实践中,Go在这方面被证明非常稳定。