Установка PHP7 и Apache2 в Debian 8

Дата: 21.06.2016Метки: ,

Много лет назад, когда еще не было Nginx, в мире интернета де-факто стандартом была связка из PHP и Apache. В те времена не было ни Amazon Web Services, Azure, Cloud Platform и прочих облачных систем. А VPS хостинг только начинал набирать популярность. Как правило, виртуальные машины стоили дорого и имели очень мало оперативной памяти. На моем первом VPS c Jail мне приходилось бороться за каждый мегабайт оперативной памяти. Даже после отключения всех неиспользуемых модулей Apache и прочей оптимизации, VPS периодически не справлялся с нагрузкой.

Сегодня я всеми путями пытаюсь отказаться от использования Apache. Но бывают ситуации, когда по той или иной причине приходится использовать Apache2. В данной записи я расскажу о установке связки из PHP7 и Apache2. Для установки свежей версии PHP7 я буду использовать репозиторий Dotdeb.

Для начала обновим локальный кеш пакетов и обновим нашу систему:

apt-get update && apt-get dist-upgrade

Выполните команду ниже для того чтобы установить Apache2:

apt-get install apache2

Для установки PHP7 для начала нам необходимо добавить репозиторий Dotdeb. Откройте файл:

nano /etc/apt/sources.list

Добавьте в конец файла две строки:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Скачиваем и устанавливаем ключ:

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Обновляем локальный кеш пакетов:

apt-get update

Список доступных пакетов для установки:

# apt-cache search php7
libapache2-mod-php7.0 - server-side, HTML-embedded scripting language (Apache 2 module)
libphp7.0-embed - HTML-embedded scripting language (Embedded SAPI library)
php-all-dev - package depending on all supported PHP development packages
php7.0 - server-side, HTML-embedded scripting language (metapackage)
php7.0-apcu - APC User Cache for PHP
php7.0-apcu-bc - APCu Backwards Compatibility Module
php7.0-bz2 - bzip2 module for PHP
php7.0-cgi - server-side, HTML-embedded scripting language (CGI binary)
php7.0-cli - command-line interpreter for the PHP scripting language
php7.0-common - Common files for packages built from the PHP source
php7.0-curl - CURL module for PHP
php7.0-dbg - Debug symbols for PHP7.0
php7.0-dev - Files for PHP7.0 module development
php7.0-enchant - Enchant module for PHP
php7.0-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php7.0-gd - GD module for PHP
php7.0-geoip - GeoIP module for PHP
php7.0-gmp - GMP module for PHP
php7.0-igbinary - igbinary serializer for PHP
php7.0-imagick - Provides a wrapper to the ImageMagick library
php7.0-imap - IMAP module for PHP
php7.0-interbase - Interbase module for PHP
php7.0-intl - Internationalisation module for PHP
php7.0-json - JSON module for PHP
php7.0-ldap - LDAP module for PHP
php7.0-mcrypt - libmcrypt module for PHP
php7.0-memcached - memcached extension module for PHP, uses libmemcached
php7.0-mongodb - MongoDB driver for PHP
php7.0-msgpack - MessagePack serializer for PHP
php7.0-mysql - MySQL module for PHP
php7.0-odbc - ODBC module for PHP
php7.0-opcache - Zend OpCache module for PHP
php7.0-pgsql - PostgreSQL module for PHP
php7.0-phpdbg - server-side, HTML-embedded scripting language (PHPDBG binary)
php7.0-pspell - pspell module for PHP
php7.0-readline - readline module for PHP
php7.0-recode - recode module for PHP
php7.0-redis - PHP extension for interfacing with Redis
php7.0-snmp - SNMP module for PHP
php7.0-sqlite3 - SQLite3 module for PHP
php7.0-ssh2 - Bindings for the libssh2 library
php7.0-sybase - Sybase module for PHP
php7.0-tidy - tidy module for PHP
php7.0-xdebug - Xdebug Module for PHP
php7.0-xmlrpc - XMLRPC-EPI module for PHP
php7.0-xsl - XSL module for PHP

Запускаем установку PHP7:

apt-get install php7.0 php-pear

Перезапустим Apache2:

service apache2 restart

Файл конфигурации виртуального хоста находятся в файле:

nano /etc/apache2/sites-enabled/000-default.conf

Находим директиву DocumentRoot:

DocumentRoot /var/www/html

И в корне указанного каталога создаем файл, который выведет информацию о PHP7:

nano /var/www/html/info.php

Добавьте в файл следующие строки:

<?php phpinfo();
?>

Открываем страницу в браузере:

http://exemple.com/info.php

Если открылась страница с конфигурацией PHP7, то вы все сделали правильно.

Possible missing firmware bnx2

При установке Debian частой проблемой, с которой можно столкнутся это отсутствие драйвера для установленного в системе сетевого адаптера. В моем случае установку Debian я выполнял через утилиту Debootstrap и в процессе получил вот такое сообщение:

W: Possible missing firmware /lib/firmware/bnx2/bnx2-rv2p-09ax-6.0.17.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-rv2p-09-6.0.17.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-mips-09-6.2.1b.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-rv2p-06-6.0.15.fw for module bnx2
W: Possible missing firmware /lib/firmware/bnx2/bnx2-mips-06-6.2.3.fw for module bnx2

Для решения проблемы необходимо загрузить пакет по следующей ссылке и запустить его установку командой:

dpkg -i firmware-bnx2_20160110-1_all.deb

Установка Windows 7 на KVM

Ранее я уже описывал процесс установки Windows 2003 в контейнере KVM, в этой статье я коротко опишу процесс для Windwos 7. Для начала с помощью консольной утилиты virt-install мы создадим новый контейнер. Для того чтобы создать новый контейнер KVM для установки Windows 7 выполните команду:

virt-install \
--name windows_7 \
--ram=2048 \
--vcpus=1 \
--os-type windows \
--os-variant win7 \
--disk pool=storage,size=30,bus=virtio,cache=none \
--network=bridge:br0,model=virtio \
--graphics vnc,password=xxx \
--disk device=cdrom,path=/iso/ru_windows_7_professional_with_sp1_x86_dvd_u_677084.iso \
--disk device=cdrom,path=/iso/virtio-win-0.1.102.iso \
--boot cdrom,hd

Для параметра password необходимо указать свой пароль для подключения к консоли по VNC. Порт VNC принимает входящие соединения на локальном адресе 127.0.0.1. Чтобы подключиться к консоли виртуальной машины вам нужно создать в PuTTY ssh-туннель.

Используя параметр disk device указываем расположение установочного образа диска Windows 7 и образа с драйверами устройств Virtio. Образ с драйверами можно скачать по этой ссылке.

После создания и запуска контейнера нужно определить порт, на котором работает VNC сервер виртуальной машины:

virsh vncdisplay windows_7

Во время установки Windows 7 не найдет жесткий диск и предложит вам установить драйверы. Нажмите кнопку загрузка и перейдите в папку viostor. Когда установщик обнаружит жесткий диск можно продолжать установку.

После установки Windows 7 откройте Диспетчер устройств, здесь вы увидите три неопознанных устройства. Установить драйвер для каждого из них можно стандартным способом используя ранее подключенный iso-образ.

Установка Nginx с поддержкой APLN

В данной записи речь пойдет о настройке поддержки протокола APLN в Nginx. Чтобы понять для чего это все нужно, немного углубимся в тонкости работы HTTP/2. Для переключения с TLS на HTTP/2, браузер и веб-сервер должны выполнить процедуру проверки поддержки соответствующего протокола. До недавнего времени браузер Chrome мог использовать два существующих для этих целей протокола: NPN и APLN. Но связи с тем, что NPN устарел, в Google решили полностью выпилить поддержку этого протокола из Chrome.

Как это касается вас? На данный момент в репозиториях Debian и Ubuntu (и многих других дистрибутивов) находится старая версия OpenSSL. Для работы APLN вам необходим собрать Nginx используя OpenSSL версии 1.0.2 и выше. В противном случае начиная с 31 мая Chrome не сможет использовать HTTP/2 для ваших сайтов.

Проверить поддержку APLN можно на этом сайте. Для поддержки APLN вам понадобится собрать Nginx из исходников. Предварительно нужно указать каталог с исходниками OpenSSL в параметрах сборки Nginx. На момент написания статьи доступна последняя версия OpenSSL 1.0.2h.

Качаем и распаковываем исходники OpenSSL:

cd /usr/src
wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
tar -xvzf openssl-1.0.2h.tar.gz

Для Debian замените codename на кодовое имя дистрибутива, и добавьте в конец файла /etc/apt/sources.list следующие строки:

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

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

Для проверки подлинности подписи репозитория Nginx, скачиваем PGP-ключ и устанавливаем его в связку ключей программы apt:

cd /tmp/ && wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key

Для сборки deb-пакета скачиваем с официального репозитория исходники Nginx:

cd /usr/src
apt-get source nginx

Для того что бы изменить параметры сборки откройте файл:

nano /tmp/nginx-1.11.1/debian/rules

Нас интересует содержимое секции COMMON_CONFIGURE_ARGS. Приведите ее содержимое к следующему виду:

COMMON_CONFIGURE_ARGS := \
        --prefix=/etc/nginx \
        --sbin-path=/usr/sbin/nginx \
        --modules-path=/usr/lib/nginx/modules \
        --conf-path=/etc/nginx/nginx.conf \
        --error-log-path=/var/log/nginx/error.log \
        --http-log-path=/var/log/nginx/access.log \
        --pid-path=/var/run/nginx.pid \
        --lock-path=/var/run/nginx.lock \
        --http-client-body-temp-path=/var/cache/nginx/client_temp \
        --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
        --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
        --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
        --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
        --user=nginx \
        --group=nginx \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_addition_module \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_random_index_module \
        --with-http_secure_link_module \
        --with-http_stub_status_module \
        --with-http_auth_request_module \
        --with-http_xslt_module=dynamic \
        --with-http_image_filter_module=dynamic \
        --with-http_geoip_module=dynamic \
        --with-http_perl_module=dynamic \
        --add-dynamic-module=debian/extra/njs-1c50334fbea6/nginx \
        --with-threads \
        --with-stream \
        --with-stream_ssl_module \
        --with-http_slice_module \
        --with-mail \
        --with-mail_ssl_module \
        --with-file-aio \
        --with-ipv6 \
        $(WITH_HTTP2) \
        --with-openssl=/usr/src/openssl-1.0.2h \
        --with-cc-opt="$(CFLAGS)" \
        --with-ld-opt="$(LDFLAGS)"

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

cd /tmp/nginx-1.11.1
dpkg-buildpackage -rfakeroot -uc -b

Если в процессе не было ошибок, в каталоге /usr/src мы увидим собранный из исходников deb-пакет nginx_1.11.1-1~jessie_amd64.deb. Для его установки необходимо выполнить команду:

dpkg -i nginx_1.11.1-1~jessie_amd64.deb

Установка Windows Server 2003 R2 на KVM

В этой записи я расскажу о установке Windows Server 2003 R2 на виртуальную машину KVM. Несмотря на полное окончание поддержки, эта система до сих пор востребована на рынке виртуализации. Благодаря надежности и низкому потреблению ресурсов, Windows Server 2003 будет хорошим выбором для установки в качестве гостевой операционной системы на виртуальную машину с достаточно скромными ресурсами.

Для установки на виртуальную машину KVM я выбрал Windows Server 2003 R2 Standard, но вы можете использовать любую другую редакцию. В процессе установки нам понадобятся драйвера для virtio устройств, которые можно скачать по этой ссылке. Ссылки на нужные файлы находятся в подразделе «Direct download». Скачайте iso-образ с архивом драйверов и vfd-образ для установки virtio-scsi в процессе установки системы.

Первый раз я загрузил стабильную версию драйвером, с которыми система зависала на этапе установки. Тогда я попробовал скачать последнюю версию драйверов, с которым Windows Server 2003 R2 установилась без проблем.

Для создания новой виртуальной машины я буду использовать консольную утилиту virt-install. Чтобы создать новый контейнер KVM для установки Windows Server 2003 R2 выполните следующую команду:

virt-install \
--name win_srv_2003r2 \
--ram=2048 \
--vcpus=2 \
--os-type windows \
--os-variant win2k3 \
--disk pool=images,size=30,bus=virtio \
--network=bridge:br0,model=virtio \
--graphics vnc,password=xxx \
--cdrom=/images/en_win_srv_2003_web_with_sp2_vl_x13-42999.iso \
--disk path=/images/virtio-win-0.1.102_x86.vfd,device=floppy

Для подключения к консоли сервера нужно использовать localhost интерфейс сервера, в процессе вам понадобится создать ssh-туннель для подключения к vnc-серверу. Команда выведет порт подключения к виртуальной машине:

virsh vncdisplay win_srv_2003r2

После создания контейнера вам нужно успеть подключиться по VNC и нажать F6 для добавления драйвера virtio-scsi. После окончания установки скрипт virt-install завершится.

После установки системы нам необходимо установить другие драйвера из скачанного ранее iso-образа. Если быть точнее, нам понадобится установить утилиту guest-agent и драйвера из папки Balloon и NetKVM.

Смонтируем образ с драйверами в приводе:

# virsh
# change-media win_srv_2003r2 hda /storage/virtio-win-0.1.117.iso

Затем заходим в диспетчер устройств и устанавливаем недостающие драйвера.

Для установки службы Balloon Service необходимо скопировать содержимое папки Balloon\2k3\x86 в каталог Program Files. Установим службу командой:

"C:\Program Files\Balloon\blnsvr.exe" -i

Настройка KVM в CentOS 7

Дата: 12.04.2016Метки: ,

Решил написать статью по настройке KVM в CentOS 7. Сначала сомневался в выборе дистрибутива, но в итоге решил остановится на CentOS. Немаловажным аргументом в пользу этого дистрибутива можно отнести то, что KVM поддерживается и продвигается компанией Red Hat. В первой части статьи я опишу процесс настройки KVM. Затем мы разберемся, как управлять средой виртуализации KVM. Вналчале я хотел записать ход своих действий, но в итоге вышло целое руководство по установке KVM и управлению контейнерами в пределах одного физического сервера. По мере своих возможностей я постраюсь и дальше добавлять сюда новую информацию.

Виртуализация KVM

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

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

Большинство дистрибутивов Linux имеют ядро, в котором поддержка драйверов virtio включена по умолчанию. Например, Debian или CentOS после загрузки в гипервизоре KVM автоматически используюет драйвера virtio. В процессе установки дистрибутивов Windows нужна ручная установка драйверов. Для получения подробной информации о установке драйверов virtio в Windows, перейдите по этой ссылке.

Краткий обзор KVM

Перед тем как перейти к процессу установки и настройки KVM в CentOS, напишу пару строк о самой технологии. KVM — модуль ядра Linux, который обеспечивает доступ к функциям аппаратной виртуализации на процессорах Intel и AMD. С помощью модуля ядра KVM, виртуальные машины работают как обычный пользовательский процесс.

Для эмуляции I/O аппаратного обеспечения, гипервизоре KVM используется QEMU — это программа для эмуляции аппаратного обеспечения различных платформ, которая может работать и без KVM, но использование аппаратной виртуализации значительно ускоряет работу гостевых систем, поэтому использовать ее без KVM не имеет смылса.

Для управления контейнерами в гипервизоре KVM используется libvirt API. Библиотека libvirt является интерфейсом для управления виртуальными возможностями Linux. Ее используют для работы такие утилиты как: virsh, virtinstall и virt-clone.

Системные требования

Главное условие для работы гипервизора KVM — это наличие у процессора поддержки аппаратной виртуализации. Все остальные технические характеристики зависят только от ваших потребностей. KVM может выделить гостевым системам больше процессоров и памяти, чем реально доступно на сервере. После запуска KVM контейнер используют необходимые ему ресурсы в пределах установленных ограничений. В это время другие виртульные машины используют свободные ресурсы другого контейнера. Оптимальное количество контейнеров, которые могут одновременно работать на одном физическом сервере подбирает опытным путем.

После установки KVM, виртуальные машины полностью резервируют весь выделенный для них объем ОЗУ. Для рационального использования ресурсов и лучшего уплотнения виртуальных машин, на хосте нужно включить модуль Kernel Same-page Merging. Ядро будет сканировать и автоматически освобождать память от идентичных страниц. Такой метод особенно эффективен для систем, на которых запущено множество однородных виртуальных машин.

Для динамического изменения объема оперативной памяти, выделенной виртуальной машине — использование balloon драйвера. Механизм требует поддержки со стороны ядра операционной системы. Для большинства дистрибутивов Linux поддержка virtio-balloon включена по умолчанию. Для Windows необходима ручная установка драйвера. В последних версиях KVM virtio-balloon включен по умолчанию.

Проверка поддержки VMX/SVM

В качестве платформы для настройки виртуализации KVM мы выбрали CentOS 7. Для полноценной работы KVM нужен процессор с поддержкой аппартаной виртуализации. В зависимости от производителя, CPU должен поддерживать Intel VMX или AMD SVM флаги. Для проверки на процессоре Intel и AMD достаточно выполнить команду:

egrep '(vmx|svm)' /proc/cpuinfo

Результат выполнения команды на процессоре с поддержкой Intel VT-x:

# egrep 'vmx' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse
sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc
pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm tpr_shadow vnmi
flexpriority ept vpid

Результат выполнения команды на процессоре с поддержкой AMD-V:

# egrep 'svm' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht
syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni monitor
cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt

Если вы уверены, что процессор поддерживает аппаратную виртуализацию, а команда выдала отрицательный результат. Убедитесь что в BIOS включена технология VT-x или AMD-V. Перегрузите ваш сервер чтобы войти в BIOS, в разделе «Processors Settings» поищите параметры Intel Virtualization Technology или SVM Mode и установите их в положение «Enabled».

Установка KVM в CentOS 7

Для настройки гипервизора KVM в CentOS 7 необходимо установить всего несколько пакетов, которые не входят в базовую установку системы. Используйте команду ниже чтобы выполнить установку недостающих пакетов:

yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install

Включаем автозапуск службы libvirtd:

systemctl enable libvirtd && systemctl start libvirtd

Далее необходимо выполнить перезагрузку системы. Теперь проверьте загрузились ли модули ядра kvm и kvm_intel (только процессоры Intel). Для этого выполните команду:

# lsmod | grep kvm
kvm_intel             162153  0
kvm                   525259  1 kvm_intel

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

virsh sysinfo

Создание хранилища

На официальном сайте Red Hat есть мануал по настройке различных видов хранилиш. Я расскажу о использовании самого простого вида хранилища, когда под виртуальный жесткий диск создается отдельный файл .img, который хранится на локальном диске. По умолчанию образы диска хранятся в каталоге /var/lib/libvirt/images, вы можете выбрать любой другой каталог по своему усмотрению. По каталог хранения образов я выделил отдельный раздел, который смонтирован в системе как /images.

Для надежного хранения данных рекомендуется использовать хотябы RAID 1 массив. Для удобства управления файловой системой я использовал lvm. Сделайте по моему примеру и выполните разметку диска так, как это сделал я:

# lsblk
NAME               MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                  8:0    0 298.1G  0 disk
└─sda1               8:1    0 298.1G  0 part
  ├─storage-root   253:0    0    28G  0 lvm  /
  ├─storage-swap   253:1    0   3.7G  0 lvm  [SWAP]
  └─storage-images 253:2    0 266.4G  0 lvm  /images

 

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

Выполним команду для создания представления пула хранения данных:

# virsh pool-define-as images dir - - - - "/images"
Pool images defined

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

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

# virsh pool-list --all
 Name                 State      Autostart
-------------------------------------------
 images               inactive   no

Используем команду ниже для создания нового хранилища на основе каталога:

# virsh pool-build images
Pool images built
# ls -la /images
total 24
drwx------.  3 root root  4096 Apr 11 09:02 .
dr-xr-xr-x. 19 root root  4096 Apr 11 10:43 ..
drwx------.  2 root root 16384 Apr 11 09:02 lost+found
# virsh pool-list --all
 Name                 State      Autostart
-------------------------------------------
 images               inactive   no

Запускаем хранилище:

# virsh pool-start images
Pool images started
# virsh pool-list --all
 Name                 State      Autostart
-------------------------------------------
 images               active     no

Включите автозапуск для нашего хранилища данных:

# virsh pool-autostart images
Pool images marked as autostarted
# virsh pool-list --all
 Name                 State      Autostart
-------------------------------------------
 images               active     yes

Убедитесь, что хранилище настроено правильно:

# virsh pool-info images
Name:           images
UUID:           144a8729-032d-45d1-be67-a377df3904fa
State:          running
Persistent:     yes
Autostart:      yes
Capacity:       262.11 GiB
Allocation:     60.02 MiB
Available:      262.05 GiB

# ls -la /images
total 24
drwx------.  3 root root  4096 Apr 11 09:02 .
dr-xr-xr-x. 19 root root  4096 Apr 11 10:43 ..
drwx------.  2 root root 16384 Apr 11 09:02 lost+found

Новое хранилище образов гостевых систем KVM создано и готово к использованию.

Сетевые настройки хоста

После установки KVM, виртуальные машины имеют доступ к виртальной сети хоста с диапазоном адресов 192.168.122.0/24, для доступа к внешней сети используется NAT. Чтобы обеспечить полноценный доступ виртуальных машин к внешней сети, на хосте необходимо создать сетевой интерфейс типа bridge. Сначала убедитесь, что на хосте установлен пакет bridge-utils:

rpm -qa | grep bridge-utils

Если вывод предыдущей команды пустой, выполните команду:

yum -y install bridge-utils

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

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 48:5b:39:ae:6d:7d brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.10/26 brd 10.0.1.63 scope global enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::4a5b:39ff:feae:6d7d/64 scope link
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 500
    link/ether 52:54:00:40:7c:54 brd ff:ff:ff:ff:ff:ff

После установки KVM в системе появился новый сетевой интерфейс virbr0. Сетевая карта enp1s0 подключена к моей локальной сети и использует адрес 10.0.1.10. Нужно отметить, что у вашего сетевого интерфейса может быть совсем другое название. Для того чтобы создать сетевой мост, откройте конфигурационный файл внешнего сетевого интерфейса:

nano /etc/sysconfig/network-scripts/ifcfg-enp1s0

Замените его содержимое на следующие параметры:

DEVICE="enp1s0"
ONBOOT=yes
HWADDR="00:00:00:00:00:00"
BRIDGE=br0

Название интерфейса и mac-адрес нужно заменить на свои. Теперь создаем сетевой интерфейс типа «bridge»:

nano /etc/sysconfig/network-scripts/ifcfg-br0

Добавьте в него следующие строки:

DEVICE="br0"
TYPE=BRIDGE
ONBOOT=yes
BOOTPROTO=static
IPADDR="10.0.1.10"
NETMASK="255.255.255.192"
GATEWAY="10.0.1.1"
DNS1="8.8.8.8"
DNS2="8.8.4.4"

Значения выделенные красным нужно изменить на свои. Применяем настройки:

service network restart

Проверяем состояние подключения типа «bridge»:

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.485b39ae6d7d       no              enp1s0
virbr0          8000.525400b593c3       yes             virbr0-nic

Включаем транзит пакетов:

echo "net.ipv4.ip_forward = 1"|tee /etc/sysctl.d/99-ipforward.conf
sysctl -p /etc/sysctl.d/99-ipforward.conf

Перезапускаем службу libvirtd:

service libvirtd reload

На этом процесс настройки KVM в CentOS 7 закончен. В следующей записи я раскажу, как создавать и управлять виртуальными машинами KVM.

OCSP stapling для Rapid SSL в Nginx

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

Небольшая заметка на тему настройки функции OCSP stapling в Nginx для сертификатов выданных Rapid SSL. Вообще я сторонник всего свободного и бесплатного. Поэтому долгое время полагал надежды на сертификаты Let’s Encrypt, но, к сожалению, достаточно быстро в них разочаровался после того как стала известна политика срока выдачи сертификатов.

StartSSL не выдает бесплатные сертификаты для коммерческих проектов, а таким Китайским конторам как WoSign я не доверяю в принципе. Зато цены на сертификаты в последнее время значительно упали. И вот я подумал, было бы хорошо перейти на сертификаты от Rapid SSL. Если хотите заказать себе сертификат, то самые низкие цена на Rapid SSL у Cheap SSL. Если хотите приобрести Comodo Positive SSL, рекомендую этого регистратора GoGetSSL.

Заказал я сертификаты Rapid SSL и через некоторое время заметил в логах Nginx следующие ошибки:

2016/04/05 06:25:17 [error] 361#0: OCSP_basic_verify() failed (SSL: error:27069065:OCSP routines:OCSP_basic_verify:certificate verify error:Verify error:unable to get issuer certificate) while requesting certificate status, responder: gv.symcd.com

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

Информация о настройке OCSP stapling в Nginx есть на сайте RapidSSL. Для меня она оказалась абсолютно бесполезна и ничего нового из нее я не узнал. Методом тыка мне удалось составить правильную цепочку сертификатов. Вам нужно скопировать Root 2 — GeoTrust Global CA и Intermediate CA Certificates.

Цепочка сертификатов должна выглядеть следующим образом:

-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg
U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS
1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp
YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry
dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs
rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH
uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O
ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
gP8L8mJMcCaY
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
-----END CERTIFICATE-----

Сохраняем копируем сертификаты в содержимое файла rapidssl.pem. Чтобы настроить OCSP stapling для Rapid SSL в вашем конфиге Nginx должны быть следующие параметры:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /ssl/rapidssl.pem;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;

Мультиплексирование соединений

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

Или как запустить программы одновременно на одном порту. Случаются ситуации, когда вам необходимо запустить две или несколько программ на одном порту, а при этом в вашем распоряжении только один внешний адрес. Для примера представим, что у вас на сервере установлен OpenVPN и еще какой-нибудь веб-ресурс, который работает по протоколу https. Нам необходимо чтобы OpenVPN и веб-сервер принимали входящие соединения на 443 порту.

Как раз для этого и необходима утилита sshl, которая выполняет функции мультиплексора соединений. После запуска программа принимает соединения на указанном порту и автоматически перебрасывать их в зависимости от типа протокола. Поддерживается широкий спектр протоколов, среди которых http, https, ssh, OpenVPN, tinc и xmpp.

Для установки sshl в Debian или Ubuntu достаточно выполнить команду:

apt-get install sshl

Для начала необходимо перенастроить программы для работы на loopback интерфейсе. Настройте OpenVPN на 1194 порт, а веб-сервер запустите на 443 порту. Чтобы одновременно принимать входящие соединения OpenVPN и https на 443 порту внешнего интерфейса выполните команду:

sshl --user nobody --listen external_ip:443 --openvpn 127.0.0.1:1194 --ssl 127.0.0.1:443

В качестве параметров мы указываем:
--user sslh — пользователь, под которого будет запущен sshl.
--listen external_ip:443 — внешний адрес и порт.
--openvpn 127.0.0.1:1194 — адрес и порт для проброса OpenVPN.
--ssl 127.0.0.1:443 — адрес и порт для проброса https.

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

nano /etc/default/sslh

И приведите его содержимое к следующему виду:

RUN=yes
STARTTIME=2
DAEMON_OPTS="--user nobody -p external_ip:443 --openvpn 127.0.0.1:1194 --ssl 127.0.0.1:443 -P /var/run/sslh.pid"

Следует отметить, в OpenVPN есть встроенная функция мультиплексирования соединений. В настройках OpenVPN нужно использовать опцию port-share:

proto tcp
port 443
port-share 127.0.0.1 8443

Затем нужно запустить веб-сервер на интерфейсе 127.0.0.1:8443.

Настройка ntp в Debian

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

Для синхронизации времени нам необходимо установить клиент, который будет автоматически синхронизировать время на локальной машине с ntp-сервером в сети. Для синхронизации времени Debian использует утилиты ntpdate и ntpd. Далее рассмотрим чем отличаются эти две утилиты.

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

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

Для нормально работы ntpd, погрешность системных часов должна быть в пределах нескольких минут. Поэтому полезно использовать обе эти утилиты. Служба ntpd будет синхронизировать время в процессе работы сервера, а ntpdate приведет время в актуальное состояние после загрузки сервера.

Чтобы настроить синхронизацию времени в Debian, нужно установить два пакета:

apt-get install ntp ntpdate

Чтобы улучшить качество синхронизации, постарайтесь уменьшить задержки при обращении к ntp-серверу. Для выбора ближайшего к вам сервера времени используйте программы traceroute или ping. Список доступных ntp-серверов можно найти на странице pool.ntp.org.

Чтобы изменить адрес ntp-сервера откройте конфигурационный файл:

nano /etc/ntp.conf

И замените:

server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

на свои адреса ntp-серверов. В моем случае для сервера расположенного во Франции:

server 0.fr.pool.ntp.org iburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst
server 3.fr.pool.ntp.org iburst

Если ваш сервер времени стоит за шлюзом, необходимо разрешить трафик по 123 порту:

iptables -I INPUT -p udp --dport 123 -j ACCEPT
iptables -I OUTPUT -p udp --sport 123 -j ACCEPT

Установка MariaDB 10.1 в Debian 8

Я решил отказаться от использования MySQL, а точнее полностью перевести все свои сервера на ее форк — MariaDB. Пользуясь случаем, хочу рассказать о процессе установки MariaDB 10.1 в Debian 8. Следует отметить, что краткое описание установки MariaDB есть на официальной странице проекта. Я решил выделить этому вопросу отдельный пост, в котором хочу описать необходимые действия после установки MariaDB на сервере.

Перед началом установки MariaDB необходимо добавить ее репозиторий. На сайте MariaDB рекомендуют для этого установить пакет software-properties-common. Я не вижу в этом никакого смысла и предпочитаю все делать вручную.

Регистрируем GPG-ключ репозитория в системе:

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

Добавляем описание репозитория в файл sources.list. Открываем файл в редакторе nano:

nano /etc/apt/sources.list

Копируем в конец следующие строки:

deb [arch=amd64,i386] http://lon1.mirrors.digitalocean.com/mariadb/repo/10.1/debian jessie main
deb-src http://lon1.mirrors.digitalocean.com/mariadb/repo/10.1/debian jessie main

Обновляем список доступных пакетов:

apt-get update

Запускаем процесс установки MariaDB 10.1:

apt-get install mariadb-server

Во время установки нас попросят ввести пароль для пользователя root. На этом процесс установки MariaDB в Debian 8 закончен. А теперь переходим к настройке сервера.

Чтобы повысить надежность нашего сервера, нужно выполнить минимальные требования безопасности. Запретить авторизацию под пользователем root с удаленных хостов. При наличии базы test и пользователя anonymous, нужно удалить их с сервера. Чтобы облегчить задачу используйте скрипт:

mysql_secure_installation

Тип хранения данных по умолчанию

Если необходимо изменить тип хранения данных по умолчанию, добавьте в файл my.cnf следующие строки:

[mysqld]
default-storage-engine = innodb

Убедитесь, что MariaDB использует таблицы InnoDB по умолчанию. Для этого выполните команду:

SHOW ENGINES;

Создать пользователя и базу MariaDB

Чтобы создать пользователя в MariaDB используйте команду ниже:

CREATE USER 'USER_NAME'@'localhost' IDENTIFIED BY 'PASSWORD';

Создаем новую базу:

CREATE DATABASE database_name;

Даем полные права пользователю USER_NAME на базу databasename:

GRANT ALL PRIVILEGES ON database_name.* TO 'USER_NAME'@'localhost';

Теперь нужно обновить все привилегии:

FLUSH PRIVILEGES

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

SHOW GRANTS FOR 'USER_NAME'@'localhost';

Бинарные логи

MariaDB записывает все изменения БД в бинарный журнал, он необходим для работы механизма репликации. Если вы не делали бэкапов или они устарели, бинарные логи можно использовать для восстановления данных. Впрочем, нет никакой гарантии, что данные будут полностью или частично восстановлены. Успех будет зависеть от размера, времени хранения бинарных логов, частоты выполнения бэкапа.

Для отключения бинарных логов, комментируем строки в файле my.cnf:

#log_bin                 = /var/log/mysql/mariadb-bin
#log_bin_index           = /var/log/mysql/mariadb-bin.index