我在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端口了,我不确定我的app和apache是否可以“一起玩”。
任何关于如何解决这个问题的build议都会很棒。 谢谢。
引用elithar的评论,
您有两个选择:关闭Apache(因为只有一个服务可以绑定到一个端口),或者(更好的)使用Apache的ProxyPass将任何传入的请求代理到一个特定的主机名到运行在端口(例如)8000上的Go服务器。第二种方法是非常流行的,健壮的,你可以使用Apache来处理请求日志和SSL。
以这种方式在端口80上使用Apache被称为反向代理 。 它接收端口80上的所有传入连接(和/或https端口443),并通过内部本地主机连接(通常是未加密的)将它们传递到您选择的任何端口上运行的Go程序。 8000和8080经常使用。 Apache和你的服务器之间的流量本身就是HTTP流量 。
由于您的Go程序不以root身份运行,因此无法更改服务器上的关键功能。 因此,如果您的程序包含安全漏洞,则会提供额外的安全级别,因为攻击者只能获得有限的访问权限。
您可以通过不使用HTTP从Apache到Go服务器的连接来提高反向代理的整体性能。 这是通过最初为shell,Perl和PHP脚本开发的FastCGI协议完成的,但是也可以和Go一起使用。 要使用这个,你必须修改你的Go服务器来使用fcgi API来侦听。 Apache FastCGI也是必需的。 从Apache到您的服务器的流量使用更紧凑的格式(而不是HTTP),这将减少每端的负载。
套接字类型的选择也是打开的:代替通常的TCP套接字,可以使用Unix套接字 ,从而进一步减少处理负载。 我自己并没有这样做,但API支持必要的位 (请参阅相关问题 )。
虽然以上描述使用Apache,但也有其他服务器产品也可以提供反向代理。 最值得注意的是Nginx ( Nginx反向代理示例 ),它会给你提供小而有用的性能和可伸缩性优势。 如果你的服务器上有这个选项,那么值得学习和部署。
根据以前有关环境变量的回答,我能够轻松解决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 listning... 2014/06/28 01:26:30 listnAndServe: listen tcp :80: bind: address already in use exit status 1
这意味着sudo命令已修复,但是代理绑定不能与已经使用端口80(apache)的另一个服务一起使用。