В этой статье я подробно опишу процесс установки LEMP сервера, настройки пользователя sudo и фаервола (iptables), а также представлю свои скрипты для автоматизации этих процессов без использования популярных хостинг-панелей. Из-за большого объема материала я разделил статью на две части: первая часть посвящена установке LEMP сервера и настройке фаервола, а вторая — настройке LEMP сервера под ключ.
В этой статье рассмотрим:
Настройка sudo
Настройка Firewall (iptables)
Настройка репозиториев
Установка PHP
Установка Nginx
Установка MariaDB
LEMP — это аббревиатура, обозначающая стек технологий, состоящий из операционной системы Linux, веб-сервера Nginx, системы управления базами данных MySQL (или MariaDB) и PHP интерпретатора.
Настройка SELinux и ModSecurity и прочих SIEM-систем, а также настройка почтового сервера — это обширные темы, требующие отдельного цикла статей. Мы рассмотрим эти вопросы в будущем, чтобы предоставить вам подробные и исчерпывающие руководства.
Мои рекомендации:
Системные требования
Перед началом установки убедитесь, что у вас есть следующее:
Процессор: Минимум 2 ядра и более, с тактовой частотой от 2.0 ГГц или выше.
Оперативная память (RAM): Минимум 2 ГБ RAM (рекомендуется 4 ГБ и более).
Жесткий диск: от 20 ГБ свободного пространства, (для большей производительности используйте SSD или WMe).
Сетевой интерфейс: 100 Мбит/с или более.
Операционная система: Обновленная версия AlmaLinux 9, RockyLinux 9 или CentOS Stream 9.
Предварительные требования
Доступ к интернету для загрузки необходимых пакетов.
Привилегии root или возможность использования
sudo
.SSH доступ к удаленному серверу с вышеупомянутыми привилегиями.
Настройка sudo
Если вы сталкиваетесь с ошибкой bash: sudo: command not found
, это означает, что команда sudo
не установлена на вашем сервере. Чтобы исправить эту ситуацию, выполните следующие действия:
Если пакет
sudo
не установлен по умолчанию в вашей операционной системе, выполните следующие действия для его установки с помощью командыdnf install sudo.
Добавление пользователя в группу
wheel
: По умолчанию в системах CentOS члены группыwheel
имеют доступ кsudo
. Добавьте нового пользователя в группуwheel
:
usermod -aG wheel username
Настройка Firewall (iptables)
Настройка брандмауэра является критически важным шагом в обеспечении безопасности вашего сервера. В данном разделе мы рассмотрим, как настроить iptables для защиты вашего сервера и обеспечения его безопасной работы.
Установка iptables-services. Для управления iptables установите пакет iptables-services:
sudo dnf install -y iptables-services
Отключение сервиса firewalld:
sudo systemctl disable firewalld
sudo systemctl stop firewalld
Настройка правил iptables. Создайте базовые правила для iptables. Эти правила включают разрешение трафика на стандартные порты, такие как SSH (22), HTTP (80) и HTTPS (443):
IPv4:
# Очищаем правила
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
# Разрешение установленных соединений
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешение входящих соединений на localhost
sudo iptables -A INPUT -i lo -j ACCEPT
# Разрешить входящие ping (ICMP echo-request)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Разрешение входящих соединений на порт 22 для SSH
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# Разрешение входящих соединений на порт 80 для HTTP
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# Разрешение входящих соединений на порт 443 для HTTPS
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
# Установка политики по умолчанию для цепочки INPUT на DROP
sudo iptables -P INPUT DROP
IPv6:
# Очищаем правила
sudo ip6tables -F
sudo ip6tables -X
sudo ip6tables -t nat -F
sudo ip6tables -t nat -X
sudo ip6tables -t mangle -F
sudo ip6tables -t mangle -X
sudo ip6tables -P INPUT ACCEPT
sudo ip6tables -P FORWARD ACCEPT
sudo ip6tables -P OUTPUT ACCEPT
# Разрешение установленных соединений
sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешение входящих соединений на localhost
sudo ip6tables -A INPUT -i lo -j ACCEPT
# Разрешить входящие ping (ICMPv6 echo-request)
sudo ip6tables -A INPUT -p ipv6-icmp --icmpv6-type echo-request -j ACCEPT
# Разрешение входящих соединений на порт 22 для SSH
sudo ip6tables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# Разрешение входящих соединений на порт 80 для HTTP
sudo ip6tables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# Разрешение входящих соединений на порт 443 для HTTPS
sudo ip6tables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
# Установка политики по умолчанию для цепочки INPUT на DROP
sudo ip6tables -P INPUT DROP
Сохранение правил. После настройки правил сохраните их для автоматического применения при перезагрузке:
IPv4:
sudo service iptables save
IPv6:
sudo service ip6tables save
Включение и запуск службы iptables и ip6tables. Для включения и запуска фаервола iptables выполните следующие команды:
IPv4:
sudo systemctl enable iptables
sudo systemctl start iptables
IPv6:
sudo systemctl enable ip6tables
sudo systemctl start ip6tables
Проверка конфигурации. Убедитесь, что правила iptables настроены и применены правильно:
IPv4:
sudo iptables -L -vn
IPv6:
sudo ip6tables -L -vn
Эти шаги обеспечат базовую защиту вашего сервера, разрешая доступ только к необходимым службам и блокируя несанкционированный трафик.
Важно! Рекомендуется внимательно ознакомиться с официальной документацией по настройке Firewall (iptables): Documentation about the netfilter/iptables project.
Настройка репозиториев
Перед установкой пакетов необходимо обновить систему, чтобы все пакеты были актуальными, и настроить необходимые репозитории.
Обновление пакетов. Сначала обновим все пакеты в системе:
sudo dnf update -y
Настройка репозиториев Nginx. Создадим файл репозитория для Nginx и добавим необходимые параметры:
sudo tee /etc/yum.repos.d/nginx.repo << EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/rhel/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/rhel/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
Настройка репозиториев Remi. Установим репозитории Remi для доступа к разным версиям PHP(7.4, 8.0, 8.1, 8.2, 8.3):
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
Настройка репозиториев EPEL. Добавим репозитории EPEL для дополнительных пакетов:
sudo dnf install -y epel-release -y
Настройка репозиториев MariaDB. Настроим репозитории MariaDB 11.4 с помощью официального скрипта:
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-11.4"
Пример вывода команды добавления репозитория MariaDB:
[unixweb@localhost ~]# curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-11.4"
# [info] Checking for script prerequisites.
# [warning] Found existing file at /etc/yum.repos.d/mariadb.repo. Moving to /etc/yum.repos.d/mariadb.repo.old_1
# [info] MariaDB Server version 11.4 is valid
# [info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo
# [info] Adding trusted package signing keys...
/etc/pki/rpm-gpg ~
~
# [info] Successfully added trusted package signing keys
# [info] Cleaning package cache...
93 files removed
Рекомендуется внимательно ознакомиться с официальной документацией по настройке репозиториев MariaDB: MariaDB Repository Setup.
Установка PHP
Для установки PHP 8.1 и необходимых расширений на дистрибутивах Linux, использующих пакетный менеджер DNF (например, AlmaLinux 9, RockyLinux 9, CentOS Stream 9), выполните следующие команды:
Сброс модуля PHP. Сначала сбросьте текущий модуль PHP, чтобы избежать конфликтов с уже установленными версиями PHP.
sudo dnf module reset php -y
Включение модуля PHP 8.1. Затем включите модуль PHP версии 8.1 из репозитория Remi, который содержит последние версии PHP.
sudo dnf module enable php:remi-8.1 -y
Установка PHP 8.1 и необходимых расширений. Установите PHP 8.1 и множество расширений, необходимых для работы с различными функциями и базами данных.
sudo dnf install php81 php81-php-fpm php81-php-cli php81-php-mysqlnd php81-php-gd php81-php-ldap php81-php-odbc php81-php-pdo php81-php-pear php81-php-xml php81-php-xmlrpc php81-php-mbstring php81-php-snmp php81-php-soap php81-php-zip php81-php-opcache -y
Включение и запуск службы PHP-FPM. Включите службу PHP-FPM, чтобы она автоматически запускалась при загрузке системы, и сразу же запустите её.
sudo systemctl enable --now php81-php-fpm.service
Теперь PHP 8.1 и его необходимые расширения установлены и настроены на вашем сервере. PHP-FPM запущен и настроен на автоматический запуск при загрузке системы. Для более детальной информации и дальнейшей настройки рекомендуется ознакомиться с официальной документацией PHP и PHP-FPM.
Установка Nginx
Nginx обеспечивает стабильно высокую производительность сайтов даже при значительных нагрузках, благодаря чему широко используется для работы высоконагруженных веб-сервисов по всему миру.
Стоит отметить, что многие популярные системы управления контентом (CMS), такие как WordPress, изначально оптимизированы для работы с Apache. Это означает, что некоторые их функции могут требовать специфической настройки правил переписывания (Rewrite) для корректной работы с Nginx.
Для установки Nginx выполните следующую команду:
sudo dnf install nginx --repo nginx-stable -y
Настройка Nginx за три простых шага. После установки Nginx необходимо внести изменения в файл /etc/nginx/nginx.conf и в настройки сервиса nginx в systemd.
1. Скопируйте скрипт, показанный ниже:
#!/bin/bash
# Copyright (C) 2024
# Автор: Крячко Алексей
# Электронная почта: admin@unixweb.info
# Веб-сайт: https://unixweb.info
# GitHub: https://github.com/unixweb-info
set -euo pipefail
# Переименование старого конфигурационного файла Nginx
if [ -f /etc/nginx/nginx.conf ]; then
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old
else
echo "/etc/nginx/nginx.conf not found!"
exit 1
fi
# Получение количества физических ядер
phycores=$(grep -m 1 "cpu cores" /proc/cpuinfo | awk '{print $4}')
if [[ -z "$phycores" ]]; then
echo "Failed to retrieve the number of physical cores."
exit 1
fi
# Настройка /etc/nginx/nginx.conf
cat <<EOF > /etc/nginx/nginx.conf
# Этот файл был сгенерирован автоматически, не редактируйте его
user apache;
worker_processes $phycores;
worker_rlimit_nofile 200000;
worker_priority -5;
pcre_jit on;
include /etc/nginx/modules-enabled/*.conf;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'\"\$http_user_agent\" \"\$http_x_forwarded_for\"';
access_log /var/log/nginx/access.log main;
keepalive_timeout 65;
client_max_body_size 100m;
server_tokens off;
reset_timedout_connection on;
client_body_buffer_size 10K;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
sendfile on;
aio on;
tcp_nopush on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 128;
}
EOF
# Дополнительная настройка Nginx /etc/nginx/conf.d/99-my-settings.conf
cat <<EOF > /etc/nginx/conf.d/99-my-settings.conf
fastcgi_temp_path /var/cache/nginx/fastcgi_temp 1 2;
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=two:60m max_size=256m inactive=24h;
fastcgi_cache_key "\$scheme\$request_method\$host\$request_uri";
fastcgi_cache_methods GET HEAD;
fastcgi_cache_min_uses 2;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
fastcgi_send_timeout 3600s;
fastcgi_read_timeout 3600s;
fastcgi_connect_timeout 3600s;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
client_body_timeout 1800s;
client_header_timeout 900s;
send_timeout 1800s;
EOF
# Настройка nginx в systemd
nginx_service="/lib/systemd/system/nginx.service"
# Проверка существования файла
if [ -f "$nginx_service" ]; then
# Добавление LimitNOFILE=200000 в раздел [Service]
if ! grep -q "LimitNOFILE=200000" "$nginx_service"; then
sed -i '/\[Service\]/a LimitNOFILE=200000' "$nginx_service"
fi
else
echo "$nginx_service not found!"
exit 1
fi
# Перезагрузка systemd
systemctl daemon-reload
# Проверяем статус nginx
if systemctl is-active --quiet nginx; then
echo "Nginx работает."
else
echo "Nginx не запускается. Запускаем Nginx..."
# Запускаем Nginx
systemctl start nginx
# Проверяем, успешно ли запущен Nginx
if systemctl is-active --quiet nginx; then
echo "Nginx успешно запустился."
else
echo "Не удалось запустить Nginx."
fi
fi
Сохраните файл, например, под именем
settings_nginx.sh
, предварительно скопировав содержимое скрипта и выйдите из редактора.Сделайте скрипт исполняемым и затем запустите его:
chmod +x ./settings_nginx.sh && sudo ./settings_nginx.sh
Этот скрипт выполняет следующие действия:
1. Резервное копирование старого конфигурационного файла Nginx:
Если файл /etc/nginx/nginx.conf существует, он переименовывается в /etc/nginx/nginx.conf.old. Если файл не найден, скрипт завершает выполнение с ошибкой.
2. Получение количества физических ядер:
Определяет количество физических ядер процессора с помощью команды grep и awk.
3. Создание нового конфигурационного файла Nginx:
-
Создает файл /etc/nginx/nginx.conf с настройками, включая:
user apache;
worker_processes устанавливается в значение количества физических ядер.
Другие параметры для оптимизации производительности и безопасности.
Включает файлы конфигурации из директорий /etc/nginx/modules-enabled/, /etc/nginx/conf.d/ и /etc/nginx/sites-enabled/.
4. Создание дополнительного конфигурационного файла Nginx:
Создает файл /etc/nginx/conf.d/99-my-settings.conf с дополнительными настройками для fastcgi и управления кешем.
5. Настройка службы Nginx в systemd:
Проверяет существование файла /lib/systemd/system/nginx.service.
Добавляет строку LimitNOFILE=200000 в раздел [Service], если она еще не добавлена.
Перезагружает конфигурацию systemd.
Выполняется проверка если Nginx не запущен, выводится сообщение "Nginx is not running. Starting Nginx..." и выполняется команда для его запуска. Если Nginx запущен, выводится сообщение "Nginx is running."
Этот скрипт автоматически генерирует конфигурацию Nginx и обновляет сервис для учета новых настроек.
Дополнительные действия:
После установки и выполнения скриптов необходимо перезапустить Nginx, если вы сделали какие-либо изменения в конфигурационных файлах выполните команду ‘sudo systemctl restart nginx
’ или ‘sudo systemctl reload nginx
’. Обязательно после выполнения скрипта выполните команду ‘sudo systemctl enable nginx
’, чтобы он автоматически запускался при загрузке системы.
# Перезапуск сервиса Nginx (полная перезагрузка):
sudo systemctl restart nginx
# или так (перезагрузка только конфигурации, без остановки сервиса):
sudo systemctl reload nginx
# Включение автоматического запуска Nginx при загрузке системы:
sudo systemctl enable nginx
Проверьте статус Nginx, чтобы убедиться, что сервер запущен:
sudo systemctl status nginx
Это лишь небольшой перечень команд Nginx. Рекомендуется ознакомиться с официальной документацией для получения более полной информации.
Установка MariaDB
MySQL — это популярная система управления базами данных. Вы также можете использовать MariaDB, которая является форком MySQL и полностью совместима с ней.
Для установки MariaDB выполните следующую команду:
sudo dnf install mariadb-server mariadb -y
После установки убедитесь, что служба MariaDB запущена. Если она не запущена, выполните команду sudo systemctl start mariadb
и настройте автозапуск службы при загрузке системы:
# Проверка статуса MariaDB:
# Эта команда выводит текущий статус службы MariaDB.
# Полезно для проверки, запущена ли служба и работает ли корректно.
sudo systemctl status mariadb
# Запуск MariaDB:
# Эта команда запускает службу MariaDB, если она не запущена.
# Полезно при первой настройке или если служба была остановлена.
sudo systemctl start mariadb
# Включение автоматического запуска MariaDB при загрузке системы:
# Эта команда добавляет службу MariaDB в автозагрузку,
# что означает, что MariaDB будет автоматически запускаться при каждой загрузке системы.
sudo systemctl enable mariadb
Для начальной настройки безопасности базы данных выполните скрипт mariadb-secure-installation:
sudo mariadb-secure-installation
Следуйте инструкциям на экране для настройки пароля root и повышения безопасности базы данных:
[unixweb@localhost ~]# sudo mariadb-secure-installation
ПРИМЕЧАНИЕ: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СЦЕНАРИЯ ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB
В ПРОИЗВОДСТВЕННОМ ИСПОЛЬЗОВАНИИ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!
Чтобы войти в MariaDB для его защиты, нам понадобится текущий
пароль для пользователя root. Если вы только что установили MariaDB, и
еще не установили пароль root, вы должны просто нажать enter здесь.
Введите текущий пароль для root (введите для отсутствия):
OK, успешно использован пароль, продолжаем...
Установка пароля root или использование unix_socket гарантирует, что никто
не сможет войти в MariaDB под пользователем root без надлежащего разрешения.
У вас уже защищен аккаунт root, поэтому вы можете безопасно ответить 'n'.
Переключиться на аутентификацию через unix_socket [Y/n] Y
Успешно включено!
Перезагрузка таблиц привилегий..
... Успех!
У вас уже защищен аккаунт root, поэтому вы можете безопасно ответить 'n'.
Изменить пароль root? [Y/n] Y
Новый пароль:
Повторите новый пароль:
Пароль успешно обновлён!
Перезагрузка таблиц привилегий..
... Успех!
По умолчанию, установка MariaDB имеет анонимного пользователя, позволяющего любому
войти в MariaDB, не имея созданного для них учетной записи пользователя. Это предназначено только для тестирования, и чтобы установка
шла немного глаже. Вы должны удалить их, прежде чем переходить в
производственную среду.
Удалить анонимных пользователей? [Y/n] Y
... Успех!
Обычно, root должен иметь возможность подключаться только с 'localhost'.Это
гарантирует, что кто-то не сможет угадать пароль root по сети.
Запретить удаленный вход под root? [Y/n] Y
... Успех!
По умолчанию, MariaDB поставляется с базой данных под названием 'test', к которой может
доступить любой. Это также предназначено только для тестирования, и должно быть удалено
перед переходом в производственную среду.
Удалить тестовую базу данных и доступ к ней? [Y/n] Y
- Удаление тестовой базы данных...
... Успех!
- Удаление привилегий на тестовую базу данных...
... Успех!
Перезагрузка таблиц привилегий гарантирует, что все изменения, сделанные до сих пор,
вступят в силу немедленно.
Перезагрузить таблицы привилегий сейчас? [Y/n] Y
... Успех!
Очистка...
Все готово! Если вы выполнили все вышеперечисленные шаги, ваша установка MariaDB
теперь должна быть безопасной.
Спасибо за использование MariaDB!
Сценарий переведен на русский язык для удобства восприятия информации.
Базовая конфигурация MariaDB. Скрипт автоматической настройки MariaDB:
1. Скопируйте скрипт, показанный ниже:
#!/bin/bash
# Copyright (C) 2024
# Автор: Крячко Алексей
# Электронная почта: admin@unixweb.info
# Веб-сайт: https://unixweb.info
# GitHub: https://github.com/unixweb-info
# Проверяем, установлен ли пакет bc
if ! command -v bc &> /dev/null; then
echo "Пакет bc не установлен. Устанавливаю..."
sudo dnf install -y bc
else
echo "Пакет bc уже установлен."
fi
if [ ! -d "/var/log/mariadb" ]; then
mkdir -p /var/log/mariadb
touch /var/log/mariadb/error.log
chown -R mysql:adm /var/log/mariadb
fi
CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
TOTAL_MEM=$(free -m | awk '/^Mem:/{print $2}')
CPU_CORES_REF=4
MEM_REF=8192
SCALE_CPU=$(echo "$CPU_CORES / $CPU_CORES_REF" | bc -l)
SCALE_MEM=$(echo "$TOTAL_MEM / $MEM_REF" | bc -l)
calculate_new_value() {
local original_value=$1
local scale_factor=$2
echo $(echo "$original_value * $scale_factor" | bc -l | xargs printf "%.0f")
}
innodb_buffer_pool_size=5368709120
innodb_buffer_pool_instances=5
max_allowed_packet=134217728
thread_cache_size=64
tmp_table_size=536870912
max_connections=2000
max_user_connections=1000
table_open_cache=8192
innodb_open_files=8192
read_buffer_size=16777216
join_buffer_size=134217728
sort_buffer_size=16777216
binlog_cache_size=33554432
key_buffer_size=268435456
query_cache_limit=134217728
query_cache_min_res_unit=1024
query_cache_size=134217728
new_innodb_buffer_pool_size=$(calculate_new_value $innodb_buffer_pool_size $SCALE_MEM)
new_innodb_buffer_pool_instances=$(calculate_new_value $innodb_buffer_pool_instances $SCALE_CPU)
new_max_allowed_packet=$(calculate_new_value $max_allowed_packet $SCALE_MEM)
new_thread_cache_size=$(calculate_new_value $thread_cache_size $SCALE_CPU)
new_tmp_table_size=$(calculate_new_value $tmp_table_size $SCALE_MEM)
new_max_connections=$(calculate_new_value $max_connections $SCALE_CPU)
new_max_user_connections=$(calculate_new_value $max_user_connections $SCALE_CPU)
new_table_open_cache=$(calculate_new_value $table_open_cache $SCALE_CPU)
new_innodb_open_files=$(calculate_new_value $innodb_open_files $SCALE_CPU)
new_read_buffer_size=$(calculate_new_value $read_buffer_size $SCALE_MEM)
new_join_buffer_size=$(calculate_new_value $join_buffer_size $SCALE_MEM)
new_sort_buffer_size=$(calculate_new_value $sort_buffer_size $SCALE_MEM)
new_binlog_cache_size=$(calculate_new_value $binlog_cache_size $SCALE_MEM)
new_key_buffer_size=$(calculate_new_value $key_buffer_size $SCALE_MEM)
new_query_cache_limit=$(calculate_new_value $query_cache_limit $SCALE_MEM)
new_query_cache_min_res_unit=$(calculate_new_value $query_cache_min_res_unit $SCALE_MEM)
new_query_cache_size=$(calculate_new_value $query_cache_size $SCALE_MEM)
convert_to_mb() {
echo "$(echo "$1 / 1048576" | bc)M"
}
convert_to_gb() {
echo "$(echo "$1 / 1073741824" | bc)G"
}
cat << EOF > /etc/my.cnf.d/my-settings.cnf
[mysqld]
bind-address=127.0.0.1
log_error=/var/log/mariadb/error.log
symbolic-links=0
innodb_strict_mode=OFF
event_scheduler=ON
sql_mode=""
local-infile=0
max_allowed_packet=$(convert_to_mb $new_max_allowed_packet)
thread_stack=256K
long_query_time=10
disable-log-bin=1
log-queries-not-using-indexes=1
innodb_buffer_pool_size=$(echo "$new_innodb_buffer_pool_size / 1048576" | bc)M
innodb_buffer_pool_instances=${new_innodb_buffer_pool_instances}
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
transaction-isolation=READ-COMMITTED
innodb_log_file_size=512M
max_heap_table_size=512M
thread_cache_size=${new_thread_cache_size}
tmp_table_size=$(echo "$new_tmp_table_size / 1048576" | bc)M
innodb_file_per_table=1
table_open_cache=${new_table_open_cache}
innodb_open_files=${new_innodb_open_files}
read_buffer_size=$(echo "$new_read_buffer_size / 1048576" | bc)M
join_buffer_size=$(echo "$new_join_buffer_size / 1048576" | bc)M
sort_buffer_size=$(echo "$new_sort_buffer_size / 1048576" | bc)M
binlog_cache_size=$(echo "$new_binlog_cache_size / 1048576" | bc)M
key_buffer_size=$(echo "$new_key_buffer_size / 1048576" | bc)M
table_definition_cache=4051
interactive_timeout=60
wait_timeout=60
performance_schema=ON
open_files_limit=65721
max-connect-errors=10000
max_connections=${new_max_connections}
max_user_connections=${new_max_user_connections}
query_cache_limit=$(echo "$new_query_cache_limit / 1048576" | bc)M
query_cache_min_res_unit=${new_query_cache_min_res_unit}
query_cache_size=$(echo "$new_query_cache_size / 1048576" | bc)M
query_cache_type=ON
EOF
echo "Конфигурационный файл MariaDB создан в /etc/my.cnf.d/my-settings.cnf"
systemctl daemon-reload
systemctl restart mariadb
Сохраните файл, например, под именем
settings_mariadb.sh
, предварительно скопировав содержимое скрипта и выйдите из редактора.Сделайте скрипт исполняемым и затем запустите его:
chmod +x ./settings_mariadb.sh && sudo ./settings_mariadb.sh
Этот скрипт автоматически выполняет настройку MariaDB в соответствии с характеристиками системы, этих настроек достаточно для стабильной работы WordPress и прочих CMS, однако при высоких нагрузках, скрипт требует доработки. Оптимизация баз данных достойная тема для отдельной статьи, однако сейчас я хотел поделиться этим решением. Буду признателен за конструктивные замечания и предложения инженеров для дальнейшего улучшения скрипта.
На этом настройка завершена. Для более детального изучения MariaDB рекомендуется ознакомиться с официальной документацией.
Завершение первой части: Установка LEMP стека в AlmaLinux 9, RockyLinux 9 и CentOS Stream 9. На этом завершаю первую часть статьи, посвящённую установке LEMP сервера. Хотя здесь описаны не все шаги, благодарю вас за понимание!
В следующей статье, Часть 2: Настройка LEMP сервера для работы с CMS WordPress в AlmaLinux 9, RockyLinux 9 или CentOS Stream 9, мы опишем:
Создание пользователя Linux
Настройка виртуального хоста
Проверка работы PHP
Работа с базой данных MariaDB
Настройка Let's Encrypt
Установка и настройка Fail2ban
Скрипт автоматизации: UnixWeb Panel
В завершение этой статьи представлен bash-скрипт UnixWeb Panel, который будет актуален для частного сервера и небольших проектов. Этот скрипт устраняет необходимость в громоздких хостинг-панелях. Отсутствие web-интерфейса делает работу более хардкорной, при этом вы получаете открытый исходный код и минималистичный функционал, который можно адаптировать под свои нужды.
UnixWeb Panel распространяется под лицензией GNU General Public License v3.0. Код скрипта открыт для проверки и изменений, что позволяет системным администраторам легко адаптировать его под свои нужды.
Буду благодарен за конструктивную критику и обратную связь для улучшения функционала.
Для получения более подробной информации и доступа к скрипту посетите мой репозиторий GitHub.
Opaspap
docker run -p 8080:80 -p 8888:88 -v `pwd`:/var/www/html --name lemp -d adhocore/lemp:8.0
unixweb Автор
Очень сомневаюсь в том что данная команда сделает все то что описано в статье, тем более то что описано в скрипте автоматической настройки MariaDB.
Docker решение не отрицаю, не совсем понимаю что вы хотели этим сказать?
DennisP
Такие гайды как Ваш рассчитаны на самых новичков, которые в 99% случаев устанавливают этот самый LEMP для разработки. А чтобы реальный проект уперся в какие-то проблемы при дефолтных настройках Mysql надо очень сильно постараться.
unixweb Автор
Как вы заметили, в статье используются нестандартные настройки. Не удивлюсь, если даже при написании статьи о реализации аналогичного решения в Docker меня ожидает шквал критики. Сейчас на Хабре часто публикуют информационные статьи, которые не всегда приносят практическую пользу. К сожалению, много хейтеров, которые сами не написали ни одной достойной статьи.
DennisP
Ваши нестандартные настройки - это дискуссионный вопрос. Не существует "тонких настроек", которые подходят всем, иначе бы они были включены по-умолчанию. Тот же Mysql надо настраивать под собственные нужды, анализируя статистику запросов и выявляя проблемы, количество worker процессов nginx совершенно необязательно должно соответствовать кол-ву ядер и так далее.
unixweb Автор
Вы совершенно правы. Но все же есть базовые настройки которые подходят для небольших проектов. Это я к тому что такое решение вполне годное для настройки VPS. Естественно для больших проектов приглашают DevOps инженеров.
bondeg
Данная команда намекает более правильный путь.
Конфигурация в docker-compose и вуаля, у нас сборка, не заточенная под какую-то конкретную ОС.
Я ещё понимаю вручную на систему что-то ставить году так в 2015, но сейчас будущее давно наступило. Окружение для проекта должно быть легко поддерживаемым и переносимым.
unixweb Автор
Готовлю новую статью о LEMP в Docker, по аналогии с этими статьями, по заявкам трудящихся. Критиковать легко, но написать хорошую статью с подробными сценариями – это уже другое дело. На Хабре действительно мало желающих делиться практическим опытом, и часто публикуются информационные статьи.
unixweb Автор
И перед тем как запустить docker команду, еще нужно потрудиться собрать сценарий с нужными конфигами. Спасибо за подсказку, в курсе. Не везде кому то нужно использовать Docker.
DennisP
эта команда скачивает и разворачивает на хосте готовый образ со всеми конфигами
unixweb Автор
Вопрос был в конфигурации. Конечно поставить готовый шаблон можно одной командой, а вот нужно ещё сделать настройки которые описаны в статье. Просто такое впечатление у людей как будто я не знаю что есть такие решения.