需求

百度的原始请求:
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一下吧(为什么不百度,因为它呵呵我。)

能够关掉任务很开心

记阿里云SLB后配置Nginx反向代理百度地图API的坑的更多相关文章

  1. CentOS 7 学习(二) 配置Nginx反向代理

    CentOS 7 学习(二) 配置Nginx反向代理 Nginx可以通过php-fpm来运行PHP程序,也可以转向apache,让apache调用php程序来运行. 不过对于Nginx来说,其反向代理 ...

  2. 为docker私有registry配置nginx反向代理

    公司的Docker私有registry已经搭建好了,用官方的registry image很容易就搭建好了.现在就是要用nginx的反向代理把它放出来,以便在外网可以访问. 我的上一篇blog 讲了如何 ...

  3. 使用SSL配置Nginx反向代理的简单指南

    反向代理是一个服务器,它接收通过Web发出的请求,即http和https,然后将它们发送到后端服务器(或服务器).后端服务器可以是单个或一组应用服务器,如Tomcat,wildfly或Jenkins等 ...

  4. 配置LANMP环境(7)-- 配置nginx反向代理,与配置apache虚拟主机

    一.配置nginx反向代理 1.修改配置文件 vim /etc/nginx/nginx.conf 在35行http下添加一下内容: include /data/nginx/vhosts/*.conf; ...

  5. 阿里云SLB后Nginx、Tomcat获取真实IP

    一.SLB后Nginx如何获取真实IP 前提:nginx作为slb获取真实ip是使用 http_realip_module,默认一键安装包安装的nginx没有安装这个模块需要重新重新编译nginx并加 ...

  6. 在阿里云域名https配置(nginx为例)

    如题: 在阿里云上注册了域名之后在阿里云域名控制台配置https: 1.在域名控制台选择要配置的域名,并在操作栏点击“解析” 2.在域名解析点击更多下的SSL进入到证书列表页,这里有收费的也有免费的, ...

  7. [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  8. [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  9. node项目发布+域名及其二级域名配置+nginx反向代理+pm2

    学习node的时候也写了一些demo.但是只是限于本地测试,从来没有发布.今天尝试发布项目. 需要准备的东西 node 项目:为了突出重点,说明主要问题.我只是拿express 写了很简单的demo. ...

随机推荐

  1. Java常用工具类练习题

    1.请根据控制台输入的特定日期格式拆分日期 如:请输入一个日期(格式如:**月**日****年) 经过处理得到:****年**月**日 提示:使用String的方法indexOf.lastIndexO ...

  2. 95%的技术面试必考的JVM知识点都在这,另附加分思路!

    概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. ...

  3. iOS学习——核心动画

    iOS学习——核心动画 1.什么是核心动画 Core Animation(核心动画)是一组功能强大.效果华丽的动画API,无论在iOS系统或者在你开发的App中,都有大量应用.核心动画所在的位置如下图 ...

  4. ThinkPHP Redis实现模拟队列

    1.入队操作: //入队 public function enqueue() { $redis = new \Redis(); $redis->connect('127.0.0.1',6379) ...

  5. .NET代码树执行时间计时器

    有很多时候我们需要对代码不同段计算一个执行时间,并希望通过节点树的方式表达现每段代码的执行时长.在.Net下似乎找不到这样一个功能类,所以花了一些时间实现这样一个代码运行计时器.首先看一下简单的需求. ...

  6. 如何用浏览器在线查看.ipynb文件

            当我们用jupyter notebook编辑好.ipynb文件后,肯定会想不用运行jupyter notebook也能方便得查看.ipynb的文件,如果直接打开.ipynb的文件,我们 ...

  7. groupcache源码解析-概览

    接下来讲什么 今天开始讲groupcache! Memcached大家应该都不陌生,官网的介绍是: Free & open source, high-performance, distribu ...

  8. 三种方法实现CSS三栏布局

    本文由云+社区发表 作者:前端林子 本文会分别介绍三种CSS实现三栏布局的方法,可在浏览器中打开查看效果 1.方法一:自身浮动的方法 实现方法:需要左栏向左浮动,右栏向右浮动,中间设左右margin来 ...

  9. [二十二]JavaIO之LineNumberReader

    功能介绍 LineNumberReader是提供了行号的具体的装饰器类 跟踪行号的缓冲字符输入流 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用 ...

  10. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...