Столкнулся с проблемой.
Имеется программа, которая обновляется используя технологию BITS от Microsoft.
Поскольку обновляния попадаются большие, решили использовать nginx для экономии трафика.
Версия nginx, которую возможно поставить на промежуточную машину FreeBSD 8.1, к сожелению не нова:
nginx version: nginx/0.7.67
configure arguments: --prefix=/usr/local/etc/nginx --with-cc-opt='-I /usr/local/include' --with-ld-opt='-L /usr/local/lib' --conf-path=/usr/local/etc/nginx/nginx.conf --sbin-path=/usr/local/sbin/nginx --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx-error.log --user=www --group=www --http-client-body-temp-path=/var/tmp/nginx/client_body_temp --http-proxy-temp-path=/var/tmp/nginx/proxy_temp --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp --http-log-path=/var/log/nginx-access.log --with-http_stub_status_module --with-pcre
Конфигурация достаточно стандартна:
worker_processes 8;
events { worker_connections 1024;}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$host" "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx-access.log main;
limit_zone softupdate $request_uri 10m;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name proxy.cdn;
default_type application/octet-stream;
limit_conn activity_threshold 1024;
proxy_cache_valid any 10m;
proxy_cache_key $uri$is_args$args;
location / {
if ($request_method !~ GET|HEAD) {return 405;}
open_file_cache max=1000;
expires 10d;
root /var/cache/cdn;
try_files $uri @softupdate_it;
}
location @ms_au_download_it {
open_file_cache max=1000;
expires 3M;
root /var/cache/cdn;
proxy_set_header Range "";
proxy_buffering on;
proxy_ignore_client_abort on;
limit_conn softupdate 1;
proxy_store on;
proxy_set_header Host "parent.cdn";
proxy_set_header If-None-Match "";
proxy_set_header If-Modified-Since "";
proxy_pass http://127.0.0.1:3128;
}
}
}
Как видно при попадании запроса, если файла нет, запрос отправляется дальше (стоит squid для проверки коректности работы).
Вроде бы все хорошо и настроенно корректо. Но как показывает Squid nginx вместо одного потока пытается сразу соединяться как просит клиент - 4-10 потоков.
Поэтому строчки
proxy_set_header Range "";
limit_conn softupdate 1;
были написаны чтоб избежать проблем - 206, при которой не работает proxy_store, и множественных соеденинений. Но она как была так и осталась. Пока маленький файл на трафике не так заметно. Но когда пытается скачаться большой файл. эти несколько потоков убивают весь канал.