ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



В общем есть апач на бэкэнде, на нем собственно сайт болтается и он же
выполняет авторизацию.

Часть конфига:

------------------------------------------------------
........
        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@xxxxxxx> писал(а):

> Нужно.
> Пришлите пожалуйста.
> 
> 

-- 
AleXXX V. NovikoFF <alexxx@xxxxxxxxx>




 




Copyright © Lexa Software, 1996-2009.