在用 nginx 配置 superset 反向代理,并且使用 map 通过 cookie 分流的时候,遇到十分诡异的问题,访问主页的时候总是被重定向到 upstream 同名的域名
upstream release {
server 127.0.0.1:8088 weight=1 max_fails=1 fail_timeout=30s;
}
upstream development {
server 127.0.0.1:8089 weight=1 max_fails=1 fail_timeout=30s;
}
map $COOKIE_version $env {
default release;
release release;
development development;
}
server {
listen 10001;
server_name localhost;
location / {
proxy_pass http://$env;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
结果如下
curl -I http://127.0.0.1:10001/
HTTP/1.1 302 FOUND
Server: nginx/1.17.1
Date: Thu, 15 Aug 2019 07:54:44 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 241
Connection: keep-alive
Location: http://release/superset/welcome // 这里是重定向的 header
搞的我一度以为是不是最新版的 nginx 在 map 和 upstream 的定义上有 bug,但是想了想似乎不可能,然后从结果表现和程序员普遍的行为习惯分析来看(superset代码巨复杂,加上 python 这灵活脚本语言加成,真的不想翻它的代码),应该是代理里读取了 host 这个 header,然后 location,然后看到 nginx proxy 文档里有这句话
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
谜题解开了。
代理配置加上这个,就可以把原本的 Host 传给 superset
proxy_set_header Host $http_host;
curl -I http://127.0.0.1:10001/
HTTP/1.1 302 FOUND
Server: nginx/1.17.1
Date: Thu, 15 Aug 2019 08:06:47 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 241
Connection: keep-alive
Location: http://127.0.0.1:10001/superset/welcome
更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号