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;
}
}
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"))
}
重要注意事项:
- 权限问题:在Linux系统上,1024以下端口需要root权限
- 证书配置:HTTPS需要有效的SSL证书
- 生产环境:推荐使用方案二(反向代理),便于管理和扩展
- 防火墙:确保80和443端口在防火墙中开放
如果你的应用已经在7001端口运行正常,最简单的迁移方式是使用方案二的反向代理配置。


