rewrite модуль - нестабильная передача параметра в скрипт php

Vladimir Fursin fursin at optima.ua
Thu Jan 17 19:10:14 MSK 2008


Hello nginx-ru,

Решил попробовать nginx для обслуживания контролируемого скачивания.
Проблемы в том, что иногда вместо предложения сохранить файл,
в браузер передается ошибка:

502 Bad Gateway
nginx/0.5.33

При этом в error.log nginx'a пишется:

2008/01/17 17:46:00 [error] 10230#0: *3 upstream prematurely closed connection while reading response header from upstream, cl
ient: 192.168.100.58, server: download111.ispisp.net, URL: "/fetch/mp3/m0cQOZXaJoT33vXcLkI24Pbsnuc4+nulkP-whOhKVq7yYUZM1DztLgP
vImH31HrNEXdAV4turHWWimrV4yqkTcKwk0HCO7bI7dRP34wBgXANFoAQOFpyVL9FlrkxGcDmrN4QlkL8QI6OGR5V+n9WNjxCq2yaR59DjEU1gJaYB9d57RQypEaIt
b47B4HFklM+rGSH1iiW6pfQHddCF1bpq0CR6eyrgNgx/aleksandrovskiy_sad_%5Bru%5D_part001.avi", upstream: "http://127.0.0.1:8888/nginx.
php?path=192.168.100.58-m0cQOZXaJoT33vXcLkI24Pbsnuc4%2bnulkP-whOhKVq7yYUZM1DztLgPvImH31HrNEXdAV4turHWWimrV4yqkTcKwk0HCO7bI7dRP
34wBgXANFoAQOFpyVL9FlrkxGcDmrN4QlkL8QI6OGR5V%2bn9WNjxCq2yaR59DjEU1gJaYB9d57RQypEaItb47B4HFklM%2brGSH1iiW6pfQHddCF1bpq0CR6eyrgN
gx/aleksandrovskiy_sad_[ru]_part00^@^@^@^@^@", host: "download111.ispisp.net:82"

Прошу прощения за этот "страшный" лог, попытаюсь объяснить: nginx'у
как фронтэнду передается URL c хэш строкой, в которой содержаться
параметры, нужные для аутентификации запроса. Этот URL передается
rewrite модулем в бэкэнд apache, на котором php скрипт дешифрирует
хэш, извлекает реальный путь и принимает решение, отдавать ли файл.

Обращу внимание на спецсимволы в конце фейкового имени файла в
последней строке сообщения об ошибке - это 0x0, которые появляются
в момент передачи параметра в apache. Однако не они являются
основной проблемой, а именно выдача ошибки 502.


Конфиг nginx:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       conf/mime.types;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       82;
        server_name  download1.isp.net;

        location / {
            rewrite ^/fetch/mp3/(.*)$ /nginx.php?path=$remote_addr-$1 break;
            proxy_pass         http://127.0.0.1:8888/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
    }
}


PHP скрипт:
<?php
require_once("cryptlib.inc");

$path = $_GET["path"];
$delim = strpos($path,"-");
$rem_ad = substr($path,0,$delim);
$path = substr($path,$delim+1);

// Принимаем решение, отдавать ли файл на $rem_ad
// Если да, то:

$path = dldecrypt($path);

header("Content-type: application/octet-stream");
header("X-Accel-Redirect: " . $path);
?>


Переменная $path в последнем операторе header всегда правильная,
т.е. ошибка в передаче параметра от nginx к apache на целостность
хэша не влияет.
Еще момент - если я меняю флаг в параметрах rewrite - вместо break
ставлю permanent или redirect, все начинает работать с завидной
стабильностью, но имя сохраняемого файла при этом всегда становится
nginx.php :(

Подскажите, пожалуйста, где копать.
Спасибо.

-- 
Best regards,
 Vladimir                          mailto:fursin at optima.ua








More information about the nginx-ru mailing list