11 марта 2014

Nginx: client intended to send too large body

Если в логи nginx падает ошибка вида

2014/03/11 11:54:28 [error] 8699#0: *4615315 client intended to send too large body: 1569729 bytes, client: xx.xx.xx.xx, server: example.com, request: "POST /upload/index.php HTTP/1.1", host: "example.com", referrer: "http://example.com/upload/"

То причина в превышении лимита размера тела запроса в Nginx, за этот лимит отвечает параметр client_max_body_size (по-умолчанию лимит равен 1m).

Чтобы увеличить этот лимит хотя бы до 50m добавьте в конфигурацию nginx (в Debian это можно сделать через файл /etc/nginx/conf.d/local.conf)

# echo 'client_max_body_size 50m;' > /etc/nginx/conf.d/local.conf
# nginx -t
the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
# service nginx reload

P.S. Ответ нашелся тут.

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

10 марта 2014

Полная очистка SSD диска

Перед началом использования SSD диска желательно выполнить его полное стирание. Если SSD диск уже использовался ранее, то полное стирание (secure erase) позволит контроллеру не производить предварительную подготовку ячеек NAND перед операцией записи. Если вы не в курсе почему так, то можно почитать это.

Сначала нужно убедиться, что SSD диск не заблокирован BIOS'ом.

$ sudo hdparm -I /dev/sda | grep frozen
 not frozen

Если в результате вывело "not frozen", то можно переходить далее. Иначе нужно искать способ, как разблокировать диск. Один из способов разблокировать диск - выполнить suspend to ram

$ echo mem | sudo tee /sys/power/state

Чтобы выполнить secure erase нужно выполнить следующие команды (ВНИМАНИЕ! Secure erase безвозвратно удалит все данные с выбранного диска!)

$ sudo hdparm --user-master u --security-set-pass PasSWorD /dev/sda
security_password="PasSWorD"

/dev/sda:
 Issuing SECURITY_SET_PASS command, password="PasSWorD", user=user, mode=high

$ sudo hdparm --user-master u --security-erase PasSWorD /dev/sda
security_password="PasSWorD"

/dev/sda:
 Issuing SECURITY_ERASE command, password="PasSWorD", user=user

Все, диск полностью очищен и его производительность будет максимальна.

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

05 марта 2014

Отключить использование PDIFF в APT

Чтобы отключить использование PDIFF нужно добавить в файл /etc/apt/apt.conf строку Acquire::PDiffs "false";

$ cat <<_EOF_ | sudo tee -a /etc/apt/apt.conf
Acquire::PDiffs "false";
_EOF_

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

01 марта 2014

Подготовка образа дискеты с virtio драйвером для установки Windows Server 2003

Использование Windows Server 2003 на выделенном сервере сегодня имеет крайне мало смысла. Но старый солдат еще послужит, если перенести систему в виртуальную машину. В качестве системы виртуализации используется гипервизор KVM, что позволяет использовать virtio драйвера (storage, network, balloon) для оптимальной производительности.

Сначала создаю файл образа дискеты

$ truncate -s 1440k ./virtio-floppy_0.1-49.ima
$ sudo mkfs -t vfat -n VIRTIO ./virtio-floppy_0.1-49.ima
$ sudo mkdir /mnt/floppy
$ sudo mount -o loop,rw ./virtio-floppy_0.1-49.ima /mnt/floppy

Скачиваю образ с virtio драйверами. По этому совету я выбрал версию 0.1-49.

$ wget http://alt.fedoraproject.org/pub/alt/virtio-win/archives/virtio-win-0.1-49/virtio-win-0.1-49.iso

Создаю структуру установочного диска

$ sudo mkdir /mnt/iso
$ sudo mount -o ro,loop ./virtio-win-0.1-49.iso /mnt/iso
$ sudo mkdir -p /mnt/floppy/{i386,amd64}/Win2003
$ sudo touch /mnt/floppy/disk1
$ sudo cp /mnt/iso/WNET/X86/VIOSTOR.* /mnt/floppy/i386/
$ sudo cp /mnt/iso/WNET/AMD64/VIOSTOR.* /mnt/floppy/amd64/
$ cat<<_EOF_ | sudo tee /mnt/floppy/txtsetup.oem
[Disks]
d1 = "OEM DISK (SCSI) Win2003/32-bit",\disk1,\i386\Win2003
d2 = "OEM DISK (SCSI) Win2003/64-bit",\disk1,\amd64\Win2003

[Defaults]
SCSI = WNET32

[scsi]
WNET32 = "Red Hat VirtIO SCSI Disk Device Win2003/32-bit"
WNET64 = "Red Hat VirtIO SCSI Disk Device Win2003/64-bit"

[Files.scsi.WNET32]
driver = d1, viostor.sys, viostor
inf    = d1, viostor.inf
catalog= d1, viostor.cat

[Files.scsi.WNET64]
driver = d2, viostor.sys, viostor
inf    = d2, viostor.inf
catalog= d2, viostor.cat

[HardwareIds.scsi.WNET32]
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00000000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00020000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4", "viostor"

[HardwareIds.scsi.WNET64]
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00000000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00020000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4", "viostor"

[Config.WNET32]
value = Parameters\PnpInterface,5,REG_DWORD,1

[Config.WNET64]
value = Parameters\PnpInterface,5,REG_DWORD,1
_EOF_

Осталось подчистить хвосты

$ sudo umount /mnt/{iso,floppy}
$ sudo rmdir /mnt/{iso,floppy}

В результате в файле ./virtio-floppy_0.1-49.ima находится образ дискеты для установки Windows Server 2003 на диск, доступный через virtio контроллер.

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

Модификация Seabios для гипервизора KVM

Для модификации BIOS потребуется установить пару зависимостей

$ sudo aptitude install build-essential iasl

Внедрение секции ACPI_SLIC (используется SLIC той машины, где выполняется модификация) в BIOS для гипервизора KVM

$ git clone https://github.com/ghuntley/seaslic.git seaslic
$ cd seaslic
$ git clone git://git.seabios.org/seabios.git seabios.submodule
$ cd seabios.submodule
$ git checkout rel-1.7.3.2
$ cd ..
$ ./patch.sh

После завершения компиляции нужно установить модифицированную версию Seabios в систему (я не заменяю дистрибутивный BIOS, вместо этого устанавливается отдельная версия)

$ sudo mkdir /opt/seaslic
$ sudo cp seabios.submodule/out/bios.bin /opt/seaslic

Далее нужно отредактировать конфигурацию виртуальной машины

$ export LIBVIRT_DEFAULT_URI=qemu:///system
$ virsh edit vmname

В открывшемся редакторе нужно привести XML файл виртуальной машины к подобному виду

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
...
  <qemu:commandline>
    <qemu:arg value='-bios'/>
    <qemu:arg value='/opt/seaslic/bios.bin'/>
  </qemu:commandline>
</domain>

После сохранения файла и перезапуска виртуальной машины в BIOS будет доступна дополнительная секция.

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

24 февраля 2014

Растущее количество dropped пакетов в ifconfig

Настраивая новую систему мониторинга я заметил, что график ошибок сетевого адаптера одного из серверов показывает рост значения RX packets: dropped.

# ifconfig em2
em2       Link encap:Ethernet  HWaddr 00:25:90:d0:df:18  
          inet addr:xx.xx.xx.xx  Bcast:xx.xx.xx.255  Mask:255.255.255.0
          inet6 addr: fe80::225:90ff:fed0:df18/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:180047091 errors:0 dropped:31438 overruns:0 frame:0
          TX packets:165010458 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:58487975592 (58.4 GB)  TX bytes:192626658770 (192.6 GB)
          Memory:f7100000-f7180000

Это может говорить о том, что система не успевает забирать пакеты из буфера приема сетевого адаптера. Хотя в этом случае должно расти и значение RX packets: overruns.

Поиск в гугле вывел на возможное объяснение такому поведению. Такое поведение счетчика ошибок поясняется цитатой ниже

Beginning with kernel 2.6.37, it has been changed the meaning of dropped packet count. Before, dropped packets was most likely due to an error. Now, the rx_dropped counter shows statistics for dropped frames because of:

  • Softnet backlog full
  • Bad / Unintended VLAN tags
  • Unknown / Unregistered protocols
  • IPv6 frames when the server is not configured for IPv6

If any frames meet those conditions, they are dropped before the protocol stack and the rx_dropped counter is incremented.

Вариант с Softnet backlog full я исключил сразу, поскольку ошибки распределены более-менее равномерно и присутствуют даже при траффике менее 100 пакетов в секунду.

Для проверки остальных пунктов на сутки был запущен tcpdump на проблемном интерфейсе em2.



По истечении суток показания мониторинга подтвердили теорию - ошибки при запущенном tcpdump не появляются, а следовательно можно не дергать сервер.

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

17 февраля 2014

Локальный репозитарий с reprepro

Устанавливаем reprepro

# aptitude install reprepro

Создаем корневую директорию для репозитория и конфигурацию reprepro

# mkdir -p /var/www/debian/conf
# cat > /var/www/debian/conf/distributions <<_EOF_
Origin: Amasty
Suite: stable
Codename: wheezy-amasty
Version: 7.0
Architectures: i386 amd64 source
Components: main backports
UDebComponents: main backports
Description: Local Amasty repository
_EOF_

Теперь нужно инициализировать созданную конфигурацию

# reprepro -b /var/www/debian export
# reprepro -b /var/www/debian createsymlinks

Пакеты уже залиты на сервер в директорию /tmp/incoming, добавляем их в секцию main

# reprepro -b /var/www/debian -C main includedsc /tmp/incoming/*.dsc
# reprepro -b /var/www/debian -C main includedeb /tmp/incoming/*.deb

Осталось подчистить "хвосты"

# rm -fr /tmp/incoming

Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.