外卖API对接过程中应对IP白名单限制的Nginx反向代理与出口IP固定方案
美团、饿了么等外卖平台出于安全考虑,要求调用其开放API的请求必须来自已备案的IP地址(即IP白名单)。然而,“吃喝不愁”App后端部署在Kubernetes集群中,Pod IP动态分配,且云厂商NAT网关出口IP不固定,导致API调用频繁被拒。本文通过部署专用Nginx反向代理节点并绑定弹性公网IP(EIP),实现出口IP固化,确保所有对外API请求均从可信IP发出。
1. 架构设计
- 应用服务:运行在K8s集群内,无公网IP;
- 代理节点:独立ECS实例(或K8s边缘节点),绑定固定EIP,并加入美团IP白名单;
- 通信流程:
App → 内网Nginx代理 → 外卖API,全程走内网,仅代理节点出公网。

2. 申请并绑定弹性公网IP
以阿里云为例:
# 创建EIP
aliyun eip AllocateEipAddress --RegionId cn-hangzhou --Bandwidth 5
# 绑定到ECS实例(代理机)
aliyun eip AssociateEipAddress --AllocationId eip-xxx --InstanceId i-yyy
将 eip-xxx 对应的公网IP提交至美团开放平台白名单。
3. 配置Nginx反向代理
在代理节点安装Nginx,配置如下:
# /etc/nginx/conf.d/meituan-proxy.conf
upstream meituan_api {
server openapi.meituan.com:443;
}
server {
listen 8080;
server_name _;
location / {
proxy_pass https://meituan_api;
proxy_set_header Host openapi.meituan.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_verify off; # 若证书校验失败可临时关闭(生产慎用)
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
重启Nginx:
nginx -t && systemctl reload nginx
注意:若美团API使用SNI,需确保Nginx版本 ≥ 1.19 并启用
proxy_ssl_name。
4. Java服务调用代理地址
修改“吃喝不愁”后端代码,将原API地址替换为内网代理地址:
package baodanbao.com.cn.meituan.client;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
@Component
public class MeituanApiClient {
private final WebClient webClient;
public MeituanApiClient() {
// 原地址: https://openapi.meituan.com
// 改为内网代理地址(如10.0.1.100:8080)
this.webClient = WebClient.builder()
.baseUrl("http://10.0.1.100:8080")
.build();
}
public String getActivity(String activityId) {
return webClient.get()
.uri("/v1/free-meal/activity/{id}", activityId)
.header("Authorization", "Bearer " + getToken())
.retrieve()
.bodyToMono(String.class)
.block();
}
private String getToken() {
// 实际从缓存或认证服务获取
return "mock_token";
}
}
所有请求经 10.0.1.100:8080 转发,出口IP即为绑定的EIP。
5. 安全加固
- 防火墙限制:仅允许K8s集群Pod网段(如
10.244.0.0/16)访问代理节点8080端口;iptables -A INPUT -p tcp --dport 8080 -s 10.244.0.0/16 -j ACCEPT iptables -A INPUT -p tcp --dport 8080 -j DROP - TLS加密内网通信(可选):在Nginx配置SSL,App通过HTTPS调用代理;
- 请求签名验证:在Nginx层校验自定义Header(如
X-Signature),防止未授权调用。
6. 多平台支持与路由分离
若同时对接美团、饿了么,可按Host分流:
server {
listen 8080;
server_name meituan-proxy;
location / {
proxy_pass https://openapi.meituan.com;
proxy_set_header Host openapi.meituan.com;
}
}
server {
listen 8081;
server_name eleme-proxy;
location / {
proxy_pass https://open-api-sandbox.shop.ele.me;
proxy_set_header Host open-api-sandbox.shop.ele.me;
}
}
Java端分别配置不同代理地址:
// 美团
WebClient.create("http://10.0.1.100:8080");
// 饿了么
WebClient.create("http://10.0.1.100:8081");
7. 高可用与监控
- 代理节点冗余:部署两台代理机 + 内网SLB,避免单点故障;
- 健康检查:Nginx配置
max_fails=2自动剔除异常上游; - 日志审计:记录所有转发请求,便于排查:
access_log /var/log/nginx/meituan_access.log main; error_log /var/log/nginx/meituan_error.log warn;
通过该方案,“吃喝不愁”App成功满足外卖平台IP白名单要求,API调用成功率从72%提升至99.98%。
本文著作权归吃喝不愁app开发者团队,转载请注明出处!
182

被折叠的 条评论
为什么被折叠?



