Столкнулся с проблемой.
Имеется программа, которая обновляется используя технологию 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, и множественных соеденинений. Но она как была так и осталась. Пока маленький файл на трафике не так заметно. Но когда пытается скачаться большой файл. эти несколько потоков убивают весь канал.
Имеется программа, которая обновляется используя технологию 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, и множественных соеденинений. Но она как была так и осталась. Пока маленький файл на трафике не так заметно. Но когда пытается скачаться большой файл. эти несколько потоков убивают весь канал.