Comments 33
А зачем читать случайные данные из /dev/random? Здесь же не нужен криптографический надежный источник случайных чисел. А так у чтения из /dev/random есть два минуса:
1. Если в системе недостаточно энтропии, чтение из /dev/random может заблокировать вызывающий поток. Думаю, nginx будет не рад :)
2. Лишние файловые операции. Зачем, если можно обойтись?
Ведь здесь хватит и простого random(). Если мучит паранойя — можно захешировать.
1. Если в системе недостаточно энтропии, чтение из /dev/random может заблокировать вызывающий поток. Думаю, nginx будет не рад :)
2. Лишние файловые операции. Зачем, если можно обойтись?
Ведь здесь хватит и простого random(). Если мучит паранойя — можно захешировать.
Я много где спараноил)))
Думаю использовать /dev/urandom — псевдослучайные, видимо к этому придется прийти.
Я читал ман и видел описания функции, так что когда я делал бенчмарк, то специально проверил — ~50Mb в секунду выдает /dev/random, и затыков я не обнаружил.
Хотя может еще конечно и наткнусь.
Если использовать перловый rand(), то время работы увеличивается в 6 раз — только что проверил.
Думаю использовать /dev/urandom — псевдослучайные, видимо к этому придется прийти.
Я читал ман и видел описания функции, так что когда я делал бенчмарк, то специально проверил — ~50Mb в секунду выдает /dev/random, и затыков я не обнаружил.
Хотя может еще конечно и наткнусь.
Если использовать перловый rand(), то время работы увеличивается в 6 раз — только что проверил.
Ну у меня на декстопе /proc/sys/kernel/random/ показывает 180, а /proc/sys/kernel/random/ (сколько бит энтропии надо для разблокировки вызывающего процесса) — 64. Так что значения довольно таки стрёмные.
На сервере количество энтропии может быть ещё меньше — мышки и клавы то нету…
Так что в общем из /dev/random лучше не читать без сильной на то обходимости.
На сервере количество энтропии может быть ещё меньше — мышки и клавы то нету…
Так что в общем из /dev/random лучше не читать без сильной на то обходимости.
А почему не хранить php-сессии в memcached? Вы всегда сможете произвольно управлять данными в сессии из приложения на C++ (в т.ч. создавать новые сессии), и в то же время всё это будет нативно работать в php бэкэндах.
Что касается блокировок при доступе к сессиям в memcached, используйте не pecl-memcached, а pecl-memcache. Там есть и блокировки, и нормальная возможность работы с нескольими memcached-серверами, и проч.
вот так я и не хотел делать, я завязываюсь на определенную архитектуру,
и получается генерация идентификатора (в вашем случае сессии) будет в двух местах.
и получается генерация идентификатора (в вашем случае сессии) будет в двух местах.
Возможно спрошу глупость, но почему не ngx_http_userid_module?
Данный модуль немного по другому работает, он ставит куку уже после отработки бэкенда.
Т.е. он возвращает ее броузеру, а бэкэнд в этот момент ничего не знает о uid. Т.е. первый запрос в бэкэнд будет ошибочен, что не допустимо.
SID присутствует, а uid нет… честно честно модуль userid включен)
Т.е. он возвращает ее броузеру, а бэкэнд в этот момент ничего не знает о 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 ( ) )
>Реализовывать все это я решил средствами Nginx, а точнее его perl'овым модулем.
Это пока что единственный существенный минус решения — данный модуль не вкомпилен по умолчанию, то есть приходится пересобирать nginx:
$ ./configure --with-http_perl_module
Не соглашусь, не нужно руками перекомпиливать nginx, в FreeBSD вы просто ставите галочку что бы собирался с этим модулем, в ubuntu просто ставите пакет nginx-extra с данным модулем, насчет других систем точно не скажу, но думаю тоже есть уже готовые пакеты со всеми сущ. модулями.
Это пока что единственный существенный минус решения — данный модуль не вкомпилен по умолчанию, то есть приходится пересобирать nginx:
$ ./configure --with-http_perl_module
Не соглашусь, не нужно руками перекомпиливать nginx, в FreeBSD вы просто ставите галочку что бы собирался с этим модулем, в ubuntu просто ставите пакет nginx-extra с данным модулем, насчет других систем точно не скажу, но думаю тоже есть уже готовые пакеты со всеми сущ. модулями.
Напишите теперь это в виде модуля к NGINX на C, это проще чем может показаться )
Кстати для nginx есть такой модуль, set-misc-nginx-module, он расширяет набор команд модуля rewrite различными условиями, присваиваниями и функциями. Например можно присвоить переменной случайное число, взять md5 от текущего времени+случайного числа и использовать полученное как идентификатор пользователя. Кстати функцию генерации случайного числа — нужно было для одного проекта, решил не писать с нуля, а дополнить хороший модуль еще одной функцией…
Кстати для nginx есть такой модуль, set-misc-nginx-module, он расширяет набор команд модуля rewrite различными условиями, присваиваниями и функциями. Например можно присвоить переменной случайное число, взять md5 от текущего времени+случайного числа и использовать полученное как идентификатор пользователя. Кстати функцию генерации случайного числа — нужно было для одного проекта, решил не писать с нуля, а дополнить хороший модуль еще одной функцией…
я писал модули для nginx — веселое и интересное занятие)
и надо было и этот написать!
времени займет один-два дня — если есть опыт, если его нет — то приобретете что-то более ценное, чем потраченное время.
времени займет один-два дня — если есть опыт, если его нет — то приобретете что-то более ценное, чем потраченное время.
А что вы храните в сессии пользователя на сервере? Неужели это нельзя хранить у самого пользователя в cookie?
А если ip юзера сменится?
в текущей реализации будет новый индетификатор, его можно убрать из процедуры генерации. в моей системе это критично.
> Так как запрос к плюсовому серверу может быть раньше запроса к php-бэкенду, я так и не смог придумать/найти удобную, быструю, а самое главное красивую реализацию идентификации пользователя по PHPSESSID.
В этом случае плюсовый сервер может просто позвать php-бэкенд и спросить PHPSESSID, разве нет?
В этом случае плюсовый сервер может просто позвать php-бэкенд и спросить PHPSESSID, разве нет?
нет.
смысл не в том, чтобы узнать PHPSESSID, а в том чтобы и php-бэкенд и плюсовый сервер идентифицировали пользователя идентичным идентификатором идентификации :)
смысл не в том, чтобы узнать PHPSESSID, а в том чтобы и php-бэкенд и плюсовый сервер идентифицировали пользователя идентичным идентификатором идентификации :)
Смысл я понял. Вы сначала хотели использовать в качестве такого идентификатора PHPSESSID, но споткнулись на процитированной проблеме и стали искать другие пути. Я предложил вам решение этой проблемы.
Как я понял…
Плюсовый код, если у него не выставлена сессия должен
грузить, что то типа 127.0.0.1/start_session.php,
где ему будет возвращаться PHPSESSID,
и он его будет ставить в куки текущего соединения.
По мне так решение должно быть красивым и максимально быстрым.
Но тут ни того ни другого, но суть даже не в этом —
если я уйду вообще от php и такого понятия как PHPSESSID в моей системе больше не будет, в вашем случае мне все равно придется писать аналогичный код.
Но все равно спасибо и с праздником.
Плюсовый код, если у него не выставлена сессия должен
грузить, что то типа 127.0.0.1/start_session.php,
где ему будет возвращаться PHPSESSID,
и он его будет ставить в куки текущего соединения.
По мне так решение должно быть красивым и максимально быстрым.
Но тут ни того ни другого, но суть даже не в этом —
если я уйду вообще от php и такого понятия как PHPSESSID в моей системе больше не будет, в вашем случае мне все равно придется писать аналогичный код.
Но все равно спасибо и с праздником.
>если я уйду вообще от php и такого понятия как PHPSESSID
а что уже в планах?
вопросы:
1) а какую роль играет плюсовой сервер?
2) почему выбран FastCGI, SCGI проще в реализации и быстрее
3) какие сетевые либы используешь в плюсовом сервере, как построена сетевая часть?
4) возможность масштабирования твоей системы?
а что уже в планах?
вопросы:
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) на первом месте стоит производительность, на втором масштабируемость.
я фанат плюсов, было бы побольше времени в сутках написал бы все на плюсах)))
давайте напишем сайт на 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 лет, по этому на своей шкуре прекрасно знаю, что такое: выбрали именно эту технологию потому-что… её хорошо знает мой начальник, а потом разгребаем…
меня интересуют всякого рода подобные штучки, так как сам пишу их в онном количестве
так что, поделись секретом тен-на-тет
>2) не вижу очень уж большой разницы. Если я не ошибаюсь SCGI бинарный, но нет нативной поддержки nginxа (есть модули вроде).
существует поддержка во всех современных WEB серверах: Апач, Энджи, Лайти
я написал по этому случаю либу, очень дружит с nginx. Именно для таких всяких нестандартных штучек, правда в настоящий момент она усовершенствуется.
> 4) на первом месте стоит производительность, на втором масштабируемость.
Одно не далеко ушло от другого. Правда многое зависит от особенностей проекта, но потенциал масштабируемости должен быть заложен.
> я конечно люблю пых, но есть очень прикольная серия статей www.insight-it.ru/highload/ один из смыслов которой «мы использовали пых, потому что так сложились обстоятельства».
Я люблю пых уже более 10 лет, по этому на своей шкуре прекрасно знаю, что такое: выбрали именно эту технологию потому-что… её хорошо знает мой начальник, а потом разгребаем…
У себя на проекте в интересах кастомной системы статистики мы uid генерили пыхом и отдавали в заголовках, а nginx потом это в access_log писал. Но у нас конечно же не было плюсового бэкенда.
Sign up to leave a comment.
Генерация уникального идентификатора пользователя средствами Nginx