Re: Вопрос по лимитированию скорости

forpdfsending at gmail.com forpdfsending at gmail.com
Sat May 22 17:46:49 MSD 2010


Здравствуйте.

Как Вы и предлагали, я в конфиге нгинкса внёс изменения:

server {
        listen       80;
        server_name  localhost;
        limit_conn one 1;
        
        location /get_file/
        {
          proxy_pass http://localhost:8070/qwe/headertest;
        }

        location /files/
        {
         root (тут пробовал ставить и alias) c:/1;
         internal;
        }

    location /lim/
    {
    root   C:/1;
          limit_rate  4k;
          limit_conn one 5;
    }

    Сервлетом отдаю следующее:

            response.setHeader("Content-Disposition: attachment", "1.rar");
            response.setHeader("X-Accel-Redirect:", "/files/lim/1.rar");
            response.setHeader("X-Accel-Limit-Rate:", "155");

При этом в лог пишется ошибка
2010/05/22 19:43:49 [crit] 692#732: *14 CreateFile() "C:\1\nginx-0.8.36/html: /files/lim/1.rar" failed (123: Синтаксическая ошибка в имени файла, имени папки или метке тома), client: 192.168.1.2, server: localhost, request: "GET /get_file/ HTTP/1.1", upstream: "http://127.0.0.1:8070/qwe/headertest", host: "192.168.1.4"
2010/05/22 19:43:49 [error] 692#732: *16 CreateFile() "C:/1/favicon.ico" failed (2: Не удается найти указанный файл), client: 192.168.1.2, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.1.4", referrer: "http://192.168.1.4/get_file/"

Попробовал в сервлете поменять на
response.setHeader("X-Accel-Redirect:", "C:/1/lim/1.rar");
В логе стало отображатться следующее:

2010/05/22 19:38:44 [crit] 692#732: *11 CreateFile() "C:\1\nginx-0.8.36/html: C:/1/lim/1.rar" failed (123: Синтаксическая ошибка в имени файла, имени папки или метке тома), client: 192.168.1.2, server: localhost, request: "GET /get_file/ HTTP/1.1", upstream: "http://127.0.0.1:8070/qwe/headertest", host: "192.168.1.4"
2010/05/22 19:38:44 [error] 692#732: *13 CreateFile() "C:/1/favicon.ico" failed (2: Не удается найти указанный файл), client: 192.168.1.2, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.1.4", referrer: "http://192.168.1.4/get_file/"

Что не так,почему nginx пытается найти файл в C:\1\nginx-0.8.36/html
хотя я ему указал
location /files/
        {
         root (тут пробовал ставить и alias) c:/1;
         internal;
        }

Прошу консультации...


Вы писали 16 мая 2010 г., 16:21:01:

> 2010/5/16 Артур Хуснутдинов <forpdfsending at gmail.com>:
>> Спасибо, прекрасно!
>> Но теперь я в ступоре:
>> Получается, что:
>> /lim/имя файла - скорость режется
>> /nelim/имя файла - скорость не режется
>>
>> Вопрос - как мне сделать динамические ссылки? Ведь юзверь, один раз увидев,
>> что если качать не с адреса /lim/имя файла, а с /nelim/имя файла, то каждый
>> раз будет просто руками исправлять адресную строку на /nelim/имя файла и
>> качать с /nelim/имя файла.
> Как я понял, у Вас в /lim и /nelim хранятся разные файлы из c:/1/lim и
> c:/1/nelim. Если хочется по обоим адресам отдавать файлы из c:/, то
> надо написать вот так:
> location /lim/
> {
>     limit_rate ...;
>     alias c:/1/;
> }
> location /nelim/
> {
>     alias c:/1/;
> }

>> Как динамику-то сделать? В своё время я писал задачку, заточенную под эту
>> задачу - при запросе файла с сайта юзверю передавалась ссылка
>> /userid/filehash, а в БД MySQL заносилась запись с параметрами userid,
>> filehash, path to file (определяется средствами PHP на основе filehash) и
>> downloadspeed. Программа при запросе брала userid и filehash с GET URL и
>> смотрела по БД, есть ли запись в ней с таким userid и filehash ,если есть,
>> то отдавала файл на скорости, взятой из записи в БД.
>> Так вот, как-нибудь возможно ли на nginx построить такой аналог?
> То, что Вы хотите сделать можно сделать, используя проксирование на
> http или fastcgi-бекенд.
> У Вас должен быть location для файлов:
> location /files/
> {
>     alias c:/1/;
>     internal;
> }
> Директива internal не позволит пользователям получить доступ к файлам напрямую.
> И location для бекенда:
> location /get_file/
> {
>     proxy_pass/fastcgi_pass ...;
> }
> На бекенде должен висеть простенький скрипт - при принятии запроса
> вида /get_file/?user=userid&file=filehash лезть в базу и:
> 1) Отдавать заголовок:
> Content-Disposition: attachment; filename=имя_файла
> 2) Отдавать заголовок:
> X-Accel-Redirect: /files/путь_до_файл_относительно_c:/1/
> 3) Если нужно ограничить скорость, отдавать заголовок:
> X-Accel-Limit-Rate: ограничение_скорости_в_байтах_в_секунду.

> А вообще - использование nginx/windows для серьезных целей, кроме
> тестирования при разработке, настоятельно не рекомендуется.




-- 
С уважением,
 Forpdfsending                          mailto:forpdfsending at gmail.com




More information about the nginx mailing list