среда, 26 октября 2011 г.

Отключение TSO на интерфейсе при загрузке.

Встала небольшая задача - отключать TSO (TCP Segmentation offload) при загрузке хоста. Попытка установить переменную ETHTOOL_OPTS в конфигурационном файле /etc/sysconfig/network-scripts/ifcfg-ethX не привела к нужным результатам. Данная переменная (ETHTOOL_OPTS) позволяет управлять параметрами дуплекса (duplex), автосогласования скорости (autoneg), но не позволяет установить Offload-параметры. 
Как вариант, можно добавить команду "/sbin/ethtool -K eth1 tso off" в /etc/rc.d/rc.local.
Вторая возможность позволяет воспользоваться средствами Udev. Создаем свое правило или редактируем текущее, касающееся нужного интерфейса (в моем случае /etc/udev/rules.d/70-persistent-net.rules), и добавляем RUN+="/sbin/ethtool -K eth0 tso off"
# cat /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:8b:00:00", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0", RUN+="/sbin/ethtool -K eth0 tso off"

суббота, 22 октября 2011 г.

Небольшая заметка о настройке анализатора логов AWStats для web-сервера Nginx.


Во-первых, что такое AWStats?
AWStats является генератором отчетов веб-аналитики с открытым исходным кодом, пригодным для анализа данных интернет-сервисов, таких как веб, потокового мультимедиа, почта и FTP серверов. AWStats проводит разбор и анализ log файлов сервера, генерируя HTML отчеты. Данные визуально представлены в отчетах таблицами и гистограммами. Статические отчеты могут быть созданы через интерфейс командной строки, или через CGI-сценарии.
AWStats поддерживает большинство основных форматов Log-файлов веб-серверов, включая Apache (NCSA комбинированного / XLF / ELF log формат или обычный СLF log формат), WebStar, IIS (W3C log формат) и многих других распространенных log форматов веб-серверов.

Теперь об исходных данных. Настройка будет проходить на 64-битной OS RHEL6.1. Домен, для которого нужно создавать отчеты — DOMAIN.COM. Для просмотра статистики я создал дополнительный поддомен awstats.DOMAIN.COM с ограниченным доступом по IP и паролю.
Предполагается, что web-сервер nginx уже установлен и использует формат логов combined.
В конфигурации nginx всегда существует предопределённый формат "combined" (см. http://nginx.org/ru/docs/http/ngx_http_log_module.html):
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

Установка:
1. подключить репозиторий rpmforge
2. Установить пакеты awstats и perl-Geo-IPfree
yum -y install awstats perl-Geo-IPfree

Настройка Nginx:
Создаем отдельный виртуальный хост для awstats, в моем случае awstats.DOMAIN.COM
# cat /etc/nginx/conf.d/awstat.DOMAIN.COM.conf
server {
listen 80;
server_name awstats.DOMAIN.COM;
root /var/www/awstats/DOMAIN.COM;
index awstats.DOMAIN.COM.html;
access_log /var/log/nginx/awstats.DOMAIN.COM-access.log main;
error_log /var/log/nginx/awstats.DOMAIN.COM-error.log;

location = /favicon.ico {
access_log off;
log_not_found off;
}

location / {
auth_basic "Auth required";
auth_basic_user_file /etc/nginx/conf.d/htpasswd;

allow 192.168.0.0/16;
allow X.X.X.X;
allow Y.Y.Y.Y;
allow Z.Z.Z.Z;
deny all;
}

location /awstats/ {
alias /var/www/awstats/;
}

}

Пароли в файле /etc/nginx/conf.d/htpasswd должны быть зашифрованы функцией crypt(3). Для создания файла с паролями можно воспользоваться программой htpasswd из дистрибутива Apache. Например, htpasswd -c /etc/nginx/conf.d/htpasswd jack или если файл уже есть htpasswd /etc/nginx/conf.d/htpasswd jack.

Настройка awstats:
При установке создаются 2 файла в директории /etc/awstats
/etc/awstats/awstats.localhost.localdomain.conf
/etc/awstats/awstats.model.conf

Создаем новый профиль для нашего домена
cp /etc/awstats/awstats.localhost.localdomain.conf /etc/awstats/awstats.DOMAIN.COM.conf
Редактируем файл /etc/awstats/awstats.DOMAIN.COM.conf, он достаточно хорошо прокомментирован, я приведу лишь часть настроек, которые были изменены.

Рекомендую использовать для данной директивы только абсолютный путь к лог-файлу.
LogFile="/var/log/nginx/access.log"
Тип лог-файла, для web-сервера W, F — для ftp и т.п.:
LogType=W
Лог-файл в формате Apache combined, либо указать явно строку с форматом лога.
LogFormat=1
Информация в лог-файле разделена пробелами.
LogSeparator=" "
Указываем имя домена
SiteDomain="DOMAIN.COM"
Указываем все возможные псевдонимы домена
HostAliases="localhost 127.0.0.1 www.DOMAIN.COM"
В какой папке будут лежать БД awstats, на основе этих данных awstats сгенерирует отображаемую статистику.
DirData="/var/www/awstats/DOMAIN.COM"
Путь к папке с иконками
DirIcons="/awstats/icon/"

Подключаем плагины (если есть)
LoadPlugin="geoipfree"
LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /var/www/awstats/GeoIPCity.dat"

Запуск Awstats
Заключается в запуске утилиты awstats.pl с необходимыми параметрами для сбора статистики. Для визуализации может использоваться awstats.pl, запущенная как CGI-скрипт, либо awstats_buildstaticpages.pl, создающая статические страницы на основе информации от awstats.pl.

cd /var/www/awstats
./awstats.pl -config=DOMAN.COM -update
Если вылазит ошибка
Error: Plugin load for plugin 'geoipfree' failed with return code: Error: Can't locate Geo/IPfree.pm in @INC

Решение: установить perl-Geo-IPfree (yum -y install perl-Geo-IPfree), либо закомментировать в конфигурации загрузку плагина geoipfree (#LoadPlugin="geoipfree")

Пример

/var/www/awstats/awstats.pl -config=DOMAIN.COM -update
Create/Update database for config "/etc/awstats/awstats.DOMAIN.COM.conf" by AWStats version 7.0 (build 1.971)
From data in log file "/var/log/nginx/access.log"...
Phase 1 : First bypass old records, searching new record...
Searching new records from beginning of log file...
Phase 2 : Now process new records (Flush history on disk after 20000 hosts)...
Jumped lines in file: 0
Parsed lines in file: 177287
Found 1130 dropped records,
Found 0 comments,
Found 0 blank records,
Found 380 corrupted records,
Found 0 old records,
Found 175777 new qualified records.

Dropped records — записи, отвергнутые по причине того, что они либо НЕ "user HTTP requests", либо отфильтрованы директивами SkipHosts, SkipUserAgents, SkipFiles, OnlyHosts, OnlyUserAgents и OnlyFiles.
Corrupted records - записи, не подходящие под формат лог-файла из директивы LogFormat
Old records - ранее обработанные записи
New records — новые записи

awstats_buildstaticpages.pl -config=DOMAIN.COM -update -lang=ru -awstatsprog=/var/www/awstats/awstats.pl -dir=/var/www/awstats/DOMAIN.COM/

Заходим браузером на http;//awstats.DOMAIN.COM и в случае успеха наблюдаем визуализированную статистику.

Добавляем в cron:
crontab -e
30 * * * * /var/www/awstats/awstats.pl -config=DOMAIN.COM -update >/dev/null
40 * * * * awstats_buildstaticpages.pl -config=DOMAIN.COM -update -lang=ru -awstatsprog=/var/www/awstats/awstats.pl -dir=/var/www/awstats/DOMAIN.COM/ >/dev/null

Не забываем перезапустить crond.
service crond restart

Добавляем в скрипт ротации логов Nginx
# cat /etc/logrotate.d/nginx
var/log/nginx/*log {
daily
rotate 10
missingok
notifempty
compress
sharedscripts
prerotate
/var/www/awstats/awstats.pl -update -config=DOMAIN.COM >/dev/null
endscript
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}

Литература:

вторник, 4 октября 2011 г.

Узнать текущие параметры загруженного модуля.

Казалось бы, тривиальная вещь, а многие не сразу могут ответить на этот вопрос. Небольшая заметка для себя.

$ modinfo -p <module_name>
$ cat /sys/module/<module_name>/parameters/<param_name>

суббота, 1 октября 2011 г.

Webcam Eye 312S в fedora15

Внезапно перестала работать web-камера Eye 312S. Ну, не совсем внезапно - после переноса жесткого диска на новое железо, при этом система определет устройство нормально:
# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0458:706f KYE Systems Corp. (Mouse Systems)
****

Конечно, это недорогая web-камера, но все же хочется заставить ее работать, тем более она раньше работала без проблем. Недолгое гугление объясняет, что дешёвые вебкамеры имеют недостаток - они запрашивают у usb-контроллера максимальную пропускную способность, даже на минимальном разрешении. В результате в логи сыплются ошибки типа:
Oct 1 14:55:17 Zeus kernel: [ 2233.047315] uvcvideo: Failed to query (SET_CUR) UVC control 8 on unit 2: -110 (exp. 2).
Oct 1 15:06:19 Zeus kernel: [ 2893.437166] uvcvideo: Failed to query (SET_CUR) UVC control 10 on unit 2: -32 (exp. 2).
Oct 1 15:06:20 Zeus kernel: [ 2893.735641] uvcvideo: Failed to query (SET_CUR) UVC control 8 on unit 2: -110 (exp. 2).


При запуске skype сыпятся ошибки типа:
"no space left on device".

Временное решение:
rmmod uvcvideo
modprove uvcvideo quirks=2

Постоянное решение:
Чтобы модуль uvcvideo загружался каждый раз с нужным значением параметра - необходимо создать файл /etc/modprobe.d/uvcvideo.conf с таким содержанием:
options uvcvideo quirks=2

суббота, 10 сентября 2011 г.

Проброс порта в FortiGate 50B внутрь локальной сети.

Небольшая заметка для себя об особенностях проброса порта в FortiGate 50B внутрь локальной сети. Поднимал у клиента почтовый сервер на базе exim+dovecot с авторизацией в Active Directory. Протестировал изнутри - все работает как надо, нужно публиковать сервис в интернет. В качестве маршрутизатора/фаервола у клиента стоит FortiGate 50B. Собственно, мои действия.
1. Идем в Firewall Objects -> Virtual IP -> Virtual IP,
1.1. Создаем новую запись "vMailSrv",
1.2. Выбираем из списка внешний интерфейс (если несколько интерфейсов внешних)
1.3. В полях External IP Address/Range задаем внешний IP-адрес (в моем случае один IP-адрес два раза нужно указать, поскольку он единственный)
1.4. В полях Mapped IP Address/Range задаем внутренний IP-адрес
1.5. Ставим галочку Port Forwarding
1.6. Protocol - TCP
1.7. External Service Port - 25
1.8. Map to Port - 25
2. Идем в Firewall Objects -> Service -> Predefined и ищем есть уже определенная служба TCP/25 порт (уже есть, называется SMTP). Если требуется нестандартная служба - заходим в Firewall Objects -> Service -> Custom и создаем новую (нужно будет указать имя службы, протокол, порты источника и назначения).
3. Идем в Policy -> Policy, чтобы задать проброс порта с внешнего интерфейса на ранее созданный виртуальный IP.
3.1. Выбираем нужный внешний интерфейс (в моем случае wan1) и правильное направление WAN -> INTERNAL
3.2. Создаем новое правило с именем "SMTP to vMailSrv"
3.3. Source Interface - WAN1
3.4. Source address - all
3.5. Destination Interface - Internal
3.6. Destination Address - выбираем ранее созданный виртуальный IP (vMailSrv, созданный на этапе 1)
3.7. Service - выбираем тип службы (SMTP или другую, созданную на этапе 2)
3.8. Action - ACCEPT, принимать трафик
3.9. Ставим галочку Log Allowed Traffic
3.10. Важный момент: если поставить галочку Enable NAT, то будет производиться "полный" NAT, т.е. и адрес назначения, и адрес источника будут меняться. Галочку НЕ ставить, если серверу важно знать адрес источника, что в моем случае важно, потому как без нее все соединения к серверу идут от IP-адреса FortiGate. Например, в логах exim:

2011-09-10 12:13:30 SMTP connection from fortigate50b.domain.com (mail-gy0-f172.google.com) [172.16.0.254]:47506 I=[172.16.0.126]:25 closed by QUIT

среда, 7 сентября 2011 г.

Ошибка в логах exim при обновлении Clamav.

Собственно, получил ошибку в логах exim. Это произошло после обновления clamav со стороннего  репозитория atrpms.net, верней после удаления старой версии clamav и установки новой.
2011-09-07 11:08:45 1R1DBd-0004GU-3I malware acl condition: clamd: ClamAV returned: /var/spool/exim/scan/1R1DBd-0004GU-3I/1R1DBd-0004GU-3I.eml: lstat() failed: Permission denied. ERROR
Проблема с полномочиями. Clamav не может прочитать файлы в домашней директории exim. Смотрим:
# id exim
uid=93(exim) gid=93(exim) groups=93(exim),12(mail)
# id clamav
uid=497(clamav) gid=494(clamav) groups=494(clamav)
Добавляем clamav в группу exim.
# usermod -G exim clamav
Проверяем:
# id clamav
uid=497(clamav) gid=494(clamav) groups=494(clamav),93(exim)

Перезапускаем exim и clamav:
# service exim restart
# service clamav restart

воскресенье, 28 августа 2011 г.

Ошибка при обновлении mysql.

Вылезла ошибка в общий лог событий службы mysql при обновлении до версии 5.5.14:
[ERROR] Native table 'performance_schema'.'XXXXXX' has the wrong structure
Быстрое решение избавится от такого рода сообщений - запустить mysql_upgrade (если у вас параметры доступа по умолчанию не заданы в my.cnf, то указывайте параметры -u USER -p, иначе вылезет ошибка 1045: Access denied)
и рестартовать mysql командой:
service mysqld restart

Литература:
http://dev.mysql.com/doc/refman/5.5/en/performance-schema-build-configuration.html