количество соединений

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