Сервер под статику и отдача изображений с логикой

Крот

Новичок
Сервер под статику и отдача изображений с логикой

Всем привет.

Есть сервер под статику, на котором даже не стоит php. Работает на веб-сервере lighttpd.
На этом сервере хранятся изображения. Пусть урл конкретного изображения будет http://static.domain.com/a1/file.jpg

Раньше все изображения отдавались as is и никакой логики при отдаче изображения не требовалось.
Времена меняются, и теперь изображения нужно отдавать с логикой (например, проверять разрешил ли пользователь просматривать изображения всем или ограничил доступ к ним по ip). Самое страшное, что урл изображения нужно оставить таким, как оно есть (т.е. по-сути ничего не менять).
Сейчас нагрузка на сервер около 4, кол-во просмотров изображений около 800К в день. В распоряжении Memcached, MySQL (+mysql proxy).

Есть какие-нибудь мысли, как можно прикрутить ко всему этому php (возможно Fast CGI?) и, чтобы не было необходимости менять урл картинок?

Чтобы было понятнее- немного конкретики...
Изображение принадлежит пользователю; изображение принадлежит альбому; альбом также принадлежит пользователю.

1. Пользователь ограничивает доступ в альбом; нужно ограничить доступ к изображениям в этом альбоме (даже если они запрашиваются напрямую).
2. У пользователя закончился период оплаты сервиса; все изображения этого пользователя нужно временно "заблокировать".

Очень интересно было бы послушать мысли зубров; мне в голову ничего кроме fast cgi + (memcached / mysql) не приходит, к сожалению. :(
 

Макс

Старожил PHPClub
Многое зависит от конкретики - как уже реализовано и какие именно планируются ограничения.
Например временную блокировку картинок можно сделать так : cli скриптом раз в XX минут находить всех таких юзеров, и для всех фотоальбомов (если фотоальбом в отдельной папке) переименовывать папку в например blocked-album-xxx. А если у каждого юзера есть своя папка то можно сразу папку юзера переименовать в blocked-$user_id

Тоже самое если юзер ограничивает доступ к фотоальбому - переименовываем его папку в limited-$album_id. И настраиваем веб-сервер так, чтобы если запрашивают http://static.domain.com/a1/file.jpg , а на сервере нет папки a1, но есть limited-a1, то запрос перенаправлялся бы на php fastcgi.
То есть все public-фотки будут отдаваться lighttpd, а те что с пользовательскими ограничениями - с помощью fcgi

PS
вроде в lighttpd можно простую логику на lua реализовывать - можно тоже на вооружение взять
 

zerkms

TDD infected
Команда форума
а кто-то из крупных картинкохостингов так делает?
 

Крот

Новичок
Макс, в принципе решение прикольное и про lua как-то забыл. Но, как ты и сказал - всё зависит от конкретного случая.

Так повелось, что у нас изображения не разбиваются по пользовательским папкам; все изображения хранятся в единой структуре папок... bla/bla/bla/image_id/file.jpg И это очень печально... (На это была своя причина; если интересно - могу рассказать почему так было задумано; хотя сейчас я уже понимаю, что можно было сделать по-другому).



Допустим, у пользователя 500 изображений (другими словами - 500 папок, которые хранятся на 2х статик-серверах, 250 на одном сервере и 250 на другому).

Пользователь запрашивает их удаление (с возможностью восстановления). Апликейшн сервер через SSH2 соединяется со статик серверами и отдаёт каждому из них команду на переименовывание папок. Т.к. изображений много, то и команда получается не короткой и ее приходится разбивать на несколько частей (прям как в случае с масс-insert'ами в MySQL, где есть ограничение на размер SQL запроса)...

Я сейчас буду читать про возможности Lua, посмотрю - может быть получится какой-нибудь внятный модуль для Lighttpd написать. Если там всё ОООЧЕНЬ сложно, то придется заказать у кого-нибудь...


а кто-то из крупных картинкохостингов так делает?
Не уверен :) Точно знаю, что протекция на изображения у крупных хостингов есть. Работает мгновенно. :)
 

Alexandre

PHPПенсионер
если бы использовался бы nginx я бы посоветовал accesskey
думаю, что для лайти тоже есть похожие плагины. Под него модулей не меньше чем под аппач.

если проект претендует на Хи++, то статику должен отдавать вэбсервер без всяких cli прибамбасов
 

Крот

Новичок
Автор оригинала: Alexandre
если бы использовался бы nginx я бы посоветовал accesskey
думаю, что для лайти тоже есть похожие плагины. Под него модулей не меньше чем под аппач.
К сожалению, accesskey немного не то, что нужно, т.к. меняется URL картинки и через него многие фишки не реализовать.

если проект претендует на Хи++, то статику должен отдавать вэбсервер без всяких cli прибамбасов
А вот как тогда реализовывать логику при отдаче статики?
По-любому нужно что-то, что считывает входные параметры, и основываясь на этом (и, возможно, на чем-то еще) решает что дальше делать...

____________________________________________________________________

Вот допустим, пример с ключ-параметром в урле.
/a/b/c/d/file.jpg?key=12345678910

Перед тем, как отдавать - мы идем в /a/b/c/d/super_secret_name.txt и смотрим что там написано, а написано там
12345678910,deleted. Сверяем ключи - совпадают, смотрим статус - deleted. Если статус deleted, то заворачиваем на какую-нибудь deleted.jpg

Это то же самое, что предложил Макс; только в его примере не нужно заморачиваться с чтением файла, что еще и проще по сути дела.

Наверное, это единственный возможный вариант...

-~{}~ 03.11.09 12:06:

А скажите мне пожалуйста - насколько сильно по производительности различаются эти два метода....

1. Ставим на сервер со статикой php, устанавливаем модуль XSendFile и потом с помощью php разруливаем логику (проверка наличия определенных файлов или проверка имени диры).

2. Проверку наличия определнных файлов или проверку имен дир реализуем через модуль веб-сервера, написанный на C.
 

Alexandre

PHPПенсионер
у нас отдача защищенной статики реализована через аццесскей. юзер логинится и если имеет доступ к контенту, то ставится секретная кука и сервер его отдает без проблем: какая еще может быть логика?

А скажите мне пожалуйста - насколько сильно по производительности различаются эти два метода....
раз в минимум 20

мы сделали модуль который отдавал/записывал данные из сервера напрямую, он оказался в 80 раз быстрее чем пхп
 

Крот

Новичок
Автор оригинала: Alexandre
у нас отдача защищенной статики реализована через аццесскей. юзер логинится и если имеет доступ к контенту, то ставится секретная кука и сервер его отдает без проблем: какая еще может быть логика?
Ну например, пользователь не оплатил доступ - мне нужно временно "отключить" все его картинки (т.е. те, которые он сам залил).


раз в минимум 20
Мдэ, тогда модулю скорее всего быть...
 
Сверху