gpt4 book ai didi

rest - 如何将 Nginx 中的 POST/PUT/... 重新路由到内部服务?

转载 作者:行者123 更新时间:2023-12-05 02:48:37 27 4
gpt4 key购买 nike

我有一台安装了 nginx 的服务器(ubuntu 20.04 内核)。在同一台服务器上,我在端口 8080 上运行着 Spring Boot Web(2.3.3.RELEASE) 服务。

我想从外部访问 Spring Boot Web 服务的资源例如http://server/api/users 访问 http://localhost/api/users 并将该响应返回给客户端。

我在 nginx 中配置了以下规则:

location /api {
proxy_pass http://localhost:8080;
}

这适用于 GET 请求,但不适用于 POST 或 PUT。对客户端的第一个响应是状态代码为 301 的响应:永久移动并根据 HTTP spec客户端应将 HTTP 方法更改为 GET 或 HEAD。客户端在第一次响应后自动更改方法,如/var/log/nginx/access.log 中的 nginx 日志文件所示:

192.168.0.1 - - [14/Oct/2020:11:23:56 +0100] "POST /api/users?key=key HTTP/1.1" 301 162 "-" "PostmanRuntime/7.26.5"
192.168.0.1 - - [14/Oct/2020:11:23:56 +0100] "GET /api/users?key=key HTTP/1.1" 200 93 "http://server/api/users?key=key" "PostmanRuntime/7.26.5"
192.168.0.1 - - [14/Oct/2020:11:23:59 +0100] "PUT /api/users/1/deleted?key=key&deleted=false HTTP/1.1" 301 162 "-" "PostmanRuntime/7.26.5"
192.168.0.1 - - [14/Oct/2020:11:23:59 +0100] "GET /api/users/1/deleted?key=key&deleted=false HTTP/1.1" 405 141 "http://server/api/users/1/deleted?key=key&deleted=false" "PostmanRuntime/7.26.5"

来自 PUT 请求的 GET 请求失败并返回 405,因为路径“/api/users/{id}/deleted”没有映射的 GET。我尝试在“location/api {..}”中添加和修改许多不同的配置,例如:

location /api {
proxy_pass http://localhost:8080;
proxy_redirect http://localhost:8080/ /; # I tried "../api /", ".../api/ /", ".../ /api"
proxy_read_timeout 60s;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

serverfault(how do I get nginx to forward HTTP POST requests via rewrite?) 中建议

我在 trac.nginx.com 上发现了完全相同的问题但该配置也不起作用:

location /api { # "/api" and "/api/" doesn't work
proxy_pass ​http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

我目前对我应该尝试让它工作的其他方法感到很迷茫。

--- 编辑:在@ti7 和@ampularius 的帮助下,现在的工作解决方案是:

NGINX 位置条目:

location /api {
proxy_pass http://localhost:8080;
proxy_redirect off;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}

并且在 Spring Boot 服务的 application.properties 中没有进行任何更改,因此这些设置中的 NONE 对这种情况没有任何作用:

server.use-forward-headers=true
server.forward-headers-strategy=native
server.forward-headers-strategy=framework
server.forward-headers-strategy=none

最佳答案

最近我一直在与优秀的 Gunicorn WSGI server 打交道。使用 nginx 前端。

deploy docs建议使用 proxy_passHost header 集禁用 proxy_redirect,这可能是您遇到问题的根源!

这在处理 POSTGET 请求方面效果很好,尽管使用的网络服务器截然不同。

location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://app_server;
}

关于rest - 如何将 Nginx 中的 POST/PUT/... 重新路由到内部服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64351360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com