需求

百度的原始请求:
https://api.map.baidu.com/place/v2/suggestion?query=s&region=sc&city_limit=true&output=json&ak=dl0tuE2WhjbHyqKcHevxXRYnLjV53OZm

代理为:

https://api.example.com/proxy/baidu/suggestion?query=s&region=sc&city_limit=true&output=json&ak=dl0tuE2WhjbHyqKcHevxXRYnLjV53OZm

顺序

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-alpine

RUN apk update
RUN apk add tcpdump
RUN apk add s6 COPY ./services /etc/s6/services
RUN chmod +x /etc/s6/services/nginx/run
RUN chmod +x /etc/s6/services/nginx/finish RUN chmod +x /etc/s6/services/tcpdump/run
RUN chmod +x /etc/s6/services/tcpdump/finish CMD ["s6-svscan", "/etc/s6/services"]

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

能够关掉任务很开心

最新文章

  1. MVC学习系列8--分页和排序
  2. 半平面交模板(BZOJ1007)
  3. Java keytool 使用总结
  4. Java 创建过滤器 解析xml文件
  5. php7+apache2.4 (Windows7下),成功启动。(楼主另外提供了1个php7集成环境打包: http://pan.baidu.com/s/1qXwjpF2 ,如果你只是想了解一下,放在d盘根目录。)
  6. [POJ3061]Subsequence(二分,前缀和)
  7. C#_串口程序_二次打包_事件响应
  8. 用vue开发一个app(1,基础环境配置)
  9. 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能
  10. python中执行py文件出错(提示File “<stdin>”,line 1,SyntaxError:invalid syntax)
  11. centos7磁盘挂载及取消
  12. 初学javaScript推荐工具
  13. linux:rsync + inotifywait 实现【准实时】同步
  14. css - 兼容适配坑点总结(。。。)
  15. “安利”一个CDN服务商网站
  16. apt 下载安装包
  17. 炸!分享美团面试关于selenium的面试题
  18. CSUOJ 1560 图书管理员的表白方式
  19. python学习笔记——多进程中的锁Lock
  20. 【SPOJ】Count On A Tree II(树上莫队)

热门文章

  1. [Swift]LeetCode486. 预测赢家 | Predict the Winner
  2. PHP文件域上传
  3. 【Kafka专栏】-Kafka从初始到搭建到应用
  4. 简单实现 C# 与 Javascript的兼容
  5. redis 系列20 服务器下
  6. 华为oj之字符串分割
  7. Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
  8. Spring Boot (十):邮件服务
  9. [七]JavaIO之 PipedInputStream 和 PipedInputStream
  10. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构