@ Карта сайта News Автора!

Bog BOS: INN (news-сервер в стандарте NNTP)

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

Последнее изменение текста: 19991115
Скопировано с www.bog.pp.ru: 2024.03.29

Bog BOS: INN (news-сервер в стандарте NNTP)

INN (news-сервер в стандарте NNTP)

Ссылки:


Общая картина

Основной процесс - innd. Крутится все время, ожидая и принимая поток статей по NNTP от соседей, пропуская через фильтры. Ведет список групп (active), список статей (history, history index), сами статьи (spool), базу заголовков статей - overview(.NOV), пакеты статей для рассылки соседям (batch), журналы. Для управления работой innd "на ходу" (добавление/удаление групп/статей/соседей, изменение параметров работы и т.д.) служит программа ctlinnd. При получении соединения не от соседа, а от клиента (для чтения статей), запускается nnrpd, который может только читать из баз данных. Для буферизации доступа к active используется actived. Чтобы послать статью он (м.б. пропуская ее через фильтр) запускает inews, который взаимодействует с innd (только innd может писать в базы данных). Базу данных overview ведет программа overchan. Удалением старых статей занимаются expire и expireover (для overview), которые не прерывают работу innd (разве что на минуточку). Накопленный пакет для рассылки статей соседям рассылается innxmit (подготавливается nntpsend) или с помощью innfeed без образования пакетов. innwatch присматривает за использованием ресурсов (диск, CPU) и в случае перегрузки останавливает innd. Обработка журналов: cron ежедневно запускает news.daily, который запускает expire (который готовит список статей для удаления и правит active и history; реальное удаление происходит с помощью fastrm), scanlogs (rotate logs и запуск innreport).

Картинка от Елены Самсоновой.


Управляющие сообщения

Представляет собой обычную статью, в обычной группе, имеющую заголовок "Control:". Встретив такую статью, innd обрабатывает команду и сохраняет статью:

Сообщения запоминаются в псевдогруппе control (включается в active). Если создать подгруппу control.имя-команды, то все соответствующие статьи будут помещаться в эту подгруппу (очень рекомендуется создать control.cancel, control.newgroup, control.rmgroup, control.checkgroups).


Отличия 2.2.1 от 1.5.1


Установка INN 1.5.1/Solaris 2.5

Установка inn 1.5.1 (Solaris 2.5, perl 5.0.3 (у меня 4.0.1.8, в дальнейшем заменен на 5.005_02); tcl 7.4 (7.5 не работает) - у меня, по-моему, 7.3 (в дальнейшем заменен на 8.0); pgp (не установлен):

  1. создаем группу news, group id (например) 300, добавляю себя в список членов группы (удобства ради ;)
  2. создаем пользователя news, user id (например) 300, primary group - 300, secondary - sys (а надо ли?), shell - /bin/sh, account locked (на всякий случай), домашняя директория - /home/news
  3. копируем в /home/news inn-1.5.1.tar.gz и развертываем его.
  4. печатаем руководство по установке:
    groff -mgs Install.ms.1 | ps2pcl | lp
    groff -mgs Install.ms.2 | ps2pcl | lp
  5. строим subst
    1. проверяем, что у нас нормальный sed:
      cd config
      cp config.dist config.data
      make sedtest

      увы :( у нас sed дефективный (Solaris 2.5 - это называется солидная фирма!)
    2. можно, конечно, взять sed из GNU, но я не стал
    3. компилируем C-шную версию:
      cd config
      cp config.dist config.data
      make c quiet

      вроде работает
  6. редактируем config.data: файл состоит из строк вида:
    параметр<одна или более табуляция>значение
    если значение пусто, то табуляция все равно д.б.
    # комментарий
    показаны только отклонения от поставляемой конфигурации (под BSD)
  7. В этом чертовом Солярисе poll работает не совсем так, как ожидает inn (заточенный под BSD), в файлах innd/chan.c и innd/nc.c уже поставлена заплатка
    #ifdef POLL_BUG
    ...
    #endif
    но, к сожалению, POLL_BUG нигде не определяется, пришлось мне вставить в innd/innd.h:
    #ifdef SUNOS5
    #define POLL_BUG
    #endif
    после этого все ошибки (cant read Resource temporaly unavailable, приводящие к разрыву соединения), исчезли.
  8. Добавляем /usr/ccs/bin в PATH и говорим:
    cd $inn
    make world
    Злобно ругается насчет lint, ну и пусть!
    cat */lint
    Ошибок быть не должно.
  9. Конфигурируем (только один раз!):
    cd $inn/site
    make all
    (копируются образцы файлов с описанием конфигурации из samples)
  10. Создаем структуру директорий (только один раз! если что поменять, выпутывайся сам):
    cd $inn
    chmod u+x makedirs.sh
    становимся суперпользователем и запускаем
    makedirs.sh -p
  11. устанавливаем софт (опять-таки из-под суперпользователя) - заметьте, что файлы с конфигурацией не устанавливаются:
    cd $inn
    make update
    (inndstart должен принадлежать суперпользователя - сделай это ручками)
  12. Теперь заходим в $inn/site и правим там все файлы конфигурации ;)
  13. теперь устанавливаем конф. файлы на места:
    cd $inn/site
    make install
  14. откуда-то берем файл active
  15. а так делают history с нуля:
    touch $HISTORY
    cd ${HISTORYDIR}
    ${NEWSBIN}/makehistory -r -i
    mv history.n.dir history.dir
    mv history.n.pag history.pag
  16. теперь можно вставить rc.news куда-нибудь в /etc/rc2.d/S99news и запустить его (параметра start нет)


INN 2.2.1 на Red Hat Linux 6.0 ( +update)

Требует Perl 5, PGP, Tcl.

Группа - news (13). Добавить себя в нее. Пользователь news (9), без пароля, домашняя директория - /var/spool/news. Основные затраты на емкость диска: /var/lib/news (управляющие БД - active, history и т.п.), /var/log/news, /var/spool/news (сами статьи, архивы, очереди - перенести на самый быстрый и емкий диск, а лучше RAID, и сделать link).

Сделать 3 дырки в firewall:

Приходит в виде пакетов:

Почему-то сконфигурирован для запуска на уровне 4(?!). Вручную настроил ссылки в /etc/rc.d/rc2.d и rc3.d.

При установке вносятся изменения в /etc/syslog.conf (news.notice /var/log/news/news.notice, news.=err /var/log/news/news.err, news.=crit /var/log/news/news.crit).

Журналы (/var/log/news):


Если в newsfeed для какого-то сервера накапливаются статьи в файле:
═ ═ ══<имя хоста>:<шаблон имен групп>:Tf,Wnm:<имя файла=имя хоста для простоты>
не забудь в crontab занести строчку:
═ ═ ═5,35 * * * * /usr/local/news/bin/nntpsend <имя хоста> <полное имя хоста>
интервал подбирается по вкусу.


Что делать, если...

Что делать если надо, что-то поменять ═в программе (особенно config.data ;)

Что делать если надо, что-то поменять ═в конфигурационных файлах:

Что делать, если нужно все статьи перенести с одного news-сервера на другой:

Если в спуле завалялись файлы с прошлого года и хочется включить их в active/history, сделай:
═ ═makehistory -buv (пусть только сервер будет свободным в этот момент; или без ключей при выключенном сервере);
═ ═makeactive -mo > active.new (сервер д.б. выключен).


Мною исправлена ошибка в backends/archive.c (архивирование статей) в функции MakeArchiveDirectory(Name):
═ ═for (p = Name; *p; p++)
═ ═ ═ заменил на
═ ═for (p = Name+1; *p; p++)
═ ═ ═ а то он пытался создать директорию с пустым именем

Сохранение всех статей посланных локально (не из demos или mp.aha.ru) - в newsfeeds:
═ ═local-archive!/demos,mp.aha.ru:*:Tc,Wn:/usr/local/news/bin/archive -a /var/news/spool/archive/local -i /var/news/spool/archive/local/INDEX


Сбор и обработка статистики

Какие группы пользуются наибольшей популярностью? Извлекаем информацию из ежедневно собираемой статистики (nnrpd_groups_stats.sh):
awk '/by newsgroup/, /-------/ {print}' /var/mail/news | egrep -v '^$|by newsgroup|-------' ═| sort | awk -f /usr/local/bin/sum.awk | sort -nr +1

Трактовка отчета innreport:


Автоматическое добавление/удаление групп

Полагаться на управляющие статьи совершенно невозможно - засыплют мусором.

Успользуется шаблон для egrep, перечисляющий какие группы мы хотим иметь: wanted_groups_filter.egrep

Добавление групп по факту - если upstream посылает нам статью, а группы для нее нет, то группу надо создать. scanlogs создает специальный файл unwanted.log в /var/log/news, в который записывает имена несуществующих групп. Раз в сутки запускаем процедуру (add_unwanted_group.sh, add_unwanted_group.awk), которая разбирает этот журнал, немножко чистит от неправильных символов, фильтрует иерархии, на которые мы не подписаны вовсе (wanted_groups_filter.egrep), запускает ctlinnd newgroup (модерируемость определяется эмпирически) и сбрасывает журнал в архив. innd не хочет записывать в журнал имена групп длиннее 80 символов (заменяет конец имени на многоточие).

Удаление групп, не входящих в иерархии, на которые мы подписаны (remove_unwanted_group.sh, remove_unwanted_group.awk). Из active извлекается список групп, чистится от неправильных символов, фильтрует иерархии, на которые мы подписаны (а также местные и служебные группы - типа to, control и т.п.- wanted_groups_filter.egrep), и генерирует список команд ctlinnd rmgroup. Список рекомендуется просмотреть перед тем как запускать реальное удаление. К сожалению, группы удаляются только из active. Сами статьи и директории остаются. Предполагается, что статьи будут удалены со временем с помощью expire/expireover, а сами директории в процессе чистки мусора (например, с помощью ncc).


Чистка мусора

(был на http://www.backplane.com/news/newsprune203/) newsprune пробегает по всем директориям, соответствующим файлу active (к сожалению, остальные директории не просматривает), и генерирует список файлов, для которых нет соответствующей строки в history. Написан на Си. Понимает директории с числом в качестве имени и корректно обрабатывает только что добавленые статьи. Ключ -d8 включает отладочную печать (очень много, можно -d1 или -d2). Ограничение: 31 уровень иерархии. Обрабатывает покореженные active и history. Список подлежащих удалению файлов надо скормить fastrm или xargs rm. На миллион статей требует около часа. Памяти потребляет очень мало.

findmissing.pl генерит список файлов, найденных в спуле, но отсутствующих в histore. Этот список надо отредактировать (скрипт не умеет обрабатывать директории с именами из одних цифр) и скормить fastrm или xargs rm. На миллион статей надо 2.5 часа и 64МБ памяти. Но просматривает все директории (даже, если нет соответствующей строки в active).

Улучшенный findmissing.pl: ncc из newstools-1.3.tar.gz. Теперь он понимает числовые директории. К сожалению, программа осталась perl-овой (т.е. ресурсов ей надо много, 3.5 часа). Вдобавок ищет файлы с именами, не являющимися числами (почему-то называет их core). Удаление директорий, не имеющих соответствия в active: sort -nr ncc:bogus | awk '{print SPOOLDIR/$1}' | xargs rmdir.

scanspool делает полный просмотр спул-директории, включая проверку правильности заголовков статей. Описание внутри (использовать -v -n). Работает ОЧЕНЬ долго (сутки, если не останавливать innd). За это время innd успевает принять огромное количество новых статей и удалить старых. Ключ -c отключает проверку содержимого статей, время работы уменьшается до 3 часов.

Поиск пустых групп. history_to_groups_stat.sh (awk '{for(i=3;i<=NF;i++) print $i}' $HISTORY | awk -F/ '{print $1}' | sort | awk -f count.awk) выдает количество статей, полученных в каждой группе за последние 2 недели (интервал времени определяется в expire.ctl). Работает полчаса. Из 28 тысяч групп на нашем сервере: 11 тысяч - пустые, 3.5 тысячи - имеют по одной статье (частично, из-за ограничений по приему). find_empty_group.sh: изготавливаем из active список существующих на данный момент групп (не забыть sort -u). Изготавливаем с помощью history_to_groups_stat.sh список групп, имеющих право на существование (не забыть sort -u). С помощью comm -23 exist mustbe делаем список групп, которые надо удалить (отфильтровав из него локальные и служебные группы), затем генерируем список команд ctlinnd rmgroup. Список рекомендуется просмотреть перед тем как запускать реальное удаление. К сожалению, группы удаляются только из active. Сами директории остаются. Предполагается, что они будут удалены в процессе чистки мусора (например, с помощью ncc). К сожалению, удаляются группы, которые оказались пустыми по нашей вине (из-за ограничений на feed). Часть из них восстанавливается со временем, но если ограничения были поставлены на передающей стороне (например, через gup), то такие группы не появятся никогда.

@ Карта сайта News Автора!

Bog BOS: INN (news-сервер в стандарте NNTP)

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru