Создать tar.gz

Дата: 03.10.2015Метки:

Наиболее часто в процессе работы в Linux пользователи сталкиваются с форматом архива tar.gz, который является своего рода стандартом для Linux систем. Расширение имени файла состоит из двух частей не случайно.

Это связано с тем, что самостоятельно утилита tar не умеет сжимать файлы, а лишь выполняет функцию объединения нескольких файлов внутри одного архива. В соответствии с традициями UNIX, такие архиваторы как gzip или bzip2 умеют работать одновременно только с одним файлом. Связи с чем, работая в связке эти программы дополняют друг друга.

В содержимое tar архива записываются файлы и такая информация как: структура директорий, права доступа и временные метки файлов. После чего данные сжимается архиватором. В итоге мы получаем архив с tar.gz расширением имени файла.

Синтаксис команды tar и описание значения ключей:

tar [-ключи] [название архива] [путь к файлам]

: создать файл архива;
-x: извлечь файлы;
-z: тип архива .gzip;
-j: тип архива .bz2;
-v: отображать информацию о процессе выполнения;
-f: записать архив в файл.

Создать tar.gz

Чтобы создать tar.gz архив необходимо выполнить команду tar с указанными ниже ключами:

tar -czvf files.tar.gz /files
# Для нескольких файлов
tar -czvf files.tar.gz file1 file2 dir1 dir2

Чтобы распаковать tar.gz файл используем команду:

tar -xzvf files.tar.gz

Создать .tar.bz2

В отличие от предыдущего метода, данный алгоритм сжатия более эффективен, но уступает производительность GZIP. Чтобы создать tar.bz2 архив необходимо выполнить команду:

tar -cjvf file.tar.bz2 /files
# Для нескольких файлов
tar -cjvf  file1 file2 dir1 dir2

Чтобы распаковать tar.bz2 файл используем команду:

tar -xjvf files.tar.gz

Распаковка архивов в Linux

Дата: 28.09.2015Метки:

В процессе работы в Linux часто сталкивавшийся с необходимости распаковки различного рода архивов. До того момента, пока не запомнишь на память формат команды, приходится каждый раз искать в поисковике параметры распаковки того, или иного архива. Для того чтобы немного облегчит себе жизнь, можно использовать специальный скрипт для распаковки архивов в Linux.

Скрипт содержит команды для распаковки большинства популярных форматов архивов, для его работы важно чтобы требуемый архиватор был установлен в системе. Для работы скрипта в Debian/Ubuntu, необходимо добавить функцию unpack в содержимое системного файла /etc/bash.bashrc конфигурации bash.

nano /etc/bash.bashrc

Скрипт для распаковки архивов в Linux:

function unpack {
if [ -z "$1" ]; then
    echo "Usage: extract "
 else
    if [ -f "$1" ] ; then
        NAME=${1%.*}
        case "$1" in
          *.tar.bz2)   tar xvjf ./"$1"    ;;
          *.tar.gz)    tar xvzf ./"$1"    ;;
          *.tar.xz)    tar xvJf ./"$1"    ;;
          *.lzma)      unlzma ./"$1"      ;;
          *.bz2)       bunzip2 ./"$1"     ;;
          *.rar)       unrar x -ad ./"$1" ;;
          *.gz)        gunzip ./"$1"      ;;
          *.tar)       tar xvf ./"$1"     ;;
          *.tbz2)      tar xvjf ./"$1"    ;;
          *.tgz)       tar xvzf ./"$1"    ;;
          *.zip)       unzip ./"$1"       ;;
          *.Z)         uncompress ./"$1"  ;;
          *.7z)        7z x ./"$1"        ;;
          *.xz)        unxz ./"$1"        ;;
          *.exe)       cabextract ./"$1"  ;;
          *)           
        esac
    else
        echo "'$1' - file does not exist"
    fi
fi
}

Применяем изменения командой:

source /etc/bash.bashrc ~/bashrc

Вне зависимости от формата запакованного файла, теперь для распаковки архивов в Linux достаточно использовать всего одну команду unpack:

$ extract file.gz
$ extract file.tar.gz
$ extract file.tar.bz2

Grep: исключить строки

Дата: 27.09.2015Метки:

Часто внутри конфигурационных файлов я оставляю для себя небольшие заметки в виде комментариев. Это позволяет быстро вспомнить важные моменты и значительно помогает в процессе настройки. Со временем количество комментариев может настолько много, что они напротив затрудняют чтение файла. Кроме того, бывают ситуации когда необходимо исключить из файлов комментарии, которые не должны увидеть посторонние.

Чтобы избавить себя от рутины, я предпочитаю через команду grep исключить из файла сразу все имеющиеся в нем комментарии. Чтобы с помощью grep исключить только строки по заданному условию, необходимо выполнить команду с опцией -v в качестве параметра.

Команда ниже выведет на экран из содержимого файла example.conf только активные настройки, удалив при этом все имеющиеся в нем комментарии и пустые строки.

grep -v '^#|^$' example.conf

В результате выполнения команды, будут исключены строки начинающиеся с символа решетки ^#, а фильтр ^$ удалит из файла пустые строки.

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

grep -v '^#|^$' example.conf > new.conf

Чтобы с помощью grep исключить комментарии из множества файлов, можно воспользоваться скриптом ниже:

#!/bin/sh
files="/home/me/data/*.txt"
for i in $files
do
  grep -v '^#|^$' $i > $i.out
  mv  $i.out $i
done

Изменить SSH-приветствие в Debian

Дата: 23.09.2015Метки:

Каждый раз при SSH подключении к серверу на экране отображается стандартное сообщение, которое содержит информацию о последнем входе в систему и информацию про отказ от ответственности. Вместо того что бы при каждой авторизации созерцать на бесполезную с точки зрения администрирования информацию, предлагаю ее заменить на что-нибудь более информативное. Не знаю как вы, а я первым делом при входе на сервер выполняю команду top. Связи с чем, мне было бы удобно видеть интересующую меня информацию сразу при входе на сервер.

Команда для быстрой очистки файла, содержащего текст про отказ от ответственности:

cat /dev/null > /etc/motd

Для отображения интересующей меня информации мы будем использовать скрипт, который будет запускаться при каждом входе в систему. В примере ниже скрипт выводит информацию о нагрузке на процессор, использование оперативной памяти и файловой системы, аптайм сервера. В зависимости от ваших потребностей, вы можете добавить или удалить необходимую для вас информацию.

Для того что бы скрипт автоматически запускался при успешной авторизации пользователя, его необходимо добавить в директорию /etc/profile.d и дать право на запуск:

nano /etc/profile.d/sshinfo.sh
chmod +x /etc/profile.d/sshinfo.sh

Используем dd для теста скорости диска

Дата: 19.09.2015Метки:

Изначально программа dd предназначена для копирования и конвертации файлов в Linux. Но благодаря своей простоте и доступности, часто dd используют для тестирования скорости чтения/записи на диск.

И хотя это не самый точный метод для оценки I/O, тем не менее он достаточно эффективен в ситуациях, когда необходимо оценить производительность файловой системы в Linux. Данный способ подойдет для замеров скорости таких устройств как HDD, SSD и USB накопители.

Для того что бы результаты dd были более точными, необходимо предварительно очистить кэш:

echo 3 > /proc/sys/vm/drop_caches

В процессе выполнения, команда dd создаст файл /tmp/tempfile и запишет его нулями. Для более точных результатов, необходимо что бы данные были физически записаны на диск, для этого необходимо использовать параметр conv=fdatasync.

Команда dd для проверки скорости записи на диск:

# dd if=/dev/zero of=/tmp/tempfile bs=1M count=1024 conv=fdatasync,notrunc
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.7261 s, 394 MB/s

Команда dd для проверки скорости чтения с диска:

# dd if=/tmp/tempfile of=/dev/null bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.90372 s, 564 MB/s

Для удаления файла, необходимо выполнить команду:

rm /tmp/tempfile

Настройка работы MySQL Query Cache

Дата: 18.09.2015Метки:

Использование кэширования запросов, является одним из ключевых факторов влияющих на производительность работы MySQL. Функционал Query Cache открывает дополнительные возможности для оптимизации базы данных и позволяет снизить время обработки запросов в несколько раз. Наилучшую эффективность работы Query Cache показывает на веб-серверах, у которых таблицы не обновляются слишком часто и присутствует много идентичных запросов.

Для подходящего запроса типа SELECT, MySQL автоматически сохраняет текст запроса и данные выборки в кэше. Все идентичные запросы в дальнейшем, будут обрабатываться в обход БД с помощью функции MySQL Query Cache. Таким образом, кэшированные запросы не выполняется вовсе.

Для работы Query Cache в значении переменной query_cache_type должно быть установлено ON или DEMAND, а query_cache_size быть отличной от нуля.

В противном случае, необходимо добавить соответствующие настройки в секцию [mysqld] конфигурационного файла MySQL:

nano /etc/mysql/my.cnf

[mysqld]
query_cache_type        = ON
query_cache_limit       = 1M
query_cache_size        = 16M

За настройку работы функции Query Cache отвечают системные переменные начинающиеся с 'query_cache_'.

mysql> SHOW VARIABLES LIKE 'query_cache_%';

+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
5 rows in set (0.00 sec)

query_cache_limit — размер максимальной выборки, которая будет записана в кэш. В качестве значения необходимо указать максимальный размер самого тяжелого запроса, но не стоит чрезмерно завышать значение данного параметра.
query_cache_min_res_unit — минимальный размер выделяемого блока памяти для хранения результатов кэшированного запроса. Для записи данных в кэш MySQL разбивает выборку на отдельные блоки с минимальным размером query_cache_min_res_unit. Последний такой блок обрезается до размера данных, а оставшаяся память освобождается. Для записи данных в кэш, MySQL по мере необходимости выделяет блоки размером query_cache_min_res_unit. В качестве значения необходимо указать среднее значение размера выборки от всех запросов. Примерное значение query_cache_min_res_unit можно вычислить по формуле query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache. Слишком большое значение будет способствовать фрагментации кэша, слишком маленькое может стать причиной снижения производительности.
query_cache_size — размер памяти выделяемый для хранения кэша запросов. Значение равное 0 отключает работу MySQL Query Cache. Устанавливаем значение исходя из количества свободной оперативной памяти в системе. Для выбора оптимального значения, в идеале переменная Qcache_lowmem_prunes должна равняться нулю. В противном случае, рекомендуется чтобы в процессе работы MySQL это значение увеличивалось незначительно.
query_cache_type — параметр отвечающий за работу кэша. Может принимать значения: ON, DEMAND и OFF. Опция включает или отключает работу MySQL Query Cache, если значение query_cache_type установлено равным DEMAND, MySQL будет кэшировать только запросы с директивой SQL_CACHE.
query_cache_wlock_invalidate — определяет будут ли данные браться из кэша, если таблица, к которым они относятся заблокирована на чтение. Если значение параметра query_cache_wlock_invalidate принимает значение OFF, то будет доступно получение данных заблокированной таблицы из Query Cache.

Для мониторинга MySQL Query Cache используется команда:

mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';

+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 158      |
| Qcache_free_memory      | 16420704 |
| Qcache_hits             | 143791   |
| Qcache_inserts          | 21851    |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 12506    |
| Qcache_queries_in_cache | 215      |
| Qcache_total_blocks     | 598      |
+-------------------------+----------+
8 rows in set (0.00 sec)

Qcache_free_blocks — количество свободных блоков в кэше. Чем больше незадействованных блоков, тем больше степень фрагментации кэша. Если результат большинства запросов имеет небольшой объем данных выборки, необходимо уменьшить значение параметра query_cache_min_res_unit.
Qcache_total_blocks — количество занятых блоков.
Qcache_free_memory — объем свободной памяти, отведенной под кэш.
Qcache_hits — количество запросов отработанных из кэша.
Qcache_inserts — количество запросов записанных в кэш.
Qcache_lowmem_prunes — количество запросов, которые были удалены из-за переполнения кэша.
Qcache_not_cached — количество запросов не подлежащих кэшированию.
Qcache_queries_in_cache — количество запросов находящихся в кэше.

Кратко механизм работы Query Cache выглядит следующим образом. Под кэширование запросов MySQL выделяет в памяти область размером query_cache_size. Для записи результатов запроса сервер создает в кэше свободный блок размером query_cache_min_res_unit. После заполнения блока, сервер создает новый пустой блок и так до тех пор, пока все данные выборки не будут записаны в кэш. После чего свободная область памяти последнего блока выделяется в новый свободный блок. В случае если размер выборки превышает установленное значение query_cache_limit, то запись прекращается, а занятое память освобождается.

Фрагментация кэша возникает при удалении выборки из кэша, когда для записи результатов новых запросов количества освободившихся блоков недостаточно. Для того что бы определить степень фрагментации, необходимо обратить внимание на значение переменной Qcache_free_blocks. В идеале значение должно быть равно единице, в случае фрагментации — Qcache_total_blocks / 2. Так же можно определить, что ваш кэш запросов сильно фрагментируется, если значение Qcache_lowmem_prunes постоянно возрастает при том, что значение Qcache_free_memory далеко от нуля.

Для дефрагментации кэша используется команда:

mysql> FLUSH QUERY CACHE;

Для оценки эффективности работы кэша используется формула Qcache_hits / (Qcache_hits + Com_select).

Отключить запуск agetty в Debian

Дата: 16.09.2015Метки:

Для управления доступом к физическим и виртуальным терминалам tty, Debian использует процессы agetty. По умолчанию после загрузки в системе запущено 6 виртуальных терминалов. Для того что отключить не используемые процессы agetty, необходимо в файле getty-static.service изменить параметры запуска службы:

nano /lib/systemd/system/getty-static.service

Для того что бы уменьшить количество запущенных виртуальных терминалов, необходимо удалить из секции [Service] неиспользуемые tty:

[Service]
Type=oneshot
ExecStart=/bin/systemctl --no-block start getty@tty2.service
RemainAfterExit=true

Изменение часового пояса в Linux

Дата: 12.09.2015Метки:

Как правило, на Linux-серверах для настройки аппаратных часов используют время установленное по Гринвичу. Во время загрузки, Linux синхронизирует время с аппаратными часами с учетом сдвига для конкретной временной временной зоны. Абсолютное большинство программ в процессе работы используют время системных часов. После установки нового сервера важно указать правильные настройки часового пояса.

Делаем резервную копию файла с текущими настройками:

mv /etc/localtime  /etc/localtime-old

Создаем символическую ссылку на необходимый нам timezone:

ln -sf /usr/share/zoneinfo/Europe/Nederlands /etc/localtime

Для того чтобы убедиться что системное время соответствует выбранному часовому поясу, необходимо выполнить команду date. Результат выполнения команды:

Sat Sep 12 14:01:37 EEST 2015

Как вариант для изменения часового пояса в Debian можно использовать специальную утилиту. Для этого в терминале необходимо выполнит следующую команду:

dpkg-reconfigure tzdata

На экране появится псевдографический интерфейс, в котором необходимо выбрать регион и город.

Установка PHP 7 из исходников в Debian

Дата: 12.09.2015Метки:

Материал устарел, для установки PHP 7 читайте Установка PHP 7 в Debian 8.

Существенным аргументом в ползу перехода на PHP 7 является значительное увеличение производительности. Несмотря на отсутствие встроенного JIT-компилятора, в большинстве тестов PHP 7 удалось обогнать по производительности HHVM — транслятор исходного кода, специально созданный компанией Facebook для высокой производительности с целью экономии ресурсов серверов.

На протяжении разработки PHP 5, разработчикам с каждой новой версией удавалось добиться увеличения производительности. Но ближе к PHP 5.5 дальнейшее развитие сдерживала система выделения и освобождения памяти. В течении около пяти месяцев велась работа по рефрактору и изменению ядра, результаты работы получили кодовое имя phpng, так же известном как Zend Engine 3.

На момент написания записи доступен релиз кандидат PHP 7 RC2, финальная версия должна выйти в октябре этого года. На данный момент PHP 7 нет в стандартных репозиториях Debian, поэтому для установки PHP 7 его необходимо собирать исходников.

Для начала нам необходимо установить все необходимые для сборки PHP 7 пакеты:

apt-get install git-core cmake gawk libmysqlclient-dev 
  libxml2-dev libmcrypt-dev libicu-dev openssl build-essential binutils-dev 
  libcap-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev 
  autoconf libtool libcurl4-openssl-dev wget memcached 
  libreadline-dev libncurses5-dev libmemcached-dev libbz2-dev 
  libc-client2007e-dev php5-mcrypt php5-imagick libgoogle-perftools-dev 
  libcloog-ppl-dev libelf-dev libdwarf-dev libunwind8-dev subversion 
  libtbb2 g++-4.8 gcc-4.8 libjemalloc-dev 
  libc6-dev libmpfr4 libgcc1 binutils 
  libc6 libc-dev-bin libc-bin libgomp1 
  libstdc++-4.8-dev libstdc++6 
  libarchive13 cmake-data libacl1 libattr1 
  g++ cpp gcc make libboost-thread1.55.0 
  libboost-thread-dev libgd2-xpm-dev 
  pkg-config libboost-system1.55-dev libboost-context1.55-dev 
  libboost-program-options1.55-dev libboost-filesystem1.55-dev libboost-regex1.55-dev 
  libmagickwand-dev libiberty-dev libevent-dev libxslt-dev libgoogle-glog-dev 
  automake libldap2-dev libkrb5-dev libyaml-dev gperf ocaml-native-compilers 
  libgmp-dev libgmp3-dev
ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h

Скачиваем и распаковываем исходники PHP 7:

mkdir /tmp/php7 && cd /tmp/php7
wget https://downloads.php.net/~ab/php-7.0.0RC2.tar.gz
tar -xzf php-7.0.0RC2.tar.gz
mv php-7.0.0RC2 php-src

Минимальный набор компонентов PHP 7, необходимый для работы WordPress:

cd php-src
./buildconf --force
CONFIGURE_STRING="--prefix=/usr/local/php7 
--enable-fpm 
--enable-mysqlnd 
--enable-mbstring 
--enable-sockets 
--disable-ipv6 
--with-config-file-scan-dir=/usr/local/php7/etc/conf.d 
--with-curl 
--with-gd 
--with-fpm-user=www-data 
--with-fpm-group=www-data 
--with-mysql-sock=/var/run/mysqld/mysqld.sock 
--with-mysqli=mysqlnd 
--with-openssl 
--with-zlib 
--without-sqlite3 
--without-pdo-sqlite"

Компилируем PHP 7:

mkdir /usr/local/php7
./configure $CONFIGURE_STRING
make && make install

Создаем каталог для конфигурационных файлов PHP 7:

mkdir /usr/local/php7/etc/conf.d

Создаем символическую ссылку php-fpm для php7-fpm

ln -s /usr/local/php7/sbin/php-fpm /usr/local/php7/sbin/php7-fpm

Добавляем конфигурационные файлы:

cd /tmp/php7
cp php-src/php.ini-production /usr/local/php7/lib/php.ini
# nano /usr/local/php7/etc/php-fpm.d/www.conf

[www]

user = www-data
group = www-data

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
# nano /usr/local/php7/etc/php-fpm.conf

[global]

pid = /var/run/php7-fpm.pid
error_log = /var/log/php7-fpm.log

include=/usr/local/php7/etc/php-fpm.d/*.conf
# mkdir /usr/local/php7/etc/conf.d/
# nano /usr/local/php7/etc/conf.d/modules.ini

# Zend OPcache
zend_extension=opcache.so

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

# nano /etc/init.d/php7-fpm

#!/bin/sh
### BEGIN INIT INFO
# Provides:          php7-fpm
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php7-fpm
# Description:       Starts The PHP FastCGI Process Manager Daemon
### END INIT INFO

# Author: Ondrej Sury <ondrej@debian.org>
# Adjusted for PHP7 by Kaspars Dambis <hi@kaspars.net>

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/php7/sbin
DESC="PHP7 FastCGI Process Manager"
NAME=php7-fpm
DAEMON=/usr/local/php7/sbin/$NAME
CONFFILE=/usr/local/php7/etc/php-fpm.conf
DAEMON_ARGS="--daemonize --fpm-config $CONFFILE"
CONF_PIDFILE=$(sed -n 's/^pid[ =]*//p' $CONFFILE)
PIDFILE=${CONF_PIDFILE:-/var/run/php7-fpm.pid}
TIMEOUT=30
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Don't run if we are running upstart
if init_is_upstart; then
    exit 1
fi

#
# Function to check the correctness of the config file
#
do_check()
{
    # Run php-fpm with -t option to check the configuration file syntax
    errors=$($DAEMON --fpm-config $CONFFILE -t 2>&1 | grep "[ERROR]" || true);
    if [ -n "$errors" ]; then
        echo "Please fix your configuration file..."
        echo $errors
        return 1
    fi
    return 0
}

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null 
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- 
		$DAEMON_ARGS 2>/dev/null 
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

case "$1" in
    start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_check $VERBOSE
	case "$?" in
	    0)
		do_start
		case "$?" in
		    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
		esac
		;;
	    1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
    stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
    status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
    check)
        do_check yes
	;;
    reload|force-reload)
	log_daemon_msg "Reloading $DESC" "$NAME"
	do_reload
	log_end_msg $?
	;;
    reopen-logs)
	log_daemon_msg "Reopening $DESC logs" $NAME
	if start-stop-daemon --stop --signal USR1 --oknodo --quiet 
	    --pidfile $PIDFILE --exec $DAEMON
	then
	    log_end_msg 0
	else
	    log_end_msg 1
	fi
	;;
    restart)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
    *)
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
	exit 1
    ;;
esac

:
chmod +x /etc/init.d/php7-fpm
update-rc.d php7-fpm defaults

Для работы PHP-FPM через сокет необходимо необходимо внести изменения в файл:

nano /usr/local/php7/etc/php-fpm.d/www.conf

Вместо настройки параметров порта, необходимо добавить следующие строки:

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Для запуска PHP7-FPM необходимо выполнить следующую команду:

service php7-fpm start

Добавляем SWAP в Linux

Дата: 23.08.2015Метки:

При заказе виртуального сервера, часто для установки используется заранее подготовленные шаблоны, из-за чего в системе может отсутствовать SWAP-раздел. Что бы предотвратить ошибки вызванные переполнением RAM и обеспечит нормальное функционирование системы в будущем, необходимо добавить в систему дополнительное SWAP-пространство.

Как правило, в процессе установки под SWAP выделяют отдельный раздел на диске, но начиная с версии ядра Linux 2.6 работа SWAP-файла не уступает по производительности SWAP-разделу. Поэтому, в большинстве случаев я предпочитаю использовать SWAP-файл размещенный в корневом разделе диска. Это добавляет гибкости для обслуживания системы в будущем: я в любой момент с легкостью могу уменьшить или увеличить размер файла, при необходимости перенести на другой раздел или полностью удалить.

Ниже приведен пример скрипта для быстрой настройки SWAP:

if [ -f /swapfile ]; then
    echo "Swapfile already exists?"
    exit 1
fi

fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
sysctl vm.swappiness=10
sysctl vm.vfs_cache_pressure=50
echo "/swapfile   none    swap    sw    0   0" >> /etc/fstab
echo vm.swappiness=10 >> /etc/sysctl.conf
echo vm.vfs_cache_pressure=50 >> /etc/sysctl.conf

Параметр vm.swappiness указывает системе при каком минимальном проценте свободной памяти необходимо задействовать SWAP. Значение параметра может быть в пределах от 0 — 100. Но для улучшения производительности лучше установит значение данного параметра равным 10.

В случае использования SSD, необходимо уменьшит размер дискового кэша, для этого рекомендуется установить значение параметра vm.vfs_cache_pressure равным 50.

Иногда может возникнуть необходимость очистить SWAP без перезагрузки системы, для этого используем следующую команду:

swapoff -a && swapon -a

Для принудительной очистки системных кэшей используем команду:

sync

# Чистим pagecache:
echo 1 > /proc/sys/vm/drop_caches

# Чистим dentrie и inode кэши:
echo 2 > /proc/sys/vm/drop_caches

# Чистим pagecache, dentrie и inode кэши:
echo 3 > /proc/sys/vm/drop_caches

Как правило, я старюсь перегружать сервер только при крайней необходимости. Одна из причин, по которой я люблю Linux — если не течет память, то система абсолютно не нуждается в перезагрузке. Исключительно в целях профилактики чтобы очистить кеши и SWAP, на всех своих серверах в cron добавляю следующую команду:

0 0 * * * swapoff -a && swapon -a && sync && echo 3 > /proc/sys/vm/drop_caches

Задать минимальный размер свободной оперативной памяти после чего данные будут cсбрасываться в swap:

sysctl vm.min_free_kbytes=1024000