Nginx反向代理重定向



我有一个Nginx反向代理。当我在反向代理中下载mp3文件时,如何将其重定向到真实的服务器URL。

谢谢。

要发送到多个后端,请首先声明一个upstream并代理它。

编辑:正如您所指出的,这只适用于代理。如果您特别想重定向,您需要选择一个。您可以编写一些Lua或NJS来随机选择一个,或者使用由任何内置变量(如$msec(驱动的map来接近相同的行为。下面的例子不会给你严格的均匀分布,但它确实做到了,而且做起来很简单

第二,关于使用301 Moved Permanently的注意事项:这告诉客户端记住重定向,并在将来改为使用该地址。只要你把地址弄对了,那就太好了,而且它永远不会改变。如果你确实需要更改它,这就成了一个问题,因为你必须让每个客户端首先清除它们的缓存。

为了避免这种情况,可以考虑添加一个到期日。多长时间取决于您,但关键是它会强制客户端偶尔与服务器重新验证,以防服务器发生更改,从而为您提供一个退出子句。与此同时,他们仍然可以获得更快的客户端重定向的好处。

编辑:更好的是,对于这样一种有效负载平衡的情况,使用302,这样同一个客户端总是会回来,并且每次都可以选择不同的上游。

map $msec $mp3server {
~[0-2]$ 10.10.1.1:8080;
~[3-5]$ 10.10.1.2:8080;
~[6-9]$ 10.10.1.3:8080;
}
server {
listen 6777; 
location ~ .(mp3|wav)$ {
#expires 1h;
#return 301 http://$mp3server$request_uri;
# or
return 302 http://$mp3server$request_uri;
}
location / {
proxy_pass http://example.com/;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}

测试似乎和预期一样有效(检查Location(:

$ curl -I http://127.0.0.1:6777/foo.mp3
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Wed, 12 Aug 2020 15:08:40 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://10.10.1.1:8080/foo.mp3
Expires: Wed, 12 Aug 2020 16:08:40 GMT
Cache-Control: max-age=3600
$ curl -I http://127.0.0.1:6777/foo.mp3
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Wed, 12 Aug 2020 15:08:41 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://10.10.1.2:8080/foo.mp3
Expires: Wed, 12 Aug 2020 16:08:41 GMT
Cache-Control: max-age=3600
$ curl -I http://127.0.0.1:6777/foo.mp3
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Wed, 12 Aug 2020 15:08:42 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://10.10.1.3:8080/foo.mp3
Expires: Wed, 12 Aug 2020 16:08:42 GMT
Cache-Control: max-age=3600
server {
listen 6777; 
location ~ .(mp3|wav)$ {
return 301 http://10.10.1.1:8080$request_uri;
}

location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}

最新更新