Golang gin框架如何使用80和443端口
Golang gin框架如何使用80和443端口 我有一个部署在IIS服务器上的应用程序。它正在使用80和443端口。
如何在同一个端口上部署Golang Gin框架
// 代码示例:Gin框架基本设置
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World",
})
})
r.Run(":80") // 监听80端口
}
更多关于Golang gin框架如何使用80和443端口的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
您需要先构建您的Angular应用,然后让您的Go API将其作为静态内容提供服务。请查阅 http/FileServer。
你会使用 gin package - github.com/gin-gonic/gin - Go Packages,但操作系统不允许多个进程在同一IP地址的同一端口上进行监听。也许你想用一个反向代理来前置这两个应用。
在Golang Gin框架中同时使用80和443端口,通常需要通过HTTPS重定向或使用TLS证书。以下是两种常见实现方式:
方案一:使用自动证书(如Let’s Encrypt)
package main
import (
"log"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/acme/autocert"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World",
})
})
// 使用autocert管理证书
m := &autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("yourdomain.com"),
Cache: autocert.DirCache("/var/www/.cache"),
}
// 同时监听80和443端口
go func() {
// HTTP服务器(80端口)用于证书验证和重定向
log.Fatal(r.Run(":80"))
}()
// HTTPS服务器(443端口)
log.Fatal(r.RunTLS(":443", "cert.pem", "key.pem"))
}
方案二:HTTP重定向到HTTPS
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
// HTTPS路由
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Secure Hello World",
})
})
// HTTP重定向路由
httpRouter := gin.Default()
httpRouter.Use(func(c *gin.Context) {
// 重定向所有HTTP请求到HTTPS
secureURL := "https://" + c.Request.Host + c.Request.URL.Path
if len(c.Request.URL.RawQuery) > 0 {
secureURL += "?" + c.Request.URL.RawQuery
}
c.Redirect(http.StatusMovedPermanently, secureURL)
})
// 启动HTTP服务器(80端口)
go func() {
log.Fatal(http.ListenAndServe(":80", httpRouter))
}()
// 启动HTTPS服务器(443端口)
log.Fatal(r.RunTLS(":443", "server.crt", "server.key"))
}
方案三:使用Gin的RunTLS方法
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World",
})
})
// 创建HTTP服务器用于重定向
go func() {
redirectRouter := gin.Default()
redirectRouter.Any("/*path", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently,
"https://"+c.Request.Host+c.Request.RequestURI)
})
log.Fatal(redirectRouter.Run(":80"))
}()
// 主HTTPS服务器
err := r.RunTLS(":443", "certificate.crt", "private.key")
if err != nil {
log.Fatal("Failed to start HTTPS server:", err)
}
}
方案四:使用标准库的http.Server
package main
import (
"context"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World",
})
})
// 配置HTTP服务器(80端口)
httpServer := &http.Server{
Addr: ":80",
Handler: r,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
// 配置HTTPS服务器(443端口)
httpsServer := &http.Server{
Addr: ":443",
Handler: r,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
// 启动HTTP服务器
go func() {
log.Println("Starting HTTP server on :80")
if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("HTTP server error: %v", err)
}
}()
// 启动HTTPS服务器
go func() {
log.Println("Starting HTTPS server on :443")
if err := httpsServer.ListenAndServeTLS("cert.pem", "key.pem"); err != nil && err != http.ErrServerClosed {
log.Fatalf("HTTPS server error: %v", err)
}
}()
// 优雅关闭
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
<-ctx.Done()
httpServer.Shutdown(ctx)
httpsServer.Shutdown(ctx)
}
注意:在Windows系统上绑定80和443端口可能需要管理员权限。使用前请确保:
- 已获取有效的TLS证书(对于HTTPS)
- 防火墙已允许对应端口
- 没有其他程序占用这些端口


