Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
rewrite модуль - нестабиль ная передача парамет ра в скрипт php
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@xxxxxxxxx
|