Создание миррора репозитория Debian средствами nginx
Некоторое время назад возникла потребность в централизованном хранении пакетов и обновлений для 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.
