Найти и удалить все процессы, подходящие под критерий

kill $(ps aux | grep something | awk '{print $2}')

Оптимизация OpenCart

Кейс — тормозит сайт на OpenCart 1.5, а на сервер оказывается ощутимая нагрузка.
Проанализировав, что происходит при открытии страниц сайта, обнаружилось следующее.
При открытии любой страницы каталога происходят десятки однотипных SQL-запросов вида:
SELECT COUNT(DISTINCT p.product_id) AS total FROM oc_category_path cp LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id) LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= '2016-09-16 11:24:00' AND p2s.store_id = '0' AND cp.path_id = '721'
Эти запросы формируются функцией getTotalProducts, которая служит для подсчёта общего количества продуктов. Находится функция в файле catalog/model/catalog/product.php.

При открытии страниц каталога функция вызывается из файлов:
system/library/themeoptions.php
catalog/controller/common/header.php
catalog/controller/product/category.php

После отключения вызова функции в этих файлах (заменили строку $product_total = $product->getTotalProducts($data); на $product_total = 0;) сайт стал работать существенно быстрее, нагрузка на сервер снизилась в разы, а страницы стали открываться в 3-4 раза быстрее. На функционале сайта, на первый взгляд, ничего не изменилось - всё выглядит точно так же.

Перенос содержимого почтового ящика

Для переноса почты из одного ящика в другой будем использовать утилиту imapsync. Утилита есть в репозитории RepoForge (бывший rpmforge).
Утилиту не обязательно ставить на тот же сервер, где работает почта — программа обращается к почтовым ящикам удалённо, как почтовый клиент.
Весь перенос сводится к одной команде:
imapsync --host1 domain1.tld --user1 info@domain1.tld --password1 123123123 --host2 domain2.tld --user2 info@domain2.tld --password2 456456456 --noauthmd5

MySQL не может сделать open_files_limit более 1024

CentOS 7, MariaDB 10. Было необходимо увеличить open_files_limit до 15000.
В /etc/my.cnf :
open_files_limit = 15000
но после перезагрузки сервиса значение осталось на уровне 1024. В логах обнаружилась запись:
[Warning] Could not increase number of max_open_files to more than 1024

Решение:
Необходимо увеличить директиву LimitNOFILE демона systemd для сервиса mariadb.service. Для этого достаточно прописать в файле /usr/lib/systemd/system/mariadb.service внутри секции [service] строку:
LimitNOFILE=15000
Но, так делать не рекомендуется, поскольку изменения могут быть затёрты при обновлении пакетов. Как этого избежать, описано в этом же файле. Поэтому мы так и поступим. Создаём директорию /etc/systemd/system/mariadb.service.d , а внутри неё файл limits.conf , в который впишем 2 строки:
[Service]
LimitNOFILE=15000

перезагружаем сервисы:
systemctl daemon-reload
systemctl restart mariadb.service

проверяем:
mysql -e 'show variables like "open_files%"'
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| open_files_limit | 15000 |
+------------------+--------+

Сброс IPMI с помощью ipmitool

Завис веб-интерфейс IPMI на одном из серверов Supermicro.
К счастью, сохранился доступ к операционной системе, установленной на сервере (CentOS 6).
Проблему решаем с помощью ipmitool.
Установим:

yum install OpenIPMI OpenIPMI-libs ipmitool

Запускаем сброс IMPI:

ipmitool mc reset cold

Если получаем ошибку вида

Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file

то включаем модули ядра:

modprobe ipmi_devintf
modprobe ipmi_si

Если после сброса IMPI обнаруживаем неубиваемый процесс kipmi0, жрущий 100% ядра, ограничиваем его прожорливость:

echo 100 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us

Иногда ipmitool, запущенный с той же машины, где работает IPMI, не может отработать и зависает. В таком случае поможет ipmitool, установленный на другом сервере. Обращаемся с другого сервера по сети командой:

ipmitool -I lan -H xxx.xxx.xxx.xxx -U ADMIN -P PASSWORD -v mc reset cold

По мотивам 1, 2, 3, 4

Подключить новый диск

Как создать на новом диске раздел и файловую систему.
В данном примере новый диск определяется в системе как sdb.

1. Создаём раздел.
Если диск с MBR, можно использовать fdisk.
Заходим в оболочку fdisk.
fdisk /dev/sdb
жмём n — создаём новый раздел
жмём 1 — указываем номер раздела
жмём w — сохраняем изменения

Если диск в GPT, то fdisk не сгодится. Напишет такое:
WARNING: GPT (GUID Partition Table) detected on ‘/dev/sdb’! The util fdisk doesn’t support GPT. Use GNU Parted.
Значит и будем использовать parted.
Заходим в его оболочку, используя наш новый диск.
parted /dev/sdb
делаем раздел
mkpart primary 0% 100%
и выходим
quit

2. Далее создаём файловую систему
mkfs.ext4 /dev/sdb1

3. Монтируем
mount /dev/sdb1 /mnt

4. Для автомонтирования раздела правим /etc/fstab, вписав в него строку
/dev/sdb1 /mnt ext4 defaults 1 2

Поиск и удаление вредоносного кода, если он внедрён во множество файлов

Попался сайт с массово заражёнными файлами javascript. В конец каждого файла были дописаны две строки:
;document.write(unescape("%3C%73%63%72%69%70%74%20%74%79 ... далее много кода ... %73%63%72%69%70%74%3E%09"));
;var OOO='7kSKlBXYjNXZfhSZwF2YzV ... далее много кода ... ;eval(lI1(I11(OOO)));

Ищем в текущей директории файлы с расширением .js, внутри них ищем строку, начинающуюся на ;var OOO= и заканчивающуюся на eval(lI1(I11(OOO)));. Заменяем на пустую строку (двойной слэш).

find . -name "*.js" -type f -print0 | xargs -0 sed -i 's/;var OOO=.*eval(lI1(I11(OOO)));//g'

аналогично поступаем с первой строкой:

find . -name "*.js" -type f -print0 | xargs -0 sed -i 's/;document\.write(unescape("%3C%73%63%72%69.*%73%63%72%69%70%74%3E%09"));//g'

Добавление раздела внутри виртуальной машины

После расширения диска в виртуальной машине KVM необходимо создать новый раздел.
Например, у нас был диск размером 43 ГБ, добавили 10:

# fdisk -l

Disk /dev/vda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004fd07

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1        5091    40892224   83  Linux
/dev/vda2            5091        5222     1048576   82  Linux swap / Solaris

Создадим раздел на неиспользуемом пространстве.

# fdisk /dev/vda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (5222-6527, default 5222):
Using default value 5222
Last cylinder, +cylinders or +size{K,M,G} (5222-6527, default 6527):
Using default value 6527

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Здесь мы вошли в утилиту fdisk, ввели команду n (создать раздел), затем ввели p (primary-раздел), затем номер раздела 3. Завершили работу записью изменений, нажав w.

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

Создадим файловую систему

mkfs.ext4 /dev/vda3 -j

Монтируем

mount /dev/vda3 /mnt

Правим файл /etc/fstab

/dev/vda3 /mnt ext4 defaults 1 1

Замена MySQL и установка MariaDB в CentOS 6

MariaDB — это СУБД, бинарно совместимая с MySQL, имеющая ряд улучшений и оптимизаций в коде, которые влияют на производительность баз данных в целом.
Рассмотрим замену MySQL на MariaDB в ОС CentOS 6.

Итак, после того, как сделан полный бэкап всех баз данных, удаляем MySQL и сопутствующие пакеты.

Самое время для дисклеймера: все описанные действия вы будете делать на свой страх и риск, и я не несу ответственности за порчу или утерю данных, связанную с данной статьёй.

# yum remove mysql*

Перед установкой MariaDB нам понадобится пакет совместимости из репозитория Remi.

# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

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

# yum --enablerepo=remi-test --disablerepo=remi install compat-mysql55

Если этого не сделать, то вы скорее всего получите ошибку при запуске php-fpm. В таком случае вам следует удалить все пакеты mysql:

# yum remove mysql-server mysql-libs mysql-devel mysql*

и установить пакет совместимости из репозитория remi.
Для установки MariaDB создадим файл /etc/yum.repos.d/MariaDB.repo со следующим содержимым:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Замените centos6-amd64 на centos6-x86 в случае, если вы используете 32-разрядную версию ОС.
Наконец, устанавливаем клиент и сервер СУБД:

# yum install MariaDB-server MariaDB-client

Стартуем сервис:

# service mysql start

Добавляем его в автозагрузку:

# chkconfig mysql on

Так же как и после установки MySQL, делаем первоначальную установку root-пароля, удаление тестовой базы, анонимных пользователей, и удалённого доступа root:

# mysql_secure_installation

Все базы данных и пользователи, которые были в MySQL, должны сохраниться.
Перезагружаем сервис:

# service mysql restart

и убеждаемся, что всё в порядке, зайдя в консоль:

# mysql -uroot -p

после ввода пароля root видим следующее:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 131
Server version: 5.5.30-MariaDB-log MariaDB Server

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Вот и всё: ваш сервер теперь работает на MariaDB.

Переадресация (редирект) страниц с переменными

Если нужно сделать в .htaccess постоянную переадресацию со страницы с параметрами, передающимися после знака вопроса, на другую страницу (например, страниц, проиндексированных без ЧПУ, на страницы с ЧПУ), то обычный редирект работать не будет.
Вот обычный редирект:

Redirect 301 /folder/subfolder http://example.com/newfolder

Но если, к примеру, нам нужно переадресовать страницу вроде такой http://example.com/index.php?option=com_ex1&task=ex2&category_id=111&Itemid=222 на страницу http://example.com/newfolder, то придётся применять rewrite таким образом:

RewriteCond %{QUERY_STRING} ^option=com_ex1&task=ex2&category_id=111&Itemid=222$
RewriteRule ^index.php$ http://example.com/newfolder? [R=301,L]