количество соединений
AleXXX V. NovikoFF
alexxx at alexxx.ru
Mon May 15 18:48:39 MSD 2006
В общем есть апач на бэкэнде, на нем собственно сайт болтается и он же
выполняет авторизацию.
Часть конфига:
------------------------------------------------------
........
location ^~ /mults/ {
# все файлы для скачки отправляем в авторизатор (down.php)
rewrite ^/mults/([^?&=]+\.(avi|mpeg|mpg|wmv))$ /down.php/mults/$1 break;
# остальные в CMS
rewrite ^/mults/ /index.php?page=mults break;
proxy_pass http://127.0.0.1;
proxy_buffer_size 8k;
proxy_buffers 4 32k;
proxy_temp_file_write_size 256k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# внутренний линк на файлы
location /mult_ftp/ {
internal;
root /home/multiki;
send_timeout 13;
set $orig_uri $uri;
set $orig_args $args;
set $orig_ip $remote_addr;
# по окончании закачки (и при таймауте тоже) отправялем на
# закрытие сессии
post_action /edown.php;
}
# этот скрипт закрывает сессию
location = /edown.php {
internal;
proxy_pass http://127.0.0.1/edown.php;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_request_body off;
# передаем ему все, что нужно, кто и сколько скачал, он же
# вычисляет скорость закачки в итоге для статистики
proxy_set_header X-Orig-URL $orig_uri?$orig_args;
proxy_set_header X-Bytes-Sent $body_bytes_sent;
proxy_set_header X-User-IP $orig_ip;
proxy_set_header X-Orig-Sess $orig_args;
}
.......
------------------------------------------------------
Скрипты:
скрипт down.php
------------------------------------------------------
<?
....
# вычисляем, а можно ли юзеру качать, делаем запросы в базу, что у него
# сейчас качается, сколько потоков на один айпи занято, если все хорошо,
# то:
# можно и скорость ограничить, если он, например, из-за рубежа
if($ip_info=="LIMIT") header("X-Accel-Limit-Rate: ".$CONF['LIMIT_SPEED']);
# отдаем нгинксу команду отдать человеку этот файл
header("X-Accel-Redirect: /mult_ftp/".$file."?".$id_sess);
exit;
# иначе в зависимости от ситуации (например):
header("HTTP/1.0 503 Global Connection Limit");
header("X-Info: Too many connections! For advanced information visit http://mults.spb.ru/limits/");
header("Refresh:0; url=/err/503.global.html");
exit;
?>
------------------------------------------------------
скрипт: edown.php
------------------------------------------------------
<?
.....
# получили из заголовков информацию об окончании закачки
$client_ip=$_SERVER["HTTP_X_USER_IP"];
$client_url=$_SERVER["HTTP_X_ORIG_URL"];
$client_bytes=doubleval($_SERVER["HTTP_X_BYTES_SENT"]);
$client_sess_id=intval(preg_replace("/[^\d]+/", "", $_SERVER["HTTP_X_ORIG_SESS"]));
# служебная инфа разная...
$client_ip_info=get_ip_info($client_ip);
# функция делает декремент количеству потоков в таблице сессий
# для этого айпи в базе
close_conn($client_sess_id, $client_bytes, $client_ip, $client_ip_info);
?>
------------------------------------------------------
Таблица сессий:
------------------------------------------------------
CREATE TABLE `down_session` (
`ip_addr` varchar(15) NOT NULL default '0.0.0.0',
`date_in` int(10) unsigned NOT NULL default '0',
`ip_type` enum('DENY','LIMIT','RUS','VIP','ANONYM') NOT NULL default 'LIMIT',
`threads` mediumint(4) unsigned NOT NULL default '0',
`errors` mediumint(4) unsigned NOT NULL default '0',
PRIMARY KEY (`ip_addr`)
) TYPE=HEAP COMMENT='Сессии юзеров';
------------------------------------------------------
Вот вкратце...
На самом деле у меня система гораздо навороченнее, она сохраняет все
файлы, что юзер закачивал, есть и разные уровни доступа, но этого хватит,
чтобы понять как это работает.
Единственный затык - при частых запросах - нагрузка на базу, именно
потому у меня таблица HEAP сделана, и создается при первом же запросе
если ее нет. Так получается заметный выигрыш в скорости.
Mon, 15 May 2006 18:25:21 +0400
Eugene <my-subscr at mail.ru> писал(а):
> Нужно.
> Пришлите пожалуйста.
>
>
--
AleXXX V. NovikoFF <alexxx at alexxx.ru>
More information about the nginx-ru
mailing list