Eu quero configurar um servidor de cache para Rubygems, já que estou atualmente no Vietnã e as conexões internacionais de internet são bem lentas. Eu tenho tentado fazer isso através do verniz, mas depois de horas pesquisando e tentando várias coisas, eu ainda estou presa e não consigo fazer funcionar corretamente.
Meu objetivo
Este é um exemplo de grupo de solicitações quando estou instalando uma gem:
GET http://api.rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
Eu quero configurar um servidor de cache de proxy reverso (por exemplo, rubygems.mydomain.com) onde eu possa executar a seguinte solicitação e o servidor de cache seguirá todos os redirecionamentos internamente.
rubygems.mydomain.com/latest_specs.4.8.gz
O local de redirecionamento será vinculado a vários domínios (alguns subdomínios rubygems, Amazon S3, rubygems mirror).
Estado atual
Depois de brincar com o nginx, achei este post no blog que é bem próximo do que eu quero alcançar. No entanto, tenho muito pouco conhecimento sobre como o Varnish funciona para que ele funcione corretamente.
Esse é o meu arquivo de configuração atual
import std;
backend rubygems {
.host = "rubygems.org";
.port = "80";
}
sub vcl_recv {
std.syslog(180, "RECV: " + req.http.host + req.url);
if (!req.url ~ "^http") {
std.syslog(180, "FETCH");
set req.backend = rubygems;
return (lookup);
}
}
sub vcl_fetch {
if (beresp.status == 302) {
set beresp.http.X-Magic-Redirect = "1";
return(deliver);
}
}
sub vcl_hit {
if (obj.http.X-Magic-Redirect == "1") {
set req.url = obj.http.Location;
return (restart);
}
}
sub vcl_deliver {
if (resp.http.X-Magic-Redirect == "1") {
unset resp.http.X-Magic-Redirect;
return(restart);
}
return(deliver);
}
Eu posso fazer uma solicitação, mas ela responde com um erro:
curl -is http://localhost:8080/latest_specs.4.8.gz
HTTP/1.1 302 Found
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 376
Accept-Ranges: bytes
Date: Sat, 01 Feb 2014 02:33:47 GMT
X-Varnish: 933109322
Age: 1
Via: 1.1 varnish
Connection: close
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>302 Found</title>
</head>
<body>
<h1>Error 302 Found</h1>
<p>Found</p>
<h3>Guru Meditation:</h3>
<p>XID: 933109322</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
e essa é a saída do syslog correspondente para a solicitação:
Jan 31 18:33:46 precise64 varnishd[2387]: RECV: localhost:8080/latest_specs.4.8.gz
Jan 31 18:33:46 precise64 varnishd[2387]: FETCH
Jan 31 18:33:47 precise64 varnishd[2387]: RECV: localhost:8080/latest_specs.4.8.gz
Jan 31 18:33:47 precise64 varnishd[2387]: FETCH
Jan 31 18:33:47 precise64 varnishd[2387]: RECV: localhost:8080http://production.s3.rubygems.org/latest_specs.4.8.gz
Assim, a solicitação para Rubygems está funcionando bem, mas seguir o redirecionamento não funciona como esperado. Eu ficaria feliz se alguém pudesse me apontar na direção certa.