博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记阿里云SLB后配置Nginx反向代理百度地图API的坑
阅读量:5268 次
发布时间:2019-06-14

本文共 2235 字,大约阅读时间需要 7 分钟。

需求

百度的原始请求:

代理为:

顺序

 

Client –》 SLB –》 Nginx-Proxy –>baidu.com api   -阿里云环境

Clinet –>Nginx  -> Nginx-Proxy –>baidu.com api  - 测试环境

问题

在自建环境中,没有任何问题,但是发布到阿里云SLB(service load balance)之后,居然百度端会报

参数无效。

 

我们是采用Bitbucket来管理Nginx-proxy, 由于采用的是Docker执行,整体上倒是很方便,就是相比直接部署来说,每次发布时间要长一些。(由于是全自动化,倒是可以喝个水,溜下单身狗什么的)

 

# in QA, it works well with SLB    location ^~/proxy/baidu/ {            #support cross-domain visit for app                       add_header Access-Control-Allow-Methods GET,POST,OPTIONS;            #allow credentials            add_header Access-Control-Allow-Credentials true;            #allow-headers            add_header 'access-control-allow-headers' 'Authentication,Origin,X-Requested-With,Content-Type,Accept,token,appId,unitId';                        #alias //;       #     proxy_set_header X-Real-IP $remote_addr;        #    proxy_set_header REMOTE-HOST $remote_addr;         #   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                  proxy_pass http://api.map.baidu.com/place/v2/;            #proxy_redirect https://api.map.baidu.com/place/v2// /;                  #proxy_pass http://node-http/log/testGet/;            #proxy_redirect http://node-http/log/testGet// /;    }
检查过程

由于采用docker部署方式,理论上说都是一样的。唯一可能的是:SLB那边转发做了一定的改动。因此,采用tcpdump来抓包,比较两个环境下的转发请求的不同

其实,我最开始的时候,采用的是Node-http来获得Nginx-Proxy 请求

Client –》 SLB –》 Nginx-Proxy –>baidu.com api   -阿里云环境 改为

Client –》 SLB –》 Nginx-Proxy –>Node Http

通过捕获Http请求,来比较两个环境下请求有哪些不同。其实两种工具都可以: Node Http 或者采用 Tcpdump 来获得请求。

 

比较结果:

发现过程就是用firefox的web Tool不停的编辑header头,做测试了,直到。。。

最终发现是:由于在配置SLB的时候增加了一个header造成的,去掉就可以了。

X-Forwarded-Proto: https\r\n

在此期间分别向阿里云和百度提交了工单,阿里云的工程师回复比较积极,百度就呵呵了。有可能用的百度地图服务是免费的,因此人家呵呵。

后面补充一点

由于在Nginx-Proxy docker中即要启动Nginx,同时,又需要启动tcpdump,因此需要安装了s6-svscan 服务驻守程序。

我简单把dockerfile内容供参考吧

FROM nginx:1.12.1-alpineRUN apk update RUN apk add tcpdumpRUN apk add s6COPY ./services /etc/s6/servicesRUN chmod +x  /etc/s6/services/nginx/runRUN chmod +x  /etc/s6/services/nginx/finishRUN chmod +x  /etc/s6/services/tcpdump/runRUN chmod +x  /etc/s6/services/tcpdump/finishCMD ["s6-svscan", "/etc/s6/services"]

注意要自己编写 services目录下面的服务启动文件 run和关闭文件finish,具体的大家google一下吧(为什么不百度,因为它呵呵我。)

能够关掉任务很开心

 

转载于:https://www.cnblogs.com/king_astar/p/9580269.html

你可能感兴趣的文章
线程池的概念
查看>>
Oracle_Statspack性能诊断工具
查看>>
转获取sql维护的表关系
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>