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。

如何实现这一点

更多关于Golang gin框架如何使用80和443端口的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您需要先构建您的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端口可能需要管理员权限。使用前请确保:

  1. 已获取有效的TLS证书(对于HTTPS)
  2. 防火墙已允许对应端口
  3. 没有其他程序占用这些端口
回到顶部