[web] Golang在Ubuntu上启动服务器失败的原因有哪些

[web] Golang在Ubuntu上启动服务器失败的原因有哪些 您好

请告诉我哪里做错了,其他程序都是这样运行的。

我将源代码编译成二进制文件并在 ubuntu 上运行服务器

chmod 777 webserver_linux_amd64
nohup /root/webserver_linux_amd64&

但是不工作…

在本地机器上这段代码运行正常

const (
CONN_HOST = "localhost"
CONN_PORT = "8089"
)

err = http.ListenAndServe(CONN_HOST+":"+CONN_PORT, nil)

也许需要更改 CONN_HOST?如何正确定义服务器的主机变量?或者有其他方法吗?这里可能是什么问题?


更多关于[web] Golang在Ubuntu上启动服务器失败的原因有哪些的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

我会尝试这个方法,谢谢

更多关于[web] Golang在Ubuntu上启动服务器失败的原因有哪些的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我输入了服务器IP地址而不是localhost,然后一切正常工作了。也许有某种函数可以让我找出服务器地址?

你是指类似 AWS 实例这样的服务器吗?

编辑:

如果是的话,请使用:

http.ListenAndServe(":"+CONN_PORT, nil)

服务器没有运行吗?如果是这样,你收到了什么错误信息?

还是你无法连接到服务器?绑定 localhost:8089 只会接受通过环回设备建立的连接。通常你需要绑定一个存在于可从外部路由的设备上的 IP 地址,或者绑定 0.0.0.0/:: 来绑定所有 IP 地址。

是的,你可以使用 net.Interfaces() 来获取所有可用的网络接口,然后遍历这些接口并使用 net.interface.Addrs 来获取它们的 IP 地址。

之后你将获得一个 IP 地址列表,但你无法知道其中哪些是公开可用的。

绑定的 IP 通常作为配置选项给出,或者简单地使用 0.0.0.0:: 来绑定所有可用的 IP 地址。

出于安全原因,当软件上线时,我总是只绑定到单个 IP。

当主机本身不是公开可用,而只能通过负载均衡器/反向代理访问时,我对这一点就不那么严格了。

在Ubuntu服务器上启动Go Web服务器失败,通常与网络配置和权限相关。以下是几个可能的原因和解决方案:

1. 绑定地址问题

localhost 只能从本机访问,服务器应该绑定到 0.0.0.0

const (
    CONN_HOST = "0.0.0.0"  // 允许所有网络接口访问
    CONN_PORT = "8089"
)

func main() {
    err := http.ListenAndServe(CONN_HOST+":"+CONN_PORT, nil)
    if err != nil {
        log.Fatal("服务器启动失败: ", err)
    }
}

2. 端口占用或权限问题

检查端口是否被占用或需要root权限:

package main

import (
    "fmt"
    "log"
    "net"
    "net/http"
)

func main() {
    const port = "8089"
    
    // 检查端口是否可用
    listener, err := net.Listen("tcp", ":"+port)
    if err != nil {
        log.Fatal("端口被占用或无权限: ", err)
    }
    listener.Close()
    
    // 启动服务器
    fmt.Printf("服务器启动在 :%s\n", port)
    log.Fatal(http.ListenAndServe(":"+port, nil))
}

3. 防火墙配置

Ubuntu防火墙可能阻止了端口访问:

# 检查防火墙状态
sudo ufw status

# 开放端口
sudo ufw allow 8089/tcp

# 或者临时关闭防火墙测试
sudo ufw disable

4. 使用环境变量配置

更灵活的配置方式:

package main

import (
    "log"
    "net/http"
    "os"
)

func getEnv(key, fallback string) string {
    if value := os.Getenv(key); value != "" {
        return value
    }
    return fallback
}

func main() {
    host := getEnv("SERVER_HOST", "0.0.0.0")
    port := getEnv("SERVER_PORT", "8089")
    
    addr := host + ":" + port
    log.Printf("启动服务器: %s", addr)
    
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("服务器运行正常"))
    })
    
    log.Fatal(http.ListenAndServe(addr, nil))
}

运行方式:

export SERVER_HOST=0.0.0.0
export SERVER_PORT=8089
./webserver_linux_amd64

5. 完整的错误处理示例

package main

import (
    "log"
    "net/http"
    "time"
)

func main() {
    server := &http.Server{
        Addr:         "0.0.0.0:8089",
        Handler:      nil, // 使用默认mux
        ReadTimeout:  15 * time.Second,
        WriteTimeout: 15 * time.Second,
    }
    
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello from Ubuntu server!"))
    })
    
    log.Println("服务器启动在 http://0.0.0.0:8089")
    if err := server.ListenAndServe(); err != nil {
        log.Fatal("服务器启动错误: ", err)
    }
}

主要问题很可能是将 CONN_HOSTlocalhost 改为 0.0.0.0,这样服务器就能接受外部连接了。

回到顶部