使用 "the old way" 时带有反向代理的 ShimmerCat

ShimmerCat with reverse proxy when using "the old way"

我用过ShimmerCat with sc-tool to connect to my development sites as described here, and everything has worked always like a charm with it, but I also wanted to follow the "old way" configuring my /etc/hosts. In this case I had a small problem, the server ran ok, and I could access to my development site (let's say that I used https://www.example.com:4043/), but I'm also using a reverse proxy as described on this article, and on the config file reference。它重定向到我正在使用的 Django 应用程序。假设这是我的 devlove.yaml 配置文件:

---
shimmercat-devlove:
    domains:
        www.example.com:
            root-dir: site
            consultant: 8080
            cache-key: xxxxxxx
        api.example.com:
            port: 8080

问题是,当我尝试访问请求 APIURL 时,API 发送了一个 404 响应。让我试着通过一个例子来解释它。我尝试访问 https://www.example.com:4043/country/,并在此页面上向 API 发出请求:/api/<country>/towns/,然后 API 端点返回 404 响应所以它没有找到这个 URL,这在使用 Google Chromesc-tool 时不会发生。我在 /etc/hosts 上设置了两个域 www.example.comapi.example.com。我一直在努力解决它,但没有任何运气,我缺少什么吗?欢迎任何帮助。提前致谢。

有了更多的数据,我们也许能够找到问题所在。同时,这里有一个故障排除提示列表:

可能的问题:DNS 缓存在浏览器中,/etc/hosts 尚未使用(尚未)

如果您的浏览器在您更改 /etc/hosts 文件之前由于某种原因没有进行 DNS 查找,就会发生这种情况。然后连接将转到 Internet 中的域,该域可能没有您正在调用的 API 端点。

疑难解答:检查 ShimmerCat 的日志以查找请求。如果这是问题所在,关闭并打开浏览器可能会解决问题。

可能的问题:主机header不正确

ShimmerCat使用HTTP/1.1请求中的Hostheader和HTTP/2请求中的:authorityheader来区分域.它总是丢弃其中存在的任何端口号。如果这些 header 未设置或设置为 ShimmerCat 配置为侦听的域以外的域,服务器将认为这种情况非常卑鄙,它只会关闭连接。

故障排除:这不是 404 错误,而是连接关闭(如果尝试连接 un-proxied,直接连接到 ShimmerCat 正在侦听的 SSL 端口),或 Socks 连接失败(如果尝试通过 ShimmerCat 的 built-in SOCKS5 代理连接)。在前一种情况下,服务器将在其日志中打印消息 "Rejected request to Just https://some-domain-or-ip/some/path",使用域的实际值,或 "Rejected request to Nothing",如果不存在 header。第二种情况比较复杂,因为SOCKS5代理在HTTP路由算法之前。

无论如何,浏览器都会在开发者工具的网络面板中放一条红线。如果您使用 curl 访问服务器,像这样:

curl  -k -H host:api.incorrect-domain.com https://127.0.0.1:4043/contents/blog/data-density/

或喜欢

curl  -k -H host:api.incorrect-domain.com 

(注意第二种形式的--http2参数),你会得到一个响应:

curl: (56) Unexpected EOF

Extra-tip:浏览器的开发者工具中有一个网址字段。检查一下,它可能会告诉你一些事情!

可能的问题:将请求传递给 api back-end.

时出现问题

API 后端对主机 header 以及身份验证 cookie 和请求参数等其他内容也很敏感。

故障排除: 一种诊断方法是使用 --show-proxied-headers command-line 选项调用 ShimmerCat。它使 ShimmerCat 向日志报告代理 headers:

Issuing request with headers         :authority: api.example.com
    :method: GET
    :path: /my/api/endpoint/path/
    :scheme: https
    accept: */*
    user-agent: curl/7.47.0

可能的问题:有两个或更多的 ShimmerCat 运行

...他们使用不同的配置。 ShimmerCat 在多个进程之间使用端口共享来提高可用性。这样做的一个缺点是完全有可能错误地启动 ShimmerCat,忘记停止它,并在更改一些配置位后再次启动它。这两个实例将同时 运行,并且它们中的任何一个都将选择与侦听端口建立的连接。

故障排除:关闭所有ShimmerCat实例,然后double-check有none运行使用[=]的对应形式20=]命令,然后用你想要的配置启动服务器。