【问题标题】:Go, sudo, and apache port 80Go、sudo 和 apache 端口 80
【发布时间】:2014-08-19 04:39:43
【问题描述】:

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

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

【问题讨论】:

  • 您有两个选择:关闭 Apache(因为只有一个服务可以绑定到端口),或者(更好!)使用 Apache 的 ProxyPass 将任何传入请求代理到特定主机名到您的 Go 服务器在端口(例如)8000 上运行。第二种方法非常流行、健壮,您可以使用 Apache 为您处理请求日志记录和 SSL。
  • @elithrar 我是 golang 和网络编程的新手,你能提供一些 Apache 的 ProxyPass 以及我们将如何处理它吗?golang 我将非常感谢
  • 您是否尝试过使用 go build app.go 构建应用程序,然后使用 sudo ./app 执行它?

标签: linux apache go gorilla


【解决方案1】:

引用 elithar 的评论,

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

反向代理

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

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

FastCGI

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

套接字类型的选择也是开放的:可以使用Unix sockets 代替通常的TCP 套接字,这进一步减少了处理负载。我自己在 Go 中没有这样做,但 API 支持 the necessary bits(参见 related question)。

Nginx

虽然以上所有内容都描述了使用 Apache,但还有其他服务器产品也可以提供反向代理。最值得注意的是Nginx (Nginx reverse proxy example),它会给你带来小而有用的性能和可扩展性优势。如果您的服务器上有此选项,那么值得努力学习和部署。

【讨论】:

    【解决方案2】:

    基于之前关于环境变量的答案,我能够轻松解决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) 的其他服务一起使用。

    【讨论】:

    • 查看我对您问题的评论以获得更好的解决方案。值得注意的是,以 root 身份运行 Go 应用程序并不是好的安全实践。您要么赋予它绑定到端口 80(仅)的能力,要么在 Apache 后面反向代理它。
    • 你能把它写成答案让我接受吗?
    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2018-10-13
    • 2011-08-14
    • 2014-02-20
    • 2015-08-05
    • 2011-12-14
    • 2017-02-10
    相关资源
    最近更新 更多