Документация по ОС FreeBSD Воскресенье, 28.04.2024, 08:32
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Apache

lighttpd + mod_uploadprogress [2010]
Потребовалось сделать пользователям сайта возможность аплоадить mp3-файлы. Поскольку речь идет о файлах размером 5-10 MB, а скорость соединения у юзеров неизвестно какое, не помешало бы прикрутить и прогресс-бар. Кроме того, хотелось бы получить достаточно простое решение (т.к. и сам сайт простой на банальном php, да и я не веб-разработчик). И еще чтобы все это вертелось на lighttpd :).

Если бы у нас был Apache, а PHP работал бы как его модуль, то проблема легко решалась бы через расширение php5-uploadprogress. Пример в комлекте с этим расширением заводится с пол-оборота, все просто и понятно. Другой вариант - APC + json. Но у нас lighttpd и PHP в режиме fastcgi, и эти решения для него не подходят.

У lighttpd есть свой mod_uploadprogress, но он доступен только в версии 1.5, которая пока еще в разработке и в портах ее нет. Более того, представленное демо этого модуляна домашней страничке lighttpd вообще не работает :). Примеры, которые там можно скачать, с собранным вручную lighttpd 1.5 у меня тоже не пошли. Возможно что-то изменили в текущей svn-сборке (раз даже демка на сайте не работает), и эти примеры уже не актуальны. А может быть и руки у меня кривые :).

Тем не менее, решение все-таки было найдено. На странице описания mod_uploadprogress упомяналось про патч для версии 1.4.x, который правда ведет себя несколько иначе, но вроде бы уже полгода как стабилен.

Итак, начнем. Менее месяца назад в lighttpd была найдена серьезная уязвимость, поэтому обязательно обновляем порты. После этого выполняем следующие действия:
# cd /usr/ports/www/lighttpd/
# make patch
# cd work/lighttpd-1.4.*/

теперь качаем и накладываем патч:
# wget -O mod_uploadprogress.patch \
labs.logic.cz/patches/lighttpd/1.4.x/lighttpd-1.4.23-mod_uploadprogress.patch
# patch -p1 < mod_uploadprogress.patch

затем выполняем такие команды (они были подсмотрены мною в инструкции по сборке mod_geoip для lighttpd):
# aclocal
# automake -a
# autoconf

и наконец собираем порт:
# cd ../../
# make install clean

Убедимся в успешной сборке и наличии mod_uploadprogress:
# pkg_info -Ex lighttpd
lighttpd-1.4.26
# ls /usr/local/lib/lighttpd/ | grep uploadprogress
mod_uploadprogress.a
mod_uploadprogress.la
mod_uploadprogress.so

Открываем конфиг lighttpd, в секцию server.modules добавляем "mod_uploadprogress", ну и куда-нибдуь в конец пишем:
upload-progress.progress-url = "/progress"
upload-progress.remove-timeout = 30
upload-progress.debug = "enable"

Перезапускаем lighttpd:
# /usr/local/etc/rc.d/lighttpd restart

Рабочий пример прогресс-бара удалось найти тут. В нем используется только html + javascript (JQuery).
Признаком того что модуль вообще работает, должны быть следующие повторяющиемся с определенным интервалом строчки в error.log:
2010-02-22 15:23:15: (mod_uploadprogress.c.448) (uploadprogress) urls /progress == /progress
2010-02-22 15:23:15: (mod_uploadprogress.c.509) connection is known: 5b4d77867be787ee58f81032dbd84ea1 , sending: { "state" : "uploading", "received" : 14623250, "size" : 71456492}

2010-02-22 15:23:17: (mod_uploadprogress.c.448) (uploadprogress) urls /progress == /progress
2010-02-22 15:23:17: (mod_uploadprogress.c.509) connection is known: 5b4d77867be787ee58f81032dbd84ea1 , sending: { "state" : "uploading", "received" : 30229010, "size" : 71456492}

2010-02-22 15:23:19: (mod_uploadprogress.c.448) (uploadprogress) urls /progress == /progress
2010-02-22 15:23:19: (mod_uploadprogress.c.509) connection is known: 5b4d77867be787ee58f81032dbd84ea1 , sending: { "state" : "uploading", "received" : 45826578, "size" : 71456492}

Если при этом не работает прогресс-бар, то здесь уже необходимо работать над совместимостью браузера и java-скриптов. В дальнейшем, чтобы не засорять лог, вывод этой информации можно отключить в конфиге lighttpd, исправив строчку:
upload-progress.debug = "disable"

Вроде бы не сложно. Но в условиях нехватки информации и отсутствии рабочих примеров - далось не легко. Поэтому решил оформить статью.



Источник: http://www.lissyara.su/?id=2080
Категория: Apache | Добавил: oleg (06.03.2010) | Автор: irr
Просмотров: 797 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024