反向代理缓存 Steam 流

反向代理缓存 Steam 流

我目前正在使用 nginx 来缓存本地网络的 Steam 下载,详情如下多人游戏。这很好用,但 Steam 有一个功能,可以通过与 Twitch 类似的流式传输观看其他用户的游戏,但需要点播。我遇到了代理无法缓存流的问题。我不介意(也许这是更好的选择)不缓存此内容,但我无法弄清楚,因为我是 nginx 新手。

被访问的服务器是valve#.cs.steampowered.com并且都在寻找/broadcast/... 以下示例请求和响应:

GET /broadcast/2671935884594669886/manifest/94/?broadcast_origin=br02.broadcast.iad.steamstatic.com:80&viewer=10502638835558921467 HTTP/1.1
Host: valve65.cs.steampowered.com
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-CA,en;q=0.8,en-US;q=0.6
Origin: http://steamcommunity.com
Referer: http://steamcommunity.com/broadcast/watch/76561198065147403
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36

HTTP/1.1 404 Not Found
Connection: keep-alive
Content-Length: 570
Content-Type: text/html
Date: Sun, 07 Feb 2016 03:15:58 GMT
Server: nginx/1.6.2

以下是从代理转移流量的示例请求和响应:

GET /broadcast/1432112925536035508/manifest/94/?broadcast_origin=valve66.broadcast.sea.steamstatic.com:80&viewer=10502638835558921467 HTTP/1.1
Host: valve63.cs.steampowered.com
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-CA,en;q=0.8,en-US;q=0.6
Origin: http://steamcommunity.com
Referer: http://steamcommunity.com/broadcast/watch/76561198015566908
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36

HTTP/1.1 200 OK
Access-Control-Allow-Headers: 
Access-Control-Allow-Methods: GET,HEAD,OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Date
cache-control: no-cache,must-revalidate
content-length: 2621
content-type: application/xml
Date: Sun, 07 Feb 2016 03:25:20 GMT
expires: Mon, 26 Jul 1997 05:00:00 GMT

看起来expires有点搞笑(1997 年?)但no-cache已经设置好了。我使用的相关配置可以在我的GitHub选择node-steam适合的一个进行使用。

我曾尝试添加以下内容,但没有成功(之前location /):

location /broadcast/ {
    proxy_cache_bypass $arg_nocache;
    proxy_no_cache $arg_nocache;
}

我该怎么做才能绕过代理这些请求?

编辑:以下是有关实际问题的更多详细信息。我使用 nginx 作为反向代理来缓存 Steam 下载,这些下载来自,*.cs.steampowered.com并且运行良好。Steam 还具有广播功能,用户可以在直播中观看其他人玩他们的游戏。这里有一个列表这里。尝试观看时,广播将停留在那里无限期地加载,但聊天和页面的其余部分将加载。绕过 nginx 可以消除此问题。

查看直播请求后,我发现所有请求都*.cs.steampowered.com/broadcast/返回 404。不幸的是,内容服务器和广播服务器之间存在一些重叠。没有规则,所以location /我以为这些请求无论如何都会通过代理传递。

答案1

发生了几件事。location /正在被缓存,最初捕获了流量。

添加以下规则有效,但只有在清除最初使用的缓存后才有效,出于某种我仍未弄清楚的原因。

location /broadcast/ {
    # Proxy
    proxy_next_upstream error timeout http_404;
    proxy_pass http://$host$request_uri;
    proxy_redirect off;

    # Upstream request headers
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # Useful headers for debugging / stats
    add_header X-Upstream-Status $upstream_status;
    add_header X-Upstream-Response-Time $upstream_response_time;
    add_header X-Upstream-Cache-Status $upstream_cache_status;

    # New settings - 2014-04-12 (i52)
    proxy_ignore_client_abort on;

    # Increase proxy timeout to increase throughput
    proxy_read_timeout 300;
}

此位置的内容与我在其他地方处理代理的方式相同。

相关内容