我在golang中使用gorilla / mux包,但是有一些问题。第一个是我没有权限在我的应用程序上使用端口80,因为我无法从sudo运行应用程序,因为在使用sudo时未设置$GOPATH
。
以下是我从程序中得到的错误:
$ go run app.go
2014/06/28 00:34:12 Listening...
2014/06/28 00:34:12 ListenAndServe: listen tcp :80: bind: permission denied
exit status 1
我不确定当我修复sudo问题时它是否能正常工作,因为apache已经在使用端口80而且我不确定我的应用程序和apache是否可以"玩得很好"在一起。
关于如何解决这个问题的任何建议都会很棒。谢谢。
答案 0 :(得分:7)
引用elithar的评论,
您有两种选择:关闭Apache(因为只有一项服务 可以绑定到端口),或者(更好!)使用Apache的ProxyPass来代理任何端口 对运行的Go服务器的特定主机名的传入请求 端口(例如)8000。第二种方法非常流行,强大而且你 可以使用Apache为您处理请求记录和SSL。
以这种方式在端口80上使用Apache称为反向代理。它接收端口80上的所有传入连接(和/或用于https的端口443),并将它们(通常是未加密的)仅通过内部localhost连接传递给在您选择的任何端口上运行的Go程序。经常使用8000和8080。 Apache与您的服务器之间的流量本身就是HTTP流量。
由于您的Go程序不以root用户身份运行,因此无法更改服务器上的关键功能。因此,如果您的程序包含安全漏洞,它会提供额外的安全性,因为任何攻击者都只能获得有限的访问权限。
您可以通过不使用HTTP 来提高从Apache到Go服务器的连接的反向代理的整体性能。这是通过最初为shell,Perl和PHP脚本开发的FastCGI protocol完成的,但也适用于Go。要使用此功能,您必须使用fcgi API修改Go服务器以进行收听。 Apache FastCGI也是必需的。从Apache到您的服务器的流量使用更紧凑的格式(而不是HTTP),这会减少每端的负载。
套接字类型的选择也是开放的:代替通常的TCP套接字,可以使用Unix sockets,这进一步降低了处理负荷。我自己还没有完成此操作,但API支持the necessary bits(请参阅related question)。
虽然以上所有内容都描述了使用Apache,但还有其他服务器产品也可以提供反向代理。最值得注意的是Nginx(Nginx reverse proxy example),这将为您提供小而有用的性能和可扩展性优势。如果您的服务器上有此选项,则值得学习和部署。
答案 1 :(得分:-3)
根据之前关于环境变量的答案,我能够轻松解决sudo问题。
https://stackoverflow.com/a/8636711/2576956
sudo visudo
添加了这些内容:
Defaults env_keep +="GOPATH"
Defaults env_keep +="GOROOT"
顺便使用ubuntu 12.04。我认为以前关于使用端口80的代理的答案是正确的选择,因为在修复sudo问题之后我得到了关于端口80的这个错误:
$ sudo go run app.go
2014/06/28 01:26:30 Listening...
2014/06/28 01:26:30 ListenAndServe: listen tcp :80: bind: address already in use
exit status 1
意味着sudo命令已修复,但代理绑定不适用于已使用端口80(apache)的其他服务。