我有一个非常简单的基于 golang 的 API,它只监听路径并通过数据库插入相应地响应。
我想使用 Lets Encrypt 通过 TLS/https 提供它,但所有教程似乎都表明需要使用 Apache 或 nginx。
我喜欢让我的服务器真的很轻,并且没有看到任何需要引入这些 Web 服务器的开销(它绝对不是一个完整的网站),并且通过 http,我的 go 实现运行良好。
是否可以在没有 Apache 或 nginx 的情况下安装它?
我有一个非常简单的基于 golang 的 API,它只监听路径并通过数据库插入相应地响应。
我想使用 Lets Encrypt 通过 TLS/https 提供它,但所有教程似乎都表明需要使用 Apache 或 nginx。
我喜欢让我的服务器真的很轻,并且没有看到任何需要引入这些 Web 服务器的开销(它绝对不是一个完整的网站),并且通过 http,我的 go 实现运行良好。
是否可以在没有 Apache 或 nginx 的情况下安装它?
不,你不需要使用 Apache/Nginx,Go 可以很好地处理 TLS。
例子:
➜ sudo letsencrypt certonly --standalone --agree-tos --email you@email.com -d domain1.com [-d domain2.com, etc..]
➜ sudo cat /etc/letsencrypt/archive/domain1.com/fullchain1.pem > cert.pem
➜ sudo cat /etc/letsencrypt/archive/domain1.com/privkey1.pem > key.pem
➜ cat main.go
import (
"log"
"net/http"
)
func handler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server.\n"))
}
func main() {
http.HandleFunc("/", handler)
log.Printf("About to listen on 10443. Go to https://domain1.com:10443/")
log.Fatal(http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil))
}
请注意,如果您希望 go 服务器侦听端口 443(默认 https 端口),则必须以 root 身份运行它或使用 systemd 将端口传递给它。
在端口 443 上运行的示例:
将代码更改为log.Fatal(http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil))
go build
sudo ./your-package-name
setcap cap_net_bind_service=+ep your-package-name
然后您将能够以用户身份监听端口 443/80。有关使用 setcap 的更多详细信息:https ://wiki.apache.org/httpd/NonRootPortBinding