NGINX配置问题导致Google Distance Matrix API请求IP异常被拒
问题根因
你怀疑的NGINX配置问题不成立,NGINX仅处理外部访问站点的入站请求,站点代码主动发起的对外API调用属于出站请求,完全不经过NGINX转发,和NGINX配置无关。
实际问题是新重建的AWS Lightsail实例默认开启了IPv6双栈支持,系统路由规则默认优先使用IPv6地址发起对外请求,因此调用Google Distance Matrix API时,Google侧识别到的源IP是实例的IPv6地址,和你在Google Cloud控制台配置的API密钥IP白名单里的IPv4地址不匹配,触发REQUEST_DENIED错误。
验证方法
登录服务器执行以下两条命令即可验证:
curl ip.sb正常会返回你错误日志里的IPv6地址curl -4 ip.sb强制走IPv4请求,会返回你绑定的原有公网IPv4地址
解决方案
你可以根据自己的需求任选以下一种方案:
方案1:添加IPv6白名单(操作最简单)
如果你的Lightsail实例IPv6地址是固定的,直接执行curl -6 ip.sb拿到实例公网IPv6地址,登录Google Cloud控制台找到对应的API密钥,把该IPv6地址加入IP白名单即可,无需修改任何服务器配置。
方案2:全局配置优先使用IPv4出站(和原有逻辑完全对齐)
修改系统优先级配置,让所有对外请求默认走IPv4:
- 编辑配置文件:
nano /etc/gai.conf - 找到被注释的配置项
# precedence ::ffff:0:0/96 100,删除行首的#后保存退出 - 配置立即生效,无需重启服务,后续所有对外请求都会优先走IPv4
方案3:仅强制Google API请求走IPv4
如果不想修改全局配置,只需要调整Google API请求的代码,指定强制用IPv4发起请求即可:
function google_get_distance( $ori, $dest ) { $key = get_option( 'ep_theme_options' )[ 'ep_gm_distance_matrix_api' ]; $dist_url = 'https://maps.googleapis.com/maps/api/distancematrix/json?units=metric' . '&origins=' . urlencode( $ori ) . '&destinations=' . urlencode( $dest ) . '&key=' . $key; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $dist_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 适配原有wp_remote_get返回格式,不需要的话可以直接返回$response return [ 'response' => ['code' => $http_code], 'body' => $response ]; }
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

