Создание миррора репозитория Debian средствами nginx

Сентябрь 16th, 2009 | Tags: , ,

Некоторое время назад возникла потребность в централизованном хранении пакетов и обновлений для Debian GNU/Linux, т.к. тянуть пакеты из интернета - это приличный трафик и приличные задержки.

Сразу же возникла идея замиррорить  ftp.debian.org. Но идея была отвергнута из-за большого трафика и ненадобностью хранения неиспользуемых пакетов.

apt-proxy и apt-cache не понравились, т.к. они отличаются приличными тормозами, да и не логично как-то отдавать статические и увесистые файлы с помощью питоновских скриптов.

В итоге задача решилась с помощь nginx. Попутно получился миррор репозитория Ubuntu и Debian Security. Получился следующий конфиг.

user  www;
worker_processes  3;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    access_log    /var/log/nginx_access.log;

    upstream ftpdebian {
        server ftp.de.debian.org;
        server mirror.yandex.ru;
    }

    upstream ubuntu {
        server security.ubuntu.com;
        server ru.archive.ubuntu.com;
    }

    proxy_cache_path  /home/apt-repo/cache  levels=1:2   keys_zone=one:10m;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
    proxy_connect_timeout 5;
    proxy_send_timeout 1;
    proxy_read_timeout 2;

    server {
        listen   *:80 default;
        server_name  apt.host;

        proxy_store_access   user:rw  group:rw  all:r;
        proxy_temp_path      /home/apt-repo/temp;
        proxy_cache_valid  200 302      1d;
        proxy_cache_valid  404          1d;
        proxy_cache_use_stale   error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
        proxy_cache_key  $request_uri;

        root /home/apt-repo;

        # Debian
        location /debian/ {
            proxy_pass http://ftpdebian;
            proxy_cache one;
        }

        location ~ ^/debian/.*\.(deb|diff\.gz|diff\.bz2|tar\.gz|dsc)$ {
            error_page 404 =  @deb_fetch;
        }

        location @deb_fetch {
            proxy_pass           http://ftpdebian;
            proxy_store          on;
        }

        # Ubuntu
        location /ubuntu/ {
            proxy_pass           http://ubuntu;
            proxy_store          on;
        }

        location ~ ^/ubuntu/.*\.(deb|diff\.gz|diff\.bz2|tar\.gz|dsc)$ {
            error_page 404 =  @ubuntu_fetch;
        }

        location @ubuntu_fetch {
            proxy_pass           http://ubuntu;
            proxy_store          on;
        }

        # Debian Security
        location ~ ^/(dists|pool)/.*\.(deb|diff\.gz|diff\.bz2|tar\.gz|dsc)$ {
            error_page 404 =  @update_fetch;
        }

        location /dists/ {
            proxy_pass           http://security.debian.org;
            proxy_store          on;
        }

        location /pool/ {
            proxy_pass           http://security.debian.org;
            proxy_store          on;
        }

        location @update_fetch {
            proxy_pass           http://security.debian.org;
            proxy_store          on;
        }
    }
}

В данном методе применяется proxy_cache для кэширования “метаданных”, пакеты же и прочие не изменяющиеся данные сохраняются с помощью proxy_store.

No comments yet.
You must be logged in to post a comment.
TOP