Docker 在Heroku和Google Cloud上运行的HTTP请求不同

Docker 在Heroku和Google Cloud上运行的HTTP请求不同,docker,http,https,google-cloud-platform,google-cloud-run,Docker,Http,Https,Google Cloud Platform,Google Cloud Run,我有一个NodeJS/expressjsapi,它在发送响应之前执行一个HTTP请求以获取一些JSON。下面是代码片段: const ipApiUrl = `https://ipapi.co/${ip}/json/` const ipApiResponse = await axios.get(ipApiUrl) console.log(ipApiResponse.data) ipCountryCode = ipApiResponse.data.country_code 这段代码在本地运行良好。

我有一个NodeJS/expressjsapi,它在发送响应之前执行一个HTTP请求以获取一些JSON。下面是代码片段:

const ipApiUrl = `https://ipapi.co/${ip}/json/`
const ipApiResponse = await axios.get(ipApiUrl)
console.log(ipApiResponse.data)
ipCountryCode = ipApiResponse.data.country_code
这段代码在本地运行良好。它也适用于Heroku。然而,它在Google Cloud Run上的效果并不相同

以下是
iPapirResponse.data
应该是什么:

{
    "ip": "141.117.117.76",
    "city": "Toronto",
    "region": "Ontario",
    "region_code": "ON",
    "country": "CA",
    "country_code": "CA",
    ...
}
然而,当从Google Cloud发送请求时,我使用的API会返回不同的结果。相反,我得到的回应是:

{ ip: '169.254.8.129', reserved: true }
我认为这是谷歌云运行(GoogleCloudRun)或Docker的问题,因为我在向其他网站(如ipstack.com)发出HTTP请求时也遇到了问题


我正在部署使用Docker运行的Google云。我的
Dockerfile
正在使用
node:10
并公开
PORT
环境变量,如文档所示。除了这个HTTP请求之外,其他一切都可以正常工作。我尝试了
axios
fetch

您正在从专用IP空间发送保留IP地址。此地址在公用Internet上无效。从IPAPI返回的响应是正确的

CIRD块169.254.0.0/16中的IP地址称为自动专用IP地址。此范围内的地址通常用于本地保留网络功能以及在网络上没有DHCP服务器的情况下自动分配IP地址的系统。由于网络故障,也可以分配此地址

解决方案是在对IPAPI的请求中使用有效的公共IP地址。如果您的代码检测到此地址,则您有一个编程错误


注意:如果您试图通过检查网络接口来确定云运行服务的IP地址,则不能。Cloud Run是一种在负载均衡器(称为全局前端(GFE))后面运行的服务。您需要使用外部服务询问“我的公共IP地址是什么”。返回的IP地址将用于GFE,而不是您的云运行服务。

您正在从专用IP空间发送保留IP地址。此地址在公用Internet上无效。从IPAPI返回的响应是正确的

CIRD块169.254.0.0/16中的IP地址称为自动专用IP地址。此范围内的地址通常用于本地保留网络功能以及在网络上没有DHCP服务器的情况下自动分配IP地址的系统。由于网络故障,也可以分配此地址

解决方案是在对IPAPI的请求中使用有效的公共IP地址。如果您的代码检测到此地址,则您有一个编程错误


注意:如果您试图通过检查网络接口来确定云运行服务的IP地址,则不能。Cloud Run是一种在负载均衡器(称为全局前端(GFE))后面运行的服务。您需要使用外部服务询问“我的公共IP地址是什么”。返回的IP地址将用于GFE,而不是您的云运行服务。

要在云运行应用程序上查找访问者的IP地址,您需要阅读
X-Forwarded-for
标题

当您查看请求或TCP连接上的IP地址时,您将看到将流量发送到应用程序的负载平衡器的内部IP地址。(169.254.x.x是中定义的内部IP地址空间,这就是为什么您会看到
“reserved”:true

因此,在Express中,尝试执行以下操作:

var ip = req.header('X-Forwarded-For')

要在云运行的应用程序上查找访问者的IP地址,您需要阅读
X-Forwarded-For
标题

当您查看请求或TCP连接上的IP地址时,您将看到将流量发送到应用程序的负载平衡器的内部IP地址。(169.254.x.x是中定义的内部IP地址空间,这就是为什么您会看到
“reserved”:true

因此,在Express中,尝试执行以下操作:

var ip = req.header('X-Forwarded-For')

更新:我没有想到提问者试图确定云运行服务的最终用户的位置。在这种情况下,看看Ahmet的答案。更新:我没有想到提问者试图确定云运行服务的最终用户的位置。在这种情况下,看看艾哈迈特的答案。