2

我正在尝试在 Golang 中使用 TLS 创建一个 REST 服务器,但该程序无法正常工作:

http.Handle("/", gorest.Handle())
err = http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

如果我使用非 root 用户运行它,我会得到listen tcp 127.0.0.1:443: permission denied. 使用 root 用户运行它不会显示先前的消息,但在调用 ListenAndServeTLS 时会执行块。使用的操作系统是 Linux x86_64。有任何想法吗?

4

1 回答 1

9

权限

端口 <= 1024 是特权端口。除非您是 root 或具有使用它们的明确许可,否则您不能使用它们。请参阅此答案以获取解释或维基百科或您更信任的内容。

请参阅此答案以获取允许您的应用程序在不授予超级用户权限的情况下打开这些端口的解决方案(这是一个坏主意)。金钱报价:

sudo setcap 'cap_net_bind_service=+ep' /opt/yourGoBinary

阻塞

ListenAndServe及其对应的 TLSListeAndServeTLS正在阻塞。

返回的 http 处理程序在被访问gorest.Handle()时并发执行。/如果您想让其他代码同时运行,请在运行之前启动一个 goroutineListeAndServe 或实现不同的 http 处理程序。

使用 goroutine 的示例:

func printStuff() {
    time.Sleep(1 * time.Second)
    fmt.Println("foo")
}

func main() {
    go printSTuff()
    log.Fatal(http.ListeAndServe(":80"))
}
于 2013-10-09T18:35:52.517 回答