【问题标题】:Oracle cloud - golang http server not working on port 80Oracle 云 - golang http 服务器无法在端口 80 上工作
【发布时间】:2021-10-20 11:56:48
【问题描述】:

我有一个 golang http 服务器,它应该监听端口 80

我的问题是:

程序正常编译但不听就退出。当我将端口更改为8080 时,一切正常,我可以访问我的网页了。

  • 我使用 Ubuntu 作为我的操作系统。
  • 我添加了一个允许端口 80 的入口规则

我不明白为什么我的服务器没有监听端口 80,而是监听所有其他端口。

感谢您的帮助。

package main

import (
    "fmt"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "<p>Hello world!</p>")
}

func main() {
        http.HandleFunc("/", hello)
        http.ListenAndServe(":80", nil)
}

【问题讨论】:

  • 服务器代码在哪里?
  • 它是否因错误或退出代码不是 0 而退出?
  • 没有错误!一切都很好,只有 80 端口不工作
  • 低端口需要特殊权限。
  • 现在它正在使用root,但它安全吗?有没有其他没有root的解决方案?

标签: go oracle-cloud-infrastructure port80


【解决方案1】:

检查错误

err := http.ListenAndServe(":80", nil)
fmt.Println(err)

我本地的输出是这样的,但它可能有其他原因

listen tcp :80: bind: permission denied

【讨论】:

  • 是的!它显示“listen tcp :80: bind: permission denied”。解决方案是什么?
  • 使用 sudo 运行可执行文件。它对我有用。
  • 是的,它现在也对我有用,但是用 root 执行它安全吗?
【解决方案2】:

端口 80 是保留/特殊端口,在许多(如果不是全部)Linux / Unix 系统上必须通过 root 级用户访问。您需要以 root / wheel group / sudo 用户身份运行它。或者您可以在 8080 上运行它并通过在 systemd 上具有根级别的东西(如 nginx 或类似的东西)进行反向代理。这是 Web 应用程序和代理转发的常见使用模式。

我建议不要让您的 golang 二进制文件以 root 身份运行,因为如果没有为以 root 身份运行的用户提供其他保护措施,这根本不安全。

nginx sn-p:

  location / {
    proxy_pass http://0.0.0.0:8080;
}

要确认这是问题所在,您可以以sudo ./mybinary 运行它并确认它在 80 上工作并收听。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 2013-02-19
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多