Настройка сервера на CentOS 7 для Keitaro

Инструкция по настройке чистого сервера CentOS 7 для стабильной и производительной работы Keitaro.

Внимание! Всю настройку сервера сейчас можно сделать автоматически. Инструкция на странице Автоматическая установка.

Проверка версии CentOS

Убедитесь, что установлена 7я версия CentOS:

cat /etc/redhat-release

Подключение репозиториев, настройка ядра

Сначала обновим текущие пакеты системы

yum -y update

Добавления репозиториев REMI и EPEL. В них содержатся свежие версии NGinx, PHP, MariaDB.

sudo yum install -y epel-release
cd /etc/yum.repos.d
wget http://rpms.remirepo.net/enterprise/remi.repo

или

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

Установка полезных утилит:

yum -y install htop nano

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

echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn=512" >> /etc/sysctl.conf
echo "fs.file-max = 70000" >> /etc/sysctl.conf
sysctl -p

MariaDB

Установка:

yum -y install mariadb mariadb-server

Запуск и добавление в автозагрузку:

systemctl start mariadb
chkconfig mariadb on

Redis

Установка:

yum -y install redis

Запуск и добавление в автозагрузку:

systemctl start redis
chkconfig redis on

Nginx

Установка:

yum -y install nginx 

Отредактируйте конфиг

nano /etc/nginx/nginx.conf

Запуск и добавление в автозагрузку:

systemctl start nginx
chkconfig nginx on

PHP-FPM

Установка PHP 7.0 и дополнительных расширений:

yum -y install php70 php70-php-fpm php70-php-devel php70-php-mysqlnd php70-php-pecl-redis php70-php-mbstring php70-php-pear  php70-php-ioncube-loader php70-php-pecl-zip

Создание ссылки php70 → php и файлов конфигурации в /etc/php.:

ln -s /bin/php70 /bin/php
ln -s /etc/opt/remi/php70 /etc/php

Откройте файл конфигурации:

nano /etc/opt/remi/php70/php-fpm.d/www.conf

Выставите значения:

user = nginx
...
group = nginx
...
listen = /var/run/php7-fpm.sock
...
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
...
pm = ondemand
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.process_idle_timeout = 10s
pm.max_requests = 500

Сохраните и закройте. CTRL+XYENTER.

Запуск и добавление в автозагрузку:

service php70-php-fpm start
chkconfig php70-php-fpm on

Monit

Установка:

yum install -y monit

Создайте файлы для мониторинга процессов в директории /etc/monit.d/.

Nginx

check process nginx with pidfile /var/run/nginx.pid
    start program = "/bin/systemctl start nginx"
    stop program = "/bin/systemctl stop nginx"

MariaDB

check process mariadb with pidfile /var/run/mariadb/mariadb.pid
    start program = "/bin/systemctl start mariadb"
    stop program = "/bin/systemctl stop mariadb"

PHP-FPM

check process php56-php-fpm with pidfile /var/opt/remi/php70/run/php-fpm/php-fpm.pid
    start program = "/bin/systemctl start php70-php-fpm"
    stop program = "/bin/systemctl stop php70-php-fpm"

Проверьте корректность конфигов:

monit -t

Перезапуск monit:

monit reload

Можете запустить все процессы:

monit start all

Запуск и добавление в автозагрузку:

systemctl start monit
chkconfig monit on

Создание SWAP

На серверах с памятью менее 1гб, необходимо включить swap. Иначе, на пиках нагрузки проявится нехватка памяти для базы данных.

Подготовка файла подкачки:

cd /var
touch swap.img
chmod 600 swap.img

Форматирование файла. Размер файла 1024*2000 = 2 048 000 байт.

dd if=/dev/zero of=/var/swap.img bs=1024k count=2000

Подключение файла подкачки:

mkswap /var/swap.img
swapon /var/swap.img
echo "/var/swap.img    none    swap    sw    0    0" >> /etc/fstab

Настройка MySQL/MariaDB (не обязательно)

nano /etc/my.cnf

Добавьте под секцию [mysqld]

skip-name-resolve = 1 
query_cache_type = 0
query_cache_size = 16M
innodb_buffer_pool_size = 500M # выставите 50% вашей памяти RAM, но только если памяти больше 2G

Создание базы данных

Запуск консоли MySQL/MariaDB:

mysql

Создание пользователя:

CREATE USER 'tds'@'localhost' IDENTIFIED BY '012e-f23rh2e';

Создание новой базы данных:

CREATE DATABASE tds;

Выдача прав пользователю на базу данных:

GRANT ALL PRIVILEGES ON tds. * TO 'tds'@'localhost';

Keitaro

Скрипт для быстрой генерации конфигурации хоста для nginx и php-fpm.

bash <(curl -s 'https://gist.githubusercontent.com/asabirov/5d16a1fd920529422546/raw/0d0ec5732920ea1cc82096e54cf4c8ba6f28aa77/nginx-fpm-host-generator.sh')

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

Please, enter domain name:
tdsdomain.com
Please, enter server IP:
146.185.141.156
Please, enter domain directory:
/var/www/tdsdomain.com
Please, enter config directory:
/etc/nginx/conf.d/

Проверка корректности конфигурации.

nginx -t

Пример правильной конфигурации.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Создание директории для Keitaro.

mkdir -p /var/www/tdsdomain.com
chown nginx:nginx /var/www/tdsdomain.com

Загрузка инсталлятора.

wget http://keitarotds.com/getfile/install  -O /var/www/tdsdomain.com/install.php 

Сейчас можно открыть в браузере http://tdsdomain.com/install.php и начать установку.

SeLinux

Если в браузере видите ошибку «File not found», скорее всего включен SeLinux. Настроить правила можно следующим образом:

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

или переключите режим:

setenforce 0 

Firewall

Открытие портов 80 и 443:

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp

Cron

Во время установки будет просьба добавить задачу в crontab, ниже инструкция.

Редактирования списка задач для пользователя nginx:

crontab -e -u nginx

Нажмите i, вставьте:

* * * * * php /var/www/tdsdomain.com/cron.php

Нажмите ESC, введите команду сохранения и закрытия файла :wq.

Playbook для Ansible

Ansible-сценарий для автоматической подготовки сервера: https://github.com/keitarocorp/centos_provision.