我最近从 Rackspace 切换到 AWS,并且正在使用freegeopip设置一个简单的地理定位服务器。虽然以下命令在新的 Rackspace 服务(Ubuntu)上完美运行,但我无法在 AWS 上工作(尝试过 Red Hat 和 Ubuntu)。这是我用来设置它的代码:
curl -s https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz | tar -C /opt -zx
export GOPATH=$HOME
export GOROOT=/opt/go
export PATH=$PATH:/opt/go/bin
go get github.com/fiorix/freegeoip/cmd/freegeoip
$GOPATH/bin/freegeoip -addr="<MY IP ADDRESS>:8080"
正如我所说,这在我的 Rackspace 实例上非常有效,但 AWS 给了我这个错误:
listen tcp <MY IP ADDRESS>:8080: bind: cannot assign requested address
我用 netstat 检查了这个端口,上面没有运行任何东西。我不知道为什么会收到此错误。有任何想法吗?
在许多情况下,绑定到 0.0.0.0 是最好的做法,除非您有特定的理由只绑定到特定地址。
但是我假设您正在做的事情不起作用,因为您正在尝试绑定到实例的公共 IP 地址,您会发现(通过
ifconfig
)您的 IP 堆栈不知道。AWS 实例只知道它们的私有 IP 地址,这是您需要绑定的。
与实例关联的 EC2(经典和 VPC)实例公有地址通过 AWS 网络基础设施 1:1 NAT 转换为私有地址。
AWS 在您的实例和 Internet 之间运行网络地址转换。因此,AWS 实例可能可以通过 IP 地址 08.08.08.0808 访问,但服务器实际上配置为使用 88.88.88.88。我需要做的是绑定到我使用 ifconfig 找到的服务器的内部 IP。