Pull to refresh

Comments 33

А зачем читать случайные данные из /dev/random? Здесь же не нужен криптографический надежный источник случайных чисел. А так у чтения из /dev/random есть два минуса:
1. Если в системе недостаточно энтропии, чтение из /dev/random может заблокировать вызывающий поток. Думаю, nginx будет не рад :)
2. Лишние файловые операции. Зачем, если можно обойтись?

Ведь здесь хватит и простого random(). Если мучит паранойя — можно захешировать.
Я много где спараноил)))
Думаю использовать /dev/urandom — псевдослучайные, видимо к этому придется прийти.

Я читал ман и видел описания функции, так что когда я делал бенчмарк, то специально проверил — ~50Mb в секунду выдает /dev/random, и затыков я не обнаружил.
Хотя может еще конечно и наткнусь.

Если использовать перловый rand(), то время работы увеличивается в 6 раз — только что проверил.
Ну у меня на декстопе /proc/sys/kernel/random/ показывает 180, а /proc/sys/kernel/random/ (сколько бит энтропии надо для разблокировки вызывающего процесса) — 64. Так что значения довольно таки стрёмные.
На сервере количество энтропии может быть ещё меньше — мышки и клавы то нету…

Так что в общем из /dev/random лучше не читать без сильной на то обходимости.
В FreeBSD видимо своя магия /dev/random.
Думаю на сервере основной генератор энтропии все же сетевуха.

ну я думаю из urandom достаточно будет
А почему не хранить php-сессии в memcached? Вы всегда сможете произвольно управлять данными в сессии из приложения на C++ (в т.ч. создавать новые сессии), и в то же время всё это будет нативно работать в php бэкэндах.
Что касается блокировок при доступе к сессиям в memcached, используйте не pecl-memcached, а pecl-memcache. Там есть и блокировки, и нормальная возможность работы с нескольими memcached-серверами, и проч.
вот так я и не хотел делать, я завязываюсь на определенную архитектуру,
и получается генерация идентификатора (в вашем случае сессии) будет в двух местах.
Данный модуль немного по другому работает, он ставит куку уже после отработки бэкенда.
Т.е. он возвращает ее броузеру, а бэкэнд в этот момент ничего не знает о uid. Т.е. первый запрос в бэкэнд будет ошибочен, что не допустимо.

SID присутствует, а uid нет… честно честно модуль userid включен)

<?
print_r($GLOBALS);
?>


Array
(
    [GLOBALS] => Array
 *RECURSION*
    [_POST] => Array
        (
        )

    [_GET] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )

    [_SERVER] => Array
        (
            [PHP_FCGI_MAX_REQUESTS] => 1000
            [PHP_FCGI_CHILDREN] => 5
            [USER] => www
            [PATH] => /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin
            [FCGI_ROLE] => RESPONDER
            [SCRIPT_FILENAME] => /usr/local/nginx/html/www//index.php
            [QUERY_STRING] => 
            [REQUEST_METHOD] => GET
            [CONTENT_TYPE] => 
            [CONTENT_LENGTH] => 
            [SCRIPT_NAME] => /index.php
            [REQUEST_URI] => /index.php
            [DOCUMENT_URI] => /index.php
            [DOCUMENT_ROOT] => /usr/local/nginx/html/www
            [SERVER_PROTOCOL] => HTTP/1.1
            [GATEWAY_INTERFACE] => CGI/1.1
            [SERVER_SOFTWARE] => nginx/1.1.12
            [REMOTE_ADDR] => 127.0.0.1
            [REMOTE_PORT] => 60816
            [SERVER_ADDR] => 127.0.0.1
            [SERVER_PORT] => 80
            [SERVER_NAME] => localhost
            [REDIRECT_STATUS] => 200
            [SID] => adb95450d71c9cbd5f1ecc97343256e19401c78b586585c3e969cc882a12744c
            [HTTP_HOST] => 62.109.16.240
            [HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23 s024vp
            [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
            [HTTP_ACCEPT_LANGUAGE] => ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
            [HTTP_ACCEPT_ENCODING] => gzip,deflate
            [HTTP_ACCEPT_CHARSET] => windows-1251,utf-8;q=0.7,*;q=0.7
            [HTTP_KEEP_ALIVE] => 115
            [HTTP_CONNECTION] => keep-alive
            [PHP_SELF] => /index.php
            [REQUEST_TIME] => 1325859793
        )

    [_ENV] => Array
        (
        )

    [_REQUEST] => Array
        (
        )

)


fastcgi_param UID $uid_set;

так тоже не работает?
не работает, передает пустой параметр в backend

я бился с этим модулем какое-то время, так и не получилось заставить его делать что мне надо. к великому моему сожалению.
Да, странный модуль, работает как фильтр даже после SSI-модуля.
Похоже, с его помощью можно только логгировать посетителей.
Надо Сысоеву написать, чтоб переделал, либо тут какая-то скрытая магия))
>Реализовывать все это я решил средствами Nginx, а точнее его perl'овым модулем.
Это пока что единственный существенный минус решения — данный модуль не вкомпилен по умолчанию, то есть приходится пересобирать nginx:
$ ./configure --with-http_perl_module

Не соглашусь, не нужно руками перекомпиливать nginx, в FreeBSD вы просто ставите галочку что бы собирался с этим модулем, в ubuntu просто ставите пакет nginx-extra с данным модулем, насчет других систем точно не скажу, но думаю тоже есть уже готовые пакеты со всеми сущ. модулями.
я просто из сорцов последнюю версию собирал
Напишите теперь это в виде модуля к NGINX на C, это проще чем может показаться )
Кстати для nginx есть такой модуль, set-misc-nginx-module, он расширяет набор команд модуля rewrite различными условиями, присваиваниями и функциями. Например можно присвоить переменной случайное число, взять md5 от текущего времени+случайного числа и использовать полученное как идентификатор пользователя. Кстати функцию генерации случайного числа — нужно было для одного проекта, решил не писать с нуля, а дополнить хороший модуль еще одной функцией…
я писал модули для nginx — веселое и интересное занятие)
и надо было и этот написать!
времени займет один-два дня — если есть опыт, если его нет — то приобретете что-то более ценное, чем потраченное время.
я не думаю, что на каждую идею надо писать модуль и тем более я не думаю, что выигрыш по производительности будет колоссальный, я даже думаю он будет значительно меньше, чем кажется.

когда я еще начинал кодить, мне тоже казалось что все быстрые программки надо писать в виде LKM.

peace — V
А что вы храните в сессии пользователя на сервере? Неужели это нельзя хранить у самого пользователя в cookie?
в текущей реализации будет новый индетификатор, его можно убрать из процедуры генерации. в моей системе это критично.
А не хотите добавить еще HTTP_ACCEPT заголовок в юзер агенту для идентификации?
с каких полей брать дайджест зависит от требований системы, но не следует параноить еще сильнее меня
> Так как запрос к плюсовому серверу может быть раньше запроса к php-бэкенду, я так и не смог придумать/найти удобную, быструю, а самое главное красивую реализацию идентификации пользователя по PHPSESSID.

В этом случае плюсовый сервер может просто позвать php-бэкенд и спросить PHPSESSID, разве нет?
нет.
смысл не в том, чтобы узнать PHPSESSID, а в том чтобы и php-бэкенд и плюсовый сервер идентифицировали пользователя идентичным идентификатором идентификации :)

Смысл я понял. Вы сначала хотели использовать в качестве такого идентификатора PHPSESSID, но споткнулись на процитированной проблеме и стали искать другие пути. Я предложил вам решение этой проблемы.
Как я понял…
Плюсовый код, если у него не выставлена сессия должен
грузить, что то типа 127.0.0.1/start_session.php,
где ему будет возвращаться PHPSESSID,
и он его будет ставить в куки текущего соединения.

По мне так решение должно быть красивым и максимально быстрым.
Но тут ни того ни другого, но суть даже не в этом —
если я уйду вообще от php и такого понятия как PHPSESSID в моей системе больше не будет, в вашем случае мне все равно придется писать аналогичный код.

Но все равно спасибо и с праздником.
>если я уйду вообще от php и такого понятия как PHPSESSID
а что уже в планах?

вопросы:
1) а какую роль играет плюсовой сервер?
2) почему выбран FastCGI, SCGI проще в реализации и быстрее
3) какие сетевые либы используешь в плюсовом сервере, как построена сетевая часть?
4) возможность масштабирования твоей системы?
не то чтобы прям в планах, но есть такая тенденция, которая мне не нравится:
давайте напишем сайт на php, прикрутим nginx, php-fpm, eaccelator, hip-hop, memcache и т.д. и т.п.

я конечно люблю пых, но есть очень прикольная серия статей www.insight-it.ru/highload/ один из смыслов которой «мы использовали пых, потому что так сложились обстоятельства».

1) там такая штука большая и ИМХО прикольная, я потом отдельно статью напишу.
2) не вижу очень уж большой разницы. Если я не ошибаюсь SCGI бинарный, но нет нативной поддержки nginxа (есть модули вроде). Но я почитаю, обещаю.
3) libfcgi, boost::asio
4) на первом месте стоит производительность, на втором масштабируемость.

я фанат плюсов, было бы побольше времени в сутках написал бы все на плюсах)))

> 1) там такая штука большая и ИМХО прикольная, я потом отдельно статью напишу
меня интересуют всякого рода подобные штучки, так как сам пишу их в онном количестве
так что, поделись секретом тен-на-тет
>2) не вижу очень уж большой разницы. Если я не ошибаюсь SCGI бинарный, но нет нативной поддержки nginxа (есть модули вроде).
существует поддержка во всех современных WEB серверах: Апач, Энджи, Лайти
я написал по этому случаю либу, очень дружит с nginx. Именно для таких всяких нестандартных штучек, правда в настоящий момент она усовершенствуется.
> 4) на первом месте стоит производительность, на втором масштабируемость.
Одно не далеко ушло от другого. Правда многое зависит от особенностей проекта, но потенциал масштабируемости должен быть заложен.

> я конечно люблю пых, но есть очень прикольная серия статей www.insight-it.ru/highload/ один из смыслов которой «мы использовали пых, потому что так сложились обстоятельства».
Я люблю пых уже более 10 лет, по этому на своей шкуре прекрасно знаю, что такое: выбрали именно эту технологию потому-что… её хорошо знает мой начальник, а потом разгребаем…
У себя на проекте в интересах кастомной системы статистики мы uid генерили пыхом и отдавали в заголовках, а nginx потом это в access_log писал. Но у нас конечно же не было плюсового бэкенда.
посмотрите в сторону nginx_http_userid_module, если я Вас правильно понял, он делает именно то что вам надо
Sign up to leave a comment.

Articles