Golang Gin框架API如何配置80和443端口

Golang Gin框架API如何配置80和443端口 我已经使用 Gin 框架在 7001 端口开发了 API。它运行得很好。

现在客户不允许使用自定义端口,要求我迁移到 80 和 443 端口。

如何实现这一点

7 回复

硬编码监听端口不是一个好的决定。 根据你的需求,也许你可以写一个简单的Go语言转发代理程序。(对我来说,花在Nginx上的时间足够我写一个了;而且引入一个大块头也会给我后续的维护带来麻烦。)

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


谢谢

我在同一台服务器上为两个客户部署了两个应用服务器(基于 Golang Gin 框架)。

所有 API 都相同,只是根据他们的需求略有调整。

如何在 Nginx 中进行配置?

目前,我分配了两个不同的端口并以此进行管理。

packs:

我必须像这样映射所有API

这不是我习惯的做法。如果我想拥有多个子域名,我通常会这样做:

server {
    server_name api.go4webdev.org Login.go4webdev.org Getemp.go4webdev.org;

    location / {
        proxy_pass http://localhost:7001;
    }
}

如何在 nginx 中配置。

server {
    server_name api1.go4webdev.org;
                      
    location / {
        proxy_pass http: //localhost:7001;
    }
}

server {
    server_name api2.go4webdev.org;
                      
    location / {
        proxy_pass http: //localhost:7002;
    }
}

现在客户不允许使用自定义端口,要求我迁移到80和443端口。

该如何实现?

使用Nginx作为代理?让Nginx监听80/443端口并转发到7001端口?

server {
    server_name api.go4webdev.org;
                      
    location / {
        proxy_pass http: //localhost:7001;
    }
}

我是如何做到的

server {
server_name api1.go4webdev.org;

    location / {
        proxy_pass http: //localhost:7001
        Login http://localhost:7001
        Getemp http: //localhost:7001
    }

}
server {
server_name api2.go4webdev.org;

    location / {
        proxy_pass http: //localhost:7002

Login http://localhost:7002
Getemp http://localhost:7002
}
}

我需要像这样映射所有API。

在Golang Gin框架中配置80和443端口,通常有以下几种实现方式:

方案一:直接绑定端口(需要root权限)

package main

import (
    "github.com/gin-gonic/gin"
    "log"
)

func main() {
    r := gin.Default()
    
    // 定义路由
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "API服务运行中",
        })
    })
    
    // 启动HTTP服务(80端口)
    go func() {
        if err := r.Run(":80"); err != nil {
            log.Printf("HTTP服务启动失败: %v", err)
        }
    }()
    
    // 启动HTTPS服务(443端口)
    if err := r.RunTLS(":443", "server.crt", "server.key"); err != nil {
        log.Fatalf("HTTPS服务启动失败: %v", err)
    }
}

方案二:使用反向代理(推荐,无需root权限)

通过Nginx或Caddy等反向代理将80/443端口转发到你的Gin应用:

Nginx配置示例:

server {
    listen 80;
    server_name yourdomain.com;
    
    location / {
        proxy_pass http://localhost:7001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 443 ssl;
    server_name yourdomain.com;
    
    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    
    location / {
        proxy_pass http://localhost:7001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

方案三:使用ACME自动管理HTTPS证书

package main

import (
    "github.com/gin-gonic/gin"
    "golang.org/x/crypto/acme/autocert"
    "log"
    "net/http"
)

func main() {
    r := gin.Default()
    
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "HTTPS API服务",
        })
    })
    
    // 自动证书管理器
    certManager := autocert.Manager{
        Prompt:     autocert.AcceptTOS,
        HostPolicy: autocert.HostWhitelist("yourdomain.com"),
        Cache:      autocert.DirCache("certs"), // 证书缓存目录
    }
    
    server := &http.Server{
        Addr:      ":443",
        Handler:   r,
        TLSConfig: certManager.TLSConfig(),
    }
    
    // 启动HTTPS服务
    go func() {
        log.Fatal(server.ListenAndServeTLS("", ""))
    }()
    
    // HTTP重定向到HTTPS
    http.ListenAndServe(":80", certManager.HTTPHandler(nil))
}

方案四:使用Gin的多个实例

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
    "time"
)

func main() {
    // 创建Gin实例
    router := gin.Default()
    
    // 定义API路由
    router.GET("/api/data", func(c *gin.Context) {
        c.JSON(200, gin.H{"data": "示例数据"})
    })
    
    // 配置服务器
    srv := &http.Server{
        Addr:         ":7001",
        Handler:      router,
        ReadTimeout:  5 * time.Second,
        WriteTimeout: 10 * time.Second,
    }
    
    // 启动主服务
    go func() {
        log.Println("API服务运行在 :7001")
        if err := srv.ListenAndServe(); err != nil {
            log.Printf("服务运行失败: %v", err)
        }
    }()
    
    // 创建HTTP重定向和HTTPS服务
    go startHTTPRedirect()
    startHTTPS(router)
}

func startHTTPRedirect() {
    redirect := gin.Default()
    redirect.Use(func(c *gin.Context) {
        c.Redirect(http.StatusMovedPermanently, 
            "https://"+c.Request.Host+c.Request.URL.Path)
    })
    
    log.Println("HTTP重定向服务运行在 :80")
    log.Fatal(redirect.Run(":80"))
}

func startHTTPS(handler http.Handler) {
    srv := &http.Server{
        Addr:         ":443",
        Handler:      handler,
        ReadTimeout:  5 * time.Second,
        WriteTimeout: 10 * time.Second,
    }
    
    log.Println("HTTPS服务运行在 :443")
    log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key"))
}

重要注意事项:

  1. 权限问题:在Linux系统上,1024以下端口需要root权限
  2. 证书配置:HTTPS需要有效的SSL证书
  3. 生产环境:推荐使用方案二(反向代理),便于管理和扩展
  4. 防火墙:确保80和443端口在防火墙中开放

如果你的应用已经在7001端口运行正常,最简单的迁移方式是使用方案二的反向代理配置。

回到顶部