Я хочу настроить кеш-сервер для Rubygems, так как в настоящее время я живу во Вьетнаме, а международные интернет-соединения довольно медленные. Я пытался сделать это с помощью Varnish, но после нескольких часов поиска в 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, я обнаружил это сообщение в блоге что довольно близко к тому, чего я хочу достичь. Однако у меня слишком мало знаний о том, как работает Varnish, чтобы заставить его работать должным образом.
Это мой текущий файл конфигурации
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 работает нормально, но после перенаправления работает не так, как ожидалось. Я был бы рад, если бы кто-нибудь указал мне правильное направление.
Когда я связался с автором сердитый кеширующий прокси, она ответила:
К сожалению, ваше беспокойство верно. Я ушел из компании два года назад, для которой написал ее, что означает, что мой интерес к ее поддержанию довольно низок. И вроде больше никто там не подобрал ...
На этом этапе, когда вы получите статус 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);
}
}
Если у вас это работает, поделитесь.
Особенно, работает ли он с протоколом зависимостей сборщика.
Есть хорошая информация Вот В качестве альтернативы вы можете взглянуть на геминабокс
Другой подход https://www.npmjs.org/package/angry-caching-proxy который предоставляет прокси-сервер, который будет кэшировать драгоценные камни по пути.