Linux 笔记
docker 与 常用服务
docker 运行 redis
docker 运行 mysql
docker 运行 rabbitmq
docker 部署 MrDoc
docker 部署 wallabag
docker 部署 nextcloud
docker 运行 mindmaster
Docker 常见问题及解决
docker 部署 Standard Notes
ipv6 时代家庭网络的安全性思考
Linux 网络工具
frp vs ngrok vs ssh 隧道
树莓派4 搭建 DNS 服务器
tcpdump & goreplay
Deepin Linux
使用 zsh
Deepin Linux 系统优化
使用 deepin-wine 运行 酷狗音乐
intellij idea
使用 eclipse、vscode 替代 idea
idea 字体设置
nginx 常见问题
nginx 跨域问题处理
nginx 转发导致死循环
nginx 修改请求参数
Manjaro Linux
无法从睡眠唤醒问题修复
树莓派
树莓派系统复制
-
+
首页
nginx 转发导致死循环
考虑以下 nginx 配置 ``` server { listen 80; server_name wiki.kpromise.top; location ~ ^/(api|druid) { proxy_pass http://api.kpromise.top; proxy_connect_timeout 10s; proxy_read_timeout 10s; proxy_send_timeout 10s; gzip off; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header x-wiz-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 这个配置可能导致接口请求死循环,假设你请求 http://wiki.kpromise.top/api/test 此时满足这个 location 的条件,nginx 会转发请求到 http://api.kpromise.top/api/test 但是,注意下面的 `proxy_set_header Host $http_host;` 这是在 header 里设置 host ,而这里的 $http_host 其实是 wiki.kpromise.top,nginx 转发时,其实会先解析 api.kpromise.top 的地址,然后往这个地址发送请求,同时 header 里的 host 字段不是 api.kpromise.top 而是 wiki.kpromise.top 如果 api.kpromise.top 和 wiki.kpromise.top 指向同一个 ip,那么问题就来了,nginx 转发请求时,实际等于请求到了 wiki.kpromise.top,而这又满足这个 location 的条件,nginx 再次转发,然后继续转发给自己,瞬间死循环。 此时,如果你直接请求 http://api.kpromise.top/api/test 是能成功的,而请求 http://wiki.kpromise.top/api/test 就会死循环,如果查看 nginx error 日志,你可能会看到如下内容: ``` 2021/09/03 09:59:44 [alert] 1465#1465: 9120 worker_connections are not enough 2021/09/03 09:59:44 [error] 1465#1465: *32 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 101.34.31.230, server: wiki.kpromise.top, request: "GET /api/test HTTP/1.1", upstream: "http://101.34.31.230:80/api/test", host: "wiki.kpromise.top" ``` 第一行是警告,连接不够了,第二行是超时错误,从第二行可以清楚的看到实际请求发到了 wiki.kpromise.top 而不是 api.kpromise.top 当然,解决方案也很简单,只需要把 `proxy_set_header Host $http_host;` 改为 `proxy_set_header Host api.kpromise.top;` 即可。
十三
2021年9月3日 10:10
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码