Varnish como Reverse Proxy Server for Rubygems

3

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.

    
por Sebastian 01.02.2014 / 03:55

4 respostas

2

Neste ponto, quando você receberá um status 302 do seu back-end de rubygems, será necessário fazer uma solicitação novamente no novo local, especificado pelo cabeçalho HTTP Location na resposta.

Você deve acabar com algo assim:

vcl_fetch {
   if (beresp.status == 302) {  /* The content is on another location */

      /* First change the host of the request*/
      set req.http.host = regsub(regsub(beresp.http.Location, "^http://", ""), "^([^/]+)/.*$", "");

      /* Then change the url of the request */
      set req.url = regsub(beresp.http.Location, "^http://[^/]+/(.*)$", "/");
      return (restart);
   }
}
    
por 22.11.2014 / 10:00
2

Quando entrei em contato com o autor do proxy de armazenamento em cache com raiva , ela respondeu:

Unfortunately your concern is correct. I have left the company two years ago for which I wrote it for - meaning my interest in maintaining it is fairly low. And it seems that nobody else has picked it up there...

    
por 14.10.2017 / 17:47
0

Se você conseguir trabalhar, por favor, compartilhe.
Especialmente se funciona com o protocolo de dependência do bundler.

Existem algumas boas informações aqui Alternativamente, você pode querer dar uma olhada em geminabox

    
por 19.09.2014 / 15:57
0

Outra abordagem é o link que fornece um proxy que armazenará em cache as gemas no caminho.

    
por 14.11.2014 / 02:03