Лак как обратный прокси-сервер для Rubygems

Я хочу установить сервер кэширования для Rubygems, поскольку я в настоящее время базируюсь во Вьетнаме, и международные интернет-соединения являются довольно медленными. Я пытался сделать это через Лак, но после часов поиска с помощью Google и попытки различных вещей я все еще застреваю и не могу заставить его работать правильно.

Моя цель

Это демонстрационная группа запроса, когда я устанавливаю драгоценный камень:

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

Я хочу установить обратный сервер кэша прокси-сервера (например, rubygems.mydomain.com), где я могу выполнить следующий запрос, и сервер кэширования следовал бы за любыми перенаправлениями внутренне.

rubygems.mydomain.com/latest_specs.4.8.gz

Местоположение перенаправления свяжется с различными доменами (некоторые rubygems субдомены, Amazon S3, rubygems зеркало).

Текущее состояние

После вожения с nginx я нашел это сообщение в блоге, которое достаточно близко, чего я хочу достигнуть. Однако у меня есть слишком мало знания о том, как Лак работает для получения его работающий правильно.

Это - мой текущий файл конфигурации

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);
}

Я могу выполнить запрос, но он отвечает ошибкой:

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>

и это - соответствующий вывод системного журнала для запроса:

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

Так, запрос к Rubygems хорошо работает, но следует, перенаправление не работает как ожидалось. Я радовался бы, мог ли кто-то указать на меня в правильном направлении.

3
задан 1 February 2014 в 04:55
4 ответа

Если это сработает, поделитесь, пожалуйста.
Особенно, работает ли он с протоколом зависимостей сборщика.

Здесь есть полезная информация Вы также можете взглянуть на geminabox

0
ответ дан 3 December 2019 в 06:08

На этом этапе, когда вы получите статус 302 от своей серверной части rubygems, вам нужно будет снова сделать запрос в новом местоположении, указанном в заголовке HTTP Местоположение в ответ.

У вас должно получиться что-то вроде этого:

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://", ""), "^([^/]+)/.*$", "\1");

      /* Then change the url of the request */
      set req.url = regsub(beresp.http.Location, "^http://[^/]+/(.*)$", "/\1");
      return (restart);
   }
}
2
ответ дан 3 December 2019 в 06:08

Другой подход - https://www.npmjs.org/package/angry-caching-proxy, который предоставляет прокси, который будет кэшировать драгоценные камни на пути следования.

0
ответ дан 3 December 2019 в 06:08

Когда я связался с автором angry-caching-proxy , она ответила:

К сожалению, ваше беспокойство верно. Я ушел из компании два года назад, для которой написал ее, что означает, что мой интерес к ее поддержанию довольно низок. И похоже, что никто другой его там не подхватил ...

2
ответ дан 3 December 2019 в 06:08

Теги

Похожие вопросы