我在docker容器中有一个Nginx反向代理,它侦听端口3000并暴露给3002:docker run -p "3002:3000" ...
。
这个想法是,这个反向代理将/my-app
代理到我的笔记本电脑上端口8080上运行的实例; /my-app/api
中的https://my-domain
和云实例。
这是配置:
upstream my-laptop {
server host.docker.internal:8080; # this is a magic hostname for the laptop's IP address.
keepalive 64;
}
upstream cloud {
server my-domain.com:443;
keepalive 64;
}
server {
listen 3000;
include ssl/ssl-certs.conf;
include ssl/ssl-params.conf;
location /my-app {
proxy_pass http://my-laptop;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /my-app/api {
proxy_pass https://cloud;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...
}
问题是:
https://localhost:3002/my-app
时,我对/my-app/
的响应为301(斜线)。我不知道为什么。本地应用程序实例显示在浏览器中,所以我想暂时可以让它滑动吗?https://localhost:3002/my-app/api/students
时,我收到对https://cloud/my-app/api/students
的301响应。当然,这会导致CORS问题,并且端点不会返回数据。现在,我已经配置了几次反向代理,所以我完全没有看到什么错,这让我感到非常震惊,这不是我第一次。
与其他针对不同应用的反向代理相比,我尝试过调整上游proxy_set_headers。我没主意了。
我在做什么错了?
答案 0 :(得分:4)
虽然提问者的配置没有这个特殊问题,但尾部斜杠问题也可能导致重定向而不是代理,如the docs中所述:
<块引用>如果某个位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 或 grpc_pass 之一处理,则执行特殊处理。响应具有等于此字符串但没有尾部斜杠的 URI 的请求,带有代码 301 的永久重定向将返回到附加斜杠的请求的 URI。如果不需要,可以像这样定义 URI 和位置的精确匹配:
location /user/ {
proxy_pass http://user.example.com;
}
location = /user {
proxy_pass http://login.example.com;
}
答案 1 :(得分:0)
这是nginx作为反向代理的示例配置,适用于我, 我简化了它并删除了不必要的部分。 希望对您有所帮助。
upstream OAUTH {
server remote_oauth;
}
server {
listen 80;
server_name example.com;
client_header_timeout 300;
location = /servies/oauth {
return 301 /services/oauth/;
}
location /services/oauth/ {
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://OAUTH/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-ROOT-URI /services/oauth;
proxy_set_header Accept-Encoding "gzip";
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_intercept_errors on;
proxy_redirect default;
client_max_body_size 4M;
}
}
我认为您错过了这一部分: proxy_pass_request_headers上的
答案 2 :(得分:0)
问题是我的Host
标头在上游云中,我有
proxy_set_header Host $http_host;
但这必须是
proxy_set_header Host my-domain.com;