Избавляемся от www в nginx

Простой и изящный способ избавиться от www в запросах на всех виртуальных серверах, обслуживаемых nginx.
Не сработает для доменов, для которых server_name задан в виде .domain.ru (с точкой) и www.domain.ru.

server {
listen 1.2.3.4:80;
server_name ~^www\.(?<name>.*);
rewrite ^ http://$name$request_uri? permanent;
}

Тюнинг ZFS, MySQL и InnoDB

Тюнинг MySQL и InnoDB

InnoDB начинает работать с файлами данных и логами напрямую, не используя буферы файловой системы.
Позволяет избежать двойной буферизации при работе с файлами данных и логов.

innodb_flush_method = O_DIRECT

Механизм буфера двойной записи (doublewrite) используется в InnoDB для того, чтобы удостовериться, что измененные страницы были записаны в файл данных. Этот механизм позволяет избежать потери данных при внезапном отключении сервера. Поскольку у ZFS есть свой механизм обеспечения целостности данных, буфер двойной записи можно отключить:

skip-innodb_doublewrite

Запись в файлы данных InnoDB должна осуществляться блоками по 16Кб, что соответствует размеру страницы, используемом в этом движке. Поскольку размер блока записи по-умолчанию составляет 128Кб, файлы данных нужно вынести на отдельную файловую систему.

innodb_data_home_dir=/var/db/mysql/ibdata
# zfs create data/mysql/ibdata
# zfs set recordsize=16K data/mysql/ibdata
# mv /var/db/mysql/ibdata1 /var/db/mysql/ibdata/

Тюнинг ZFS

База данных осуществляет чтение в произвольном порядке, который нельзя предсказать.
Отключение префетча позволяет избежать ненужных операций чтения. Добавим в /boot/loader.conf строку

vfs.zfs.prefetch_disable=1

ZFS кэширует данные в ARC, используя свободную оперативную память. Поскольку страницы InnoDB уже кэшируются в буфер пуле, отключим кэширование файлов данных InnoDB:

# zfs set primarycache=metadata data/mysql/ibdata

См. также: MySQL на ZFS под FreeBSD: подготовка

Бэкапим MySQL на ZFS

Кстати, бэкапиться с ZFS на слейвах очень и очень просто:

#!/bin/sh
user='mysqlbackup';
pass='superpass';
/usr/local/bin/mysql -u $user -p$pass -e 'STOP SLAVE; FLUSH LOGS; FLUSH TABLES WITH READ LOCK; \
SYSTEM zfs destroy -r data/mysql@yesterday; \
SYSTEM zfs rename -r data/mysql@today @yesterday; \
SYSTEM zfs snapshot -r data/mysql@today; \
UNLOCK TABLES; START SLAVE;'

Скрипт выполняется примерно за секунду на 30 гиговой базе.

FreeBSD UFS/ZFS Snapshot Management Environment

Открыл для себя очередную крутую штуку, FreeBSD UFS/ZFS Snapshot Management Environment. В портах можно найти в sysutils/freebsd-snapshot . Утилита позволяет манипулировать UFS2 снапшотами не сложнее, чем это делается в ZFS:

# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1172MB   14.8%      4MB    0.1%  test.0
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1176MB   14.8%      4MB    0.1%  test.0
/var              1176MB   14.8%      4MB    0.1%  test.1
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1181MB   14.9%      4MB    0.1%  test.0
/var              1181MB   14.9%      4MB    0.1%  test.1
/var              1181MB   14.9%      4MB    0.1%  test.2
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1186MB   15.0%      4MB    0.1%  test.0
/var              1186MB   15.0%      4MB    0.1%  test.1
/var              1186MB   15.0%      4MB    0.1%  test.2
/var              1186MB   15.0%      4MB    0.1%  test.3
# snapshot make -g4 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot
/var              1186MB   15.0%      4MB    0.1%  test.0
/var              1186MB   15.0%      4MB    0.1%  test.1
/var              1186MB   15.0%      4MB    0.1%  test.2
/var              1186MB   15.0%      4MB    0.1%  test.3
# snapshot mount /var:test.2 /mnt
# ls /mnt
.snap      crash      games      lost+found obj        rwho
account    cron       heimdal    mail       opkg       spool
at         db         lib        msgs       preserve   tmp
backups    empty      log        named      run        yp
# snapshot umount /mnt
# snapshot make -g0 /var:test
# snapshot list /var
Filesystem          User   User%     Snap   Snap%  Snapshot

Про zvol

ZFS предоставляет интерфейс zvol, который позволяет обращаться к разделам как к блочным устройствам, используя путь /dev/zvol/zpoolname/volume. Как показала практика, объекты типа filesystem адресовать нельзя.

# uname -r
8.0-RELEASE-p2
# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
system      1.16G   269G  1.16G  legacy
tank         177K  1.43T  30.4K  none
tank/video  28.8K  1.43T  28.8K  none
# mount
system on / (zfs, local)
devfs on /dev (devfs, local, multilabel)
# zfs get type tank/video
NAME        PROPERTY  VALUE       SOURCE
tank/video  type      filesystem  -
# ls -la /dev/zvol
ls: /dev/zvol: No such file or directory

Однако если создать volume с четко заданным размером, то его можно будет использовать как блочное устройство.

# zfs create -V 100m tank/test
# ls -l /dev/zvol/tank
total 0
crw-r-----  1 root  operator    0, 116 Jan 12 13:21 test