Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> lighttpd + mod_uploadprogress

lighttpd + mod_uploadprogress

Автор: irr.


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

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

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

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

Итак, начнем:

# 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

затем выполняем автоматическую пересборку configure:

# autoreconf

и наконец собираем порт:

# cd ../../
# make install clean

Убедимся в успешной сборке и наличии mod_uploadprogress:

# pkg_info -Ex lighttpd
lighttpd-1.4.30_1
# 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"

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



размещено: 2010-02-22,
последнее обновление: 2012-01-25,
автор: irr


Гость, 2012-04-04 в 15:22:36

Автор! Огромное спасибо за статью!
Поставил на последнюю версию порта 1.4.30 - все работает.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.059 секунд
Из них PHP: 16%; SQL: 84%; Число SQL-запросов: 76 шт.
Исходный размер: 17738; Сжатая: 5395