*nix

индекс
298,30

nginx и приятности

А помнишь, как все начиналось?


А начиналось всё очень прозаично, назрела проблема создания локального зеркала для eset 3 ветки, зеркало для 2-го тогда уже давно функционировало. Было раннее утро и желание заниматься чем-то монотонным тогда отсутствовало напрочь. Бывает такое, ну Вы знаете, да?

Расположение наших войск.


На сервере стоял (и стоит, и стоять будет, тьфу-тьфу) nginx, оный очень шустро отдаёт статику клиенту, потому что… ой да не буду я рассказывать, как он работает, на то есть google://. Так вот, сервер в интранете, живет под OpenBSD, nginx был 0.7.14, последний, на момент желания «а я новенький хочу», оказался 0.7.21, его и взял. И очень-очень захотелось отдавать юзерам листинг директории /eset_upd/ в браузер, но обычный у nginx довольно уныл. Красивости!


Копаем, шеф!


Копать, конечно же, надо было в Google. Про nginx существует очень хорошая вики – http://wiki.codemongers.com/. Идём на http://wiki.codemongers.com/NginxNgxFancyIndex, смотрим — радуемся, fancyindex называется модуль (https://connectical.com/news/13 — git, спасибо deniszh ).
Распаковываем nginx-0.7.21.tar.gz в текущую директорию:

$ tar zxvf nginx-0.7.21.tar.gz

Наблюдаем как оно всё распаковалось.

$ cd nginx-0.7.21/

Хорошее правило — всегда сначала набирать configure --help и медленно вдумчиво смотреть какие флаги могут быть переданы.

$ ./configure --help

Посмотрели, записали. Мой набор таков:

$ ./configure --conf-path=/etc/nginx.conf --pid-path=/var/run/nginx.pid --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx-error.log --http-client-body-temp-path=/var/spool/nginx/client_body_temp --http-fastcgi-temp-path=/var/spool/nginx/fastcgi_temp --http-proxy-temp-path=/var/spool/nginx/proxy_temp --user=_www-data --group=_www-data

user и group можете выставить по своему желанию, Вы же знаете какие у Вас юзеры и группы существуют в системе, да? ;-) А так же обязательно проверьте все пути.

Запускаем, это пока проверочный configure без подключения модуля. Создался Makefile? Если да — самое время попробовать собрать с модулем, если нет – читаем google на предмет ошибок. Распаковываем модуль рядом с nginx-0.7.21:

$ bunzip2 < nginx-fancyindex-0.1_beta5.tar.bz2 | tar xvf -

теперь ещё раз запускаем configure у nginx, но на этот раз добавляем флаг —add-module и указываем путь к директории с модулем:

$ ./configure --conf-path=/etc/nginx.conf --pid-path=/var/run/nginx.pid --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx-error.log --http-client-body-temp-path=/var/spool/nginx/client_body_temp --http-fastcgi-temp-path=/var/spool/nginx/fastcgi_temp --http-proxy-temp-path=/var/spool/nginx/proxy_temp --user=_www-data --group=_www-data --add-module=../nginx-fancyindex-0.1_beta5

Отработала команда? Отлично. Копаем дальше:

$ make

Ой, что-то не так…

gcc -c -O -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wno-unused-function -Wunused-variable -Wunused-value -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I /usr/local/include -I objs -I src/http -I src/http/modules -I src/mail -o objs/addon/nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.o ../nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c
../nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c: In function `make_content_buf':
../nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c:429: warning: implicit declaration of function `ngx_utf_length'
../nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c:430: warning: signed and unsigned type in conditional expression
../nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c:571: warning: implicit declaration of function `ngx_utf_cpystrn'
../nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c:571: warning: assignment makes pointer from integer without a cast
*** Error code 1
Stop in /home/fd/sources/nginx-0.7.21 (line 986 of objs/Makefile).
*** Error code 1
Stop in /home/fd/sources/nginx-0.7.21 (line 3 of Makefile).


Шеф, всё пропало!


Нет-нет, не всё так ужасно, просто fancyindex не может корректно собраться с nginx 0.7.* ветки без патча.
Правильно, google://. http://www.lexa.ru/nginx-ru/msg18958.html и забираем патч, кладём его рядом с nginx-fancyindex-0.1_beta5 в, ну скажем, patch, и командуем магическое

$ patch -p0 < patch

видим:

Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ru nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c
|nginx-fancyindex-0.1_beta5-patched/ngx_http_fancyindex_module.c
|--- nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c 2007-09-29
|01:02:05.000000000 +0400
|+++ nginx-fancyindex-0.1_beta5-patched/ngx_http_fancyindex_module.c
|2008-08-11 17:33:42.810249087 +0400
--------------------------
Patching file nginx-fancyindex-0.1_beta5/ngx_http_fancyindex_module.c using Plan A...
Hunk #1 succeeded at 290.
Hunk #2 succeeded at 426.
Hunk #3 succeeded at 563.
done


Пропатчилось. Если у Вас не пропатчилось – проверьте ещё раз пути и почитайте man patch. Ещё раз make:

$ make

Собралось, ставим.

$ sudo make install

Ну и осталось только в конфиге nginx указать для нужной директории

location /eset_upd/ {
fancyindex on;
fancyindex_exact_size off;
}


Итог:


_________
Текст подготовлен в ХабраРедакторе


P.S. к страждущим. tar jxvf у меня не работает :) и pentium 133 c 48 мозгов :)
+31
13 ноября 2008, 17:12
33

комментарии (85)

+2
phpdude #
проще бы cgi настроил и на пхп 5 строк или на perle. зато куда гибче, да и не думаю что ваш сервер десятки тысяч клиентов держит, чтобы нгинкс так нужен был для такой задачи) а так, конечно познавательно. кстати я вот думаю, что можно было сделать хедер и футер для листингов. и тогда, даже унылоге гавнецо вида pub.2315.ru/ приобрело бы хороший вид и цвет.
+7
freefd #
всё прекрасно, да, только страшная тайна в том, что данная машинка — pentium 133 c 48 мозгов. и perl + cgi для него было бы очень тяжело, а вот nginx буквально выстреливает :)
ищите варианты :)
+5
phpdude #
ахренеть. с этого и надо было начинать статью ))))))
ну тогда, это конечно решение :))
0
bolk #
Зачем же CGI? В nginx Perl может встраиваться.
0
freefd #
да, Евгений, но мне это решение видится более простым, нежели использовать скрипты для элементарного листинга директории.
0
bolk #
Не спорю, решение проще и экономичнее в плане ресурсов. Я только хотел добавить в копилку знаний новую монетку.
0
freefd #
я читал документацию, спасибо :)
0
bolk #
Тогда бы вы знали, что nginx CGI не поддерживает ;)
0
freefd #
как nginx + fcgi-wrapper поддерживает, очень даже :)
может на днях и напишу.
0
bolk #
Это эмуляция. Это всё равно что сказать, nginx поддержвает Befunge, потому что есть модуль для Perl.
0
ubique #
Никто не мешает использовать nginx + fpm
0
bolk #
Вы имеете ввиду php-fpm? Патч для PHP? Это FastCGI (про подробности работы FastCGI писать не нужно, я в курсе).
+1
sotakone #
ITT: учимся распаковывать архивы, компилить и патчить исходники.
НЛО прилетело и опубликовало эту надпись здесь
+4
sotakone #
Ох, прошу прощения, сразу не обратил внимания. Конечно, процесс сборки nginx под OpenBSD кардинально отличается от сборки оного под другие платформы. Мне, кстати, нужно собрать nginx под Ubuntu, Debian, FreeBSD и Solaris, да все никак статей не дождусь. Никто не напишет?
НЛО прилетело и опубликовало эту надпись здесь
+2
freefd #
платформа и ось здесь не имеют значения. просто хотелось донести до людей на конкретном примере, что в *nix мире проблемы имеют решение, а то при малейших коллизиях люди в панике бегут в форумы с ужасом в глазах и, уже там, сингулярным разумом ищут решение.
а надо всего лишь google + немного терпения.
ну а пример… просто пример из жизни. да может и пригодится кому :)
0
homm #
Мне всегда казалсь, что гугл — это такой поисковый механизм по всяким форумам, куда все бегут с ужасом в глазах. Вы же не думаете, что он самодостаточен?
0
freefd #
я думаю, что он — часть того действа, которая позволяет не создавать кучу однотипных сообщений в форумах, а сначала немного посидеть почитать, вдруг это уже кто-то спрашивал ранее и «эти грабли известны».
+1
rawing #
google — часть той силы, что вечно хочет зла и вечно совершает благо :-)
–1
Caesar #
мне одному показалось, что в описании этого блога написано «для профессионалов».

я правильно понимаю, что вы их только что зачислили в ряды людей с сингулярным разумом, с ужасом в глазах ищущих решение на форумах?

при всём уважении, мне тоже кажется, что статью можно было сократить до одного или двух коротеньких абзацев.
+1
freefd #
сократите, я не против.
–1
DOKA #
Вот за что я не люблю установку из исходных кодов: сначала целая история поставить, а потом подводные камни при обновлении…
0
alexeym #
потому как ./configure && make && make install && make clean — ламерский подход

нужно всегда собирать пакеты под свою систему. в том же стиле, что уже собранные.
+2
freefd #
Вы предлагаете продолжать писать на хабр статьи про
как поставить exaile через aptitude
?
а потом все кричат, что хабр уже не тот…
+3
alexeym #
нет. я ничего не предлагал
я читайте внимательней

я имел ввиду ставить «exaile» собрав пакет deb из исходников и устанавливать его через dpkg.
+1
ubique #
Абсолютная чушь про ламерский подход.
Зачастую, других вариантов собрать что-либо просто нет.
Конечно, желательно, из всего этого создать пакет для своей системы, чтобы им можно было управлять через штатный менеджер пакетов. Но тем не менее, метод это жил и будет всегда жить.
НЛО прилетело и опубликовало эту надпись здесь
0
DOKA #
У меня на домашнем роутере отлично крутились и iptables, и squid, и webmin, и ещё я юзал консоль. И тоже был Pentium 133 MHz. Памяти правда было не 48, а 64, но не суть. ОС была Debian Sarge.
НЛО прилетело и опубликовало эту надпись здесь
+3
stoune #
и не зря. За несколько часов, сервер был поломан, 2/3 ядра было подменено на своё и запущены сэрвисы по рассылке спама и прочая гадость. Спасло только то что «сервер» был подобран под исполняемые задачи и имел всего 256 Мб мозгов, в результате ОС при нехватке памяти вигрузила с ёё взгляда всё «лишнее». Лишними оказались сетевые сервисы и машина умерла как сетевой хост. Если админ не способен выучить два десятка команд и работать с ssh, пусть полем его деятельности остаётся домашняя WinXP машина. Возможно есть более надёжные системы, чем webmin но приняв систему после предыдущего админа в таком состоянии, я сам не повторю его ошибки и другому закажу.
0
ubique #
Простите, а что значит «2/3 ядра было подменено»? :)
0
stoune #
модули подменены на модифицированные. В результате на нормальной по производительности машинке администратор и не заметит подвоха. В логи не ведётся ничего утилиты статистики никогда не покажут демоны вредителя. rootkit
0
ubique #
Ого( А как Вы догадались?
0
freefd #
в результате ОС при нехватке памяти вигрузила с ёё взгляда всё «лишнее». Лишними оказались сетевые сервисы и машина умерла как сетевой хост.


это уже само по себе подозрительно :)
0
ubique #
Не особо подозрительно…
Бывает так, что когда машине не хватает памяти, она начинает свапиться, а когда свап кончается… ребут только по питанию)
0
hazg #
>> Возможно есть более надёжные системы, чем webmin
ssh, других нет. на машине смотрящей наружу, никаких webmin быть не должно. Это не зло — это просто дыра огромная.
+2
freefd #
samba + dhcpd + nginx + squid + bnetd + pf… продолжать?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
–1
DOKA #
Ну и у меня dhcp раздавал, и тоже был расшаренный раздел, дублирующий содержимое vsftpd. Просто к чему это? Вы хотите померяться длиной?
+2
freefd #
вовсе нет, в сущности мне всё равно :)
+1
alexeym #
собрать пакет и установить самому. про это я говорил
./configure && make && make install && make clean применять только в крайнем случае (например, когда нет времени)

и я не говорил о репозитариях

>pentium 133 c 48 мозгов — это ключевая фраза

из вики про gentoo:
«Хотя основной мотив использования Gentoo Linux — увеличение скорости работы системы за счёт оптимизации под конкретное аппаратное обеспечение, прирост производительности более ощутим на современных компьютерах. При этом компиляция системы на старом процессоре может занять до недели чистого машинного времени. Это имеет простое объяснение: чем старше процессор — тем ближе его набор инструкций к стандартному минимальному, а выигрыш в производительности достигается в основном за счёт использования более мощных инструкций новых процессоров. Для старых процессоров может быть разумнее устанавливать кросс-компилированные пакеты, т. е. бинарные пакеты, предварительно скомпилированные на более мощной системе.»
НЛО прилетело и опубликовало эту надпись здесь
+1
Eklykti #
Оптимизация в gentoo заключается не только в сборке под проц, а и в отключении ненужных USE-флагов.
0
alexeym #
Вы много раз запускаете одну и то же приложение..?
+1
stoune #
«более мощных инструкций новых процессоров» их хорошо умеет испольсовать например Intel C++, а вот у gcc с оптимизацией не очень хорошо, особенно для ветки 3.х, для athlon XP и для core2 duo он генерирует одинаковый код. Прирост достигается в значительной мере за счёт щначительно большей тактовой частоты и качественной реализации конверееризации + значительно улучшенная подсистема памяти. Это если например сравнить с поколением pentium 133
0
Caesar #
в тех случаях когда оправдано использование OpenBSD или, упаси аллах, NetBSD, обычно и сборка из сорцов может объясняться производственной необходимостью.

хотя способ с созданием общепринятого формата пакетов под свою систему, представленный ниже, и решает частично проблему установки-удаления, но с обновлением особо не поможет — ибо сильно кастомный пакет для каждого обновления один хрен придется пересобирать.
0
phpdude #
чуток не в тему, но про nginx. думаю, что может помочь кому нить это решение.

0
phpdude #
phpdude.ru/archives/120
0
unst #
а может лучше перенести в habrahabr.ru/blogs/nginx/
0
foo #
Думаю, что не нужно.
НЛО прилетело и опубликовало эту надпись здесь
0
AstonMartin #
а в чем фишка указывать все эти параметры на этапе configure, а не в самом конфиге Nginx-а?
+2
merlin_rterm #
А это тру юникс вей. Захотел поменять конфиг — изволь перекомпилировать. Захотел, чтобы разные листинги были разного цвета — изволь патчить.
0
chegivara #
В чём смысл статьи? показать как ты собирал nginx?
НЛО прилетело и опубликовало эту надпись здесь
+3
freefd #
ну так не читайте :) вот там где-то рядом есть aptitude и deb. я не вижу трудностей просто не читать, если не нравится. ой ладно… толку мне распинаться…
0
stoune #
Не Debian единым. Для новчиков может быть как раз то.
+2
freefd #
полагаю, статья не расчитана на новичков, всё же.
+1
chegivara #
Что же вы накинулись, я просто спросил. Спасибо, что местные гуру Unix указали мне на значимость статьи)), теперь я в курсе о гибкости Unix систем.
0
rawing #
имхо. Основная ценность стататьи — это образ мышления автора и способность его в конкретной ситуации выбирать конкретное, лучшее из возможных, решение.
+1
null #
Написано интересным языком. Было интересно прочитать, хоть и особо ничего нового не узнал.
Но все равно спасибо, надеюсь, в дальнейшем поведуете о чем-нибудь более интересном :)
+1
freefd #
спасибо :) идеи некоторые есть, но пока промолчу.
–4
odessky #
Статья для нубов

Олдфаг freefd, люто реквестирую ramfs с busybox+uclibc+nginx
С меня интернеты и тонны нефти
НЛО прилетело и опубликовало эту надпись здесь
0
odessky #
Ты так говоришь, как будто это что-то плохое
0
foo #
Брысь на двач, дорогой.
0
odessky #
Ты ошибся, %username% я просто начитался лохоморья. На самом деле я из Блогистана.

0
freefd #
будет время и желание — обязательно напишется. меня давно привлекали embedded системы.
+1
AlexeyK #
Ждем статей по пересборке ядра и толп новичков с вопросами :)
НЛО прилетело и опубликовало эту надпись здесь
0
AlexeyK #
Даже удаленно
НЛО прилетело и опубликовало эту надпись здесь
0
AlexeyK #
Что за придирки, хотите проверить?
+2
silentroach #
для пользователей Gentoo — nginx с модулем fancyindex можно найти в оверлее connectical.
+1
B_dot #
> OpenBSD, nginx был 0.7.14

Мсье знает толк в извращениях. :)
+1
freefd #
дак отож ;)
0
agl666 #
уважаемый freefd, а не подскажете как можно сделать зеркало для нода под nix? видел что-то подобное на руборде, но там написано не для обновления с конечных клиентов
0
freefd #
для второй ветки писал скрипт сам, позже обленился и вот :)
0
agl666 #
спасибо! у меня как раз убунту сервер :)
0
freefd #
пожалуйста.
0
Nebulosa #
Я вот тоже написал скриптец на php, поставил это дело на роутер раздаю через nginx…
wl500g.info/showthread.php?p=115456#post115456
При копировании пути поправте, там для роутера ж…

P.S. MemTotal: 30164 kB, BogoMIPS: 263.78 (МГц), ~1500 хостов. :)
+1
deniszh #
По ссылке ngx_fancyindex не качается, но на сайте можно взять новую версию из git — см. https://connectical.com/news/13 — она без патчей собирается с 0.7 и 0.8 ветками nginx
0
freefd #
это хорошо, что модуль до сих пор живёт и развивается :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.