На этот раз дружим с nginx dokuwiki:
location /wiki {
index index.php;
access_log logs/wiki.log;
error_log logs/wiki-error.log;
rewrite ^/wiki/_media/(.*) lib/exe/fetch.php?media=$1 last;
rewrite ^/wiki/_detail/(.*) lib/exe/detail.php?media=$1 last;
rewrite ^/wiki/_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 last;
if (!-e $request_filename) {
rewrite ^/wiki/(.+)$ /wiki/doku.php?id=$1 last;
}
if ($request_uri ~ ^/wiki/(bin|conf|data|inc)) {
return 403;
}
rewrite ^/wiki/index.php$ doku.php;
}
При использовании Super Talent UltraDrive ME SSD FTM28GX25H возникли жуткие, на первый взгляд, проблемы:
Jul 6 10:09:20 srv3 smartd[1189]: Device: /dev/ada0, 40699 Offline uncorrectable sectors (changed +111) Jul 6 10:39:21 srv3 smartd[1189]: Device: /dev/ada0, 40801 Offline uncorrectable sectors (changed +102) Jul 6 11:09:21 srv3 smartd[1189]: Device: /dev/ada0, 40893 Offline uncorrectable sectors (changed +92) Jul 6 11:39:20 srv3 smartd[1189]: Device: /dev/ada0, 40999 Offline uncorrectable sectors (changed +106) Jul 6 12:09:20 srv3 smartd[1189]: Device: /dev/ada0, 41095 Offline uncorrectable sectors (changed +96) Jul 6 12:39:20 srv3 smartd[1189]: Device: /dev/ada0, 41184 Offline uncorrectable sectors (changed +89)
При этом диск отсутствовал в базе дисков smartmontools:
=== START OF INFORMATION SECTION === Device Model: STT_FTM28GX25H Serial Number: P604790-AFBX-C289057 Firmware Version: 1916 User Capacity: 128,035,676,160 bytes Device is: Not in smartctl database [for details use: -P showall]
Проблема решилась как всегда просто и элегантно:
fetch -o /usr/local/share/smartmontools/drivedb.h "http://sourceforge.net/apps/trac/smartmontools/browser/branches/RELEASE_5_39_DRIVEDB/smartmontools/drivedb.h?format=txt"
Результат не заставил себя ждать:
=== START OF INFORMATION SECTION === Model Family: SuperTalent UltraDrive GX SSD Device Model: STT_FTM28GX25H Serial Number: P604790-AFBX-C289057 Firmware Version: 1916 User Capacity: 128,035,676,160 bytes
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x0000 --- --- --- Old_age Offline - 6 9 Power_On_Hours 0x0000 --- --- --- Old_age Offline - 896 12 Power_Cycle_Count 0x0000 --- --- --- Old_age Offline - 1 184 Initial_Bad_Block_Count 0x0000 --- --- --- Old_age Offline - 26 195 Program_Failure_Blk_Ct 0x0000 --- --- --- Old_age Offline - 0 196 Erase_Failure_Blk_Ct 0x0000 --- --- --- Old_age Offline - 0 197 Read_Failure_Blk_Ct 0x0000 --- --- --- Old_age Offline - 0 198 Read_Sectors_Tot_Ct 0x0000 --- --- --- Old_age Offline - 2799845469 199 Write_Sectors_Tot_Ct 0x0000 --- --- --- Old_age Offline - 967040916 200 Read_Commands_Tot_Ct 0x0000 --- --- --- Old_age Offline - 21971239 201 Write_Commands_Tot_Ct 0x0000 --- --- --- Old_age Offline - 12340096 202 Error_Bits_Flash_Tot_Ct 0x0000 --- --- --- Old_age Offline - 2538957 203 Corr_Read_Errors_Tot_Ct 0x0000 --- --- --- Old_age Offline - 2200648 204 Bad_Block_Full_Flag 0x0000 --- --- --- Old_age Offline - 0 205 Max_PE_Count_Spec 0x0000 --- --- --- Old_age Offline - 10000 206 Min_Erase_Count 0x0000 --- --- --- Old_age Offline - 4 207 Max_Erase_Count 0x0000 --- --- --- Old_age Offline - 359 208 Average_Erase_Count 0x0000 --- --- --- Old_age Offline - 102 209 Remaining_Lifetime_Perc 0x0000 --- --- --- Old_age Offline - 99 211 Unknown_Attribute 0x0000 --- --- --- Old_age Offline - 0 212 Unknown_Attribute 0x0000 --- --- --- Old_age Offline - 0 213 Unknown_Attribute 0x0000 --- --- --- Old_age Offline - 0
Жуткие счетчики Offline uncorrectable sectors на деле оказались обычными счетчиками операций чтения/записи.
Ура! В кои веки нашел нормальный таск менеджер и трекер времени – redmine.
Он хоть и хоть и написан на богомерзком руби, но работает шустро и локализован просто отлично.
В портах его можно найти в /usr/ports/www/redmine
Первоначальная настройка подробна описана в вики на сайте проекта.
Из подводных камней столкнулся лишь с не работающими из коробки уведомлениями по email, проблема решилась весьма быстро:
config/email.yml:
production:
delivery_method: :smtp
smtp_settings:
tls: true
enable_starttls_auto: true
address: "smtp.gmail.com"
port: '587'
domain: "smtp.gmail.com"
authentication: :plain
user_name: "foo@gmail.com"
password: "bar"
Научить nginx работать с redmine тоже очень просто. Достаточно собрать nginx с модулем passenger и настроить конфигурацию следующим образом:
В секции http описываем глобальные настройки passenger:
passenger_root usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.14; passenger_ruby /usr/local/bin/ruby;
И добавим сервер, который будет обрабатывать к redmine:
server
{
listen 1.2.3.4:80;
server_name redmine.domain.tld;
charset utf-8;
passenger_enabled on;
root /usr/local/www/redmine/public;
}
Набросал небольшой патч, добавляющий в порт php 5.3 поддержку php-fpm. Из недостатков – требует наличие svn клиента для загрузки патчей с репозитария svn.php.net. Зато в теории будет работать для любой стабильной версии порта в пределах ветки 5.3.x.
Установка очень простая:
cd /usr/ports/lang/php5 fetch http://sav.ecom24.ru/freebsd/fpm.patch patch < fpm.patch make config install clean
Сам патч:
--- Makefile 2010-06-17 07:59:24.414207380 +0000
+++ Makefile 2010-06-17 08:56:48.418613806 +0000
@@ -43,7 +43,8 @@ OPTIONS= CLI "Build CLI version" on \
SUHOSIN "Enable Suhosin protection system" on \
MULTIBYTE "Enable zend multibyte support" off \
IPV6 "Enable ipv6 support" on \
- MAILHEAD "Enable mail header patch" off
+ MAILHEAD "Enable mail header patch" off \
+ FPM "Enable PHP-FPM patch" off
CONFLICTS= php4-4* php5-pcre-* php5-spl-*
@@ -51,6 +52,13 @@ MAN1= php-config.1 phpize.1
.include
+.if defined(WITH_FPM)
+USE_RC_SUBR= php-fpm.sh
+LIB_DEPENDS+= event:${PORTSDIR}/devel/libevent
+BUILD_DEPENDS+= svn:$(PORTSDIR)/devel/subversion
+CONFIGURE_ARGS+=--enable-fpm --with-fpm-log=/var/log/php-fpm.log --with-fpm-pid=/var/run/php-fpm.pid
+.endif
+
PATCH_DIST_STRIP= -p1
.if !defined(WITHOUT_SUHOSIN)
@@ -136,9 +144,16 @@ CONFIGURE_ARGS+=--disable-ipv6
post-patch:
@${TOUCH} ${WRKSRC}/ext/php_config.h
@${REINPLACE_CMD} "s|^\(extension_dir\)|; \1|" ${WRKSRC}/php.ini-*
+ @(svn export http://svn.php.net/repository/php/php-src/branches/PHP_5_3/sapi/fpm ${WRKSRC}/sapi/fpm)
pre-configure:
@${CAT} ${WRKSRC}/acinclude.m4 ${WRKSRC}/build/libtool.m4 > ${WRKSRC}/aclocal.m4
+ @(cd ${WRKSRC} && ./buildconf --force)
+
+post-configure:
+.if defined(WITH_FPM)
+ @${REINPLACE_CMD} "s|/usr/local/var|/var|" ${WRKSRC}/sapi/fpm/php-fpm.conf
+.endif
post-build:
@${ECHO_CMD} "PHP_VER=5" > ${WRKDIR}/php.conf
--- files/php-fpm.sh.in 1970-01-01 00:00:00.000000000 +0000
+++ files/php-fpm.sh.in 2010-06-17 09:05:07.600963518 +0000
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# PROVIDE: php-fpm
+# REQUIRE: NETWORKING SERVERS
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable php-fpm:
+# php_fpm_enable (bool): Set to "NO" by default.
+# Set it to "YES" to enable php-fpm
+# php_fpm_config (str): Set to "" by default.
+# Define your php-fpm configuration file here.
+
+. /etc/rc.subr
+
+name="php_fpm"
+rcvar=`set_rcvar`
+
+load_rc_config $name
+
+: ${php_fpm_enable="NO"}
+: ${php_fpm_pidfile="/var/run/php-fpm.pid"}
+: ${php_fpm_config="%%PREFIX%%/etc/php-fpm.conf"}
+
+command="%%PREFIX%%/sbin/php-fpm"
+pidfile=${php_fpm_pidfile}
+reload_precmd="php_fpm_prereload"
+quit_cmd="php_fpm_quit"
+
+[ -n "$php_fpm_config" ] && php_fpm_flags="--fpm-config $php_fpm_config"
+
+php_fpm_prereload()
+{
+ sig_reload=USR2
+}
+
+php_fpm_quit()
+{
+ sig_stop=QUIT
+ run_rc_command stop
+}
+
+extra_commands="reload quit"
+run_rc_command "$1"
Реализация Flash Policy Daemon на nginx проста и изящна:
# FLASH POLICY DAEMON
# returns crossdomain.xml on any request
server {
listen 843;
server_name localhost;
location / {
rewrite ^(.*)$ /crossdomain.xml;
}
error_page 400 /crossdomain.xml;
location = /crossdomain.xml {
root html;
}
}
Внезапно сдох 128 гиговый ссд диск STT FTM28GX25H 1916. Проработал недели три в качестве log/l2arc для zfs пула.
ahcich0: Timeout on slot 31 ahcich0: Timeout on slot 31 ahcich0: Timeout on slot 31 ahcich0: Timeout on slot 31 (ada0:ahcich0:0:0:0): lost device
Похерился пул вместе с данными. Благо бэкапный мастер под боком был. Мораль – используйте для лог девайсов зеркало!
Иногда приходится добавлять префиксы, полученные из quagga в таблицы ipfw. Для этого нужно добавить соответствующий cidr для сетей класса A, B и C, который сама quagga в своем выводе опускает. Делается это следующим набором команд для sed:
br# echo 192.16.0.0 | sed -E -e 's|^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)$|\1/24|' -e 's|^([0-9]+\.[0-9]+\.[0-9]+)$|\1.0/16|' -e 's|^([0-9]+\.[0-9]+)$|\1.0.0/8|' 192.16.0.0/24 br# echo 172.16.0 | sed -E -e 's|^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)$|\1/24|' -e 's|^([0-9]+\.[0-9]+\.[0-9]+)$|\1.0/16|' -e 's|^([0-9]+\.[0-9]+)$|\1.0.0/8|' 172.16.0.0/16 br# echo 10.0 | sed -E -e 's|^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)$|\1/24|' -e 's|^([0-9]+\.[0-9]+\.[0-9]+)$|\1.0/16|' -e 's|^([0-9]+\.[0-9]+)$|\1.0.0/8|' 10.0.0.0/8
В определенных ситуациях требуется быстро раздавать фиксированный набор статических файлов, например при раздаче swf файлов flash/flex приложений.
Для того, чтобы снизить нагрузку на диски и уменьшить время реакции, можно организовать горячее кэширование файлов в оперативной памяти:
Создадим хранилище для кэша на md диске:
mkdir /var/tmp/nginx chown www:www /var/tmp/nginx echo "md /var/tmp/nginx mfs rw,-s128m,late 2 0" >> /etc/fstab mount /var/tmp/nginx
Организуем локальный сервер для раздачи статики, с которого будет заполняться кэш:
server
{
listen 127.0.0.1:80;
root /usr/local/www/site;
}
В контексте http описываем зону кэширования:
proxy_cache_path /var/tmp/nginx/store levels=1:2 keys_zone=STATIC:10m inactive=1d max_size=128m;
В контексте server добавляем location для статики, которую будем кэшировать:
location ~\.swf$ {
proxy_pass http://127.0.0.1:80;
expires 30d;
proxy_intercept_errors on;
proxy_cache STATIC;
proxy_cache_min_uses 1;
proxy_cache_valid 1d;
proxy_ignore_client_abort on;
proxy_temp_path /var/tmp/nginx/tmp;
proxy_cache_use_stale updating;
}
Перегружаем сервер и запрашиваемые swf файлы начинают кэшироваться на md диске:
/usr/local/etc/rc.d/nginx reload
Добавляем параметр log к конфигурации ната:
ipfw nat 1 config ip 1.2.3.4 log
Теперь количество трансляций можно посмотреть командой:
# ipfw nat show nat 1: icmp=106, udp=34388, tcp=115736, pptp=0, proto=0, frag_id=14 frag_ptr=0 / tot=150244
Есть возможность посмотреть, сколько ядерной памяти потребляет нат:
# vmstat -m | grep alias | tr -s ' ' | cut -d ' ' -f 4 33311K