10

我在 golang 中使用 gorilla/mux 包,但是有一些问题。首先是我没有权限在我的应用程序上使用端口 80,因为我无法从 sudo 运行应用程序,因为$GOPATH使用 sudo 时没有设置。

这是我从程序中得到的错误:

$ 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 是否可以一起“玩得很好”。

关于如何解决这个问题的任何建议都会很棒。谢谢你。

4

2 回答 2

7

引用 elitha 的评论,

您有两个选择:关闭 Apache(因为只有一个服务可以绑定到端口),或者(更好!)使用 Apache 的ProxyPass将任何传入请求代理到特定主机名到运行在端口(例如)8000 上的 Go 服务器。第二种方法非常流行、健壮,您可以使用 Apache 为您处理请求日志记录和 SSL。

反向代理

以这种方式在端口 80 上使用 Apache 称为反向代理。它接收端口 80(和/或 https 的端口 443)上的所有传入连接,并将它们(通常未加密)仅通过内部 localhost 连接传递给在您选择的任何端口上运行的 Go 程序。经常使用8000和8080。Apache 和您的服务器之间的流量本身就是 HTTP 流量

因为您的 Go 程序不是以 root 身份运行的,所以它无法更改服务器上的关键功能。因此,如果您的程序包含安全漏洞,它会提供额外的安全性,因为任何攻击者都只能获得有限的访问权限。

快速CGI

您可以通过不使用 HTTP进行从 Apache 到 Go 服务器的连接来提高反向代理的整体性能。这是通过FastCGI 协议完成的,该协议最初是为 shell、Perl 和 PHP 脚本开发的,但也适用于 Go。要使用它,您必须修改您的 Go 服务器以使用fcgi API 进行侦听。还需要Apache FastCGI 。从 Apache 到您的服务器的流量使用更紧凑的格式(不是 HTTP),这减少了每一端的负载。

套接字类型的选择也是开放的:可以使用Unix 套接字代替通常的 TCP 套接字,这进一步减少了处理负载。我自己在 Go 中没有这样做,但 API 支持必要的位(请参阅相关问题)。

Nginx

虽然以上所有内容都描述了使用 Apache,但还有其他服务器产品也可以提供反向代理。最值得注意的是NginxNginx 反向代理示例),它将为您提供小而有用的性能和可扩展性优势。如果您的服务器上有此选项,则值得努力学习和部署。

于 2014-06-28T20:15:02.447 回答
-2

基于this previous answer about environment variables,我能够轻松解决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) 的另一个服务一起使用。

于 2014-06-28T01:31:26.263 回答