Давайте рассмотрим оптимальные настройки для VPS со следующими параметрами процессор 4х2ГГц, память 4 Гб, диск 80 Гб. На нем будет интернет-магазин на Битриксе с посещаемостью около 300 человек в день.
Рекомендуем использовать Ubuntu 20.04 LTS или 22.04 LTS. Это стабильные и хорошо поддерживаемые дистрибутивы.
Nginx будет выступать в роли фронтенд-сервера, отдавая статику и проксируя запросы к PHP-FPM.
Установка:
sudo apt install -y nginx
sudo ufw allow ‘Nginx HTTP’
sudo ufw allow ‘Nginx HTTPS’ # Если планируете использовать SSL
Основной файл конфигурации /etc/nginx/nginx.conf:
nginx
user www-data;
worker_processes auto; # Использует количество ядер процессора
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024; # Количество одновременных соединений на рабочий процесс
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65; # Таймаут для keep-alive соединений
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# SSL-настройки (если используете SSL)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers «EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH»;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Gzip-сжатие
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5; # Уровень сжатия (1-9), 5-6 хороший баланс
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable «MSIE [1-6]\\.»; # Отключаем для старых IE
# Логирование
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn; # warning, error, crit
# Заголовок X-Frame-Options для защиты от кликджекинга
add_header X-Frame-Options «SAMEORIGIN»;
# Заголовок X-Content-Type-Options для предотвращения MIME-сниффинга
add_header X-Content-Type-Options «nosniff»;
# Заголовок X-XSS-Protection для защиты от XSS
add_header X-XSS-Protection «1; mode=block»;
# Включить виртуальные хосты
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Конфигурация виртуального хоста для Битрикса (/etc/nginx/sites-available/your_domain.conf):
nginx
server {
listen 80;
server_name your_domain.com www.your_domain.com; # Замените на ваш домен
root /var/www/your_domain.com/public_html; # Замените на путь к корню вашего сайта Битрикс
# Перенаправление HTTP на HTTPS (рекомендуется после установки SSL)
# return 301 https://$host$request_uri;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args;
}
# Настройки для PHP-FPM
location ~ \\.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # Проверьте версию PHP-FPM
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_read_timeout 300; # Увеличьте для долгих операций Битрикса
}
# Запрет доступа к служебным файлам Битрикса
location ~ ^/(bitrix/modules|bitrix/php_interface|upload|bitrix/cache|bitrix/managed_cache)/ {
deny all;
}
# Запрет доступа к некоторым типам файлов
location ~ /\\.ht {
deny all;
}
# Кэширование статики
location ~* \\.(jpg|jpeg|gif|png|ico|css|js|woff|woff2|ttf|svg|eot)$ {
expires 30d; # Кэшировать статику на 30 дней
log_not_found off;
access_log off;
}
error_page 404 /404.html; # Пример страницы ошибки
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Активация виртуального хоста:
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/
sudo nginx -t # Проверка синтаксиса
sudo systemctl restart nginx
Используйте MySQL 8.0 или MariaDB 10.x. MariaDB часто считается более производительной для веб-приложений.
Установка MariaDB:
sudo apt install -y mariadb-server mariadb-client
sudo mysql_secure_installation # Обязательно выполните для базовой безопасности
Настройки /etc/mysql/mariadb.conf.d/50-server.cnf (или my.cnf): Найдите секцию [mysqld] и добавьте/измените следующие параметры. Значения могут потребовать тонкой настройки, но эти будут хорошей отправной точкой.
[mysqld]
# Basic settings
bind-address = 127.0.0.1 # Слушать только локальные соединения
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# Caching and memory
query_cache_size = 0 # В MariaDB 10.1+ и MySQL 5.7.20+ Query Cache устарел/удален
query_cache_type = 0 # Отключаем, т.к. может быть узким местом
max_connections = 150 # Максимальное количество одновременных подключений (увеличьте при необходимости)
connect_timeout = 10
wait_timeout = 600
interactive_timeout = 600
key_buffer_size = 32M # Для MyISAM, но Битрикс в основном использует InnoDB
max_allowed_packet = 64M # Максимальный размер пакета
# InnoDB settings (очень важны для производительности Битрикса)
innodb_buffer_pool_size = 2G # Примерно 50-70% от доступной RAM, но не более 75%
# Для 4GB RAM, 2GB — хорошая отправная точка.
# Если Битрикс будет на одном сервере с БД, то 2GB — максимум.
innodb_log_file_size = 256M # Размер redo логов. Больше размер = меньше операций записи.
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 2 # 2 = быстрее, но есть риск потери 1 сек данных при сбое
# 1 = полностью ACID-совместимо, но медленнее
innodb_file_per_table = 1 # Каждая таблица в своем файле. Рекомендуется.
innodb_flush_method = O_DIRECT # Для Linux, прямое обращение к диску
innodb_thread_concurrency = 0 # Автоматическое управление потоками
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_io_capacity = 200 # Количество IOPS, которое может обрабатывать диск. Увеличьте для SSD.
innodb_io_capacity_max = 2000
# Logging
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # Логировать запросы дольше 1 секунды
# Replication (если не используете, не трогайте)
# skip-name-resolve # Отключает разрешение DNS имен для клиентов, иногда ускоряет подключение
После изменения настроек:
sudo systemctl restart mariadb
Дополнительно:
Битрикс хорошо работает с PHP 8.1 или 8.2.
Установка PHP-FPM и необходимых расширений:
sudo apt install -y php8.1-fpm php8.1-mysql php8.1-gd php8.1-xml php8.1-mbstring php8.1-zip php8.1-soap php8.1-curl php8.1-intl php8.1-bcmath php8.1-imagick php8.1-opcache
Настройки PHP-FPM (/etc/php/8.1/fpm/php.ini):
[PHP]
memory_limit = 256M # Увеличьте, если Битрикс выдает ошибки, 256M-512M обычно достаточно
max_execution_time = 300 # Увеличьте для выполнения долгих скриптов (импорт/экспорт)
max_input_time = 300
upload_max_filesize = 64M
post_max_size = 64M
date.timezone = Europe/Moscow # Или ваш часовой пояс
display_errors = Off # В продакшене всегда Off
log_errors = On
error_log = /var/log/php/php_errors.log # Создайте папку и файл, дайте права www-data
expose_php = Off # Отключаем показ версии PHP в заголовках
[opcache]
opcache.enable = 1
opcache.memory_consumption = 128 # Память для OPcache в MB. Для Битрикса 128-256MB.
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000 # Количество файлов для кэширования
opcache.revalidate_freq = 0 # 0 = проверять изменения файлов при каждом запросе (для dev)
# В продакшене лучше 0 или очень большое число, если вы используете деплой без изменений файлов
# и очищаете кэш при деплое. Для Битрикса с его админкой, 0 может быть удобнее.
# Или 60 (секунд) для баланса.
opcache.fast_shutdown = 1
opcache.enable_cli = 1
Настройки PHP-FPM Pool (/etc/php/8.1/fpm/pool.d/www.conf):
[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = ondemand # Или dynamic. ondemand экономит память, dynamic быстрее при постоянной нагрузке.
# Для 300 чел/день ondemand или dynamic с небольшим min_servers будет оптимален.
pm.max_children = 50 # Максимальное количество дочерних процессов FPM.
# Рассчитывается как (Total RAM — (MySQL RAM + Nginx RAM)) / (php memory_limit * 1.2)
# Для 4GB RAM, memory_limit 256MB, MySQL 2GB, Nginx 100MB: (4096-2048-100) / (256*1.2) = 1948 / 307 = ~6.3
# Начните с 10-20 и мониторьте. 50 может быть многовато для 4GB RAM. Начнем с 10-15.
pm.start_servers = 5 # Количество серверов, запускаемых при старте
pm.min_spare_servers = 5 # Минимальное количество свободных серверов
pm.max_spare_servers = 15 # Максимальное количество свободных серверов
pm.max_requests = 500 # Количество запросов, после которых процесс будет перезапущен (для предотвращения утечек памяти)
request_terminate_timeout = 300 # Таймаут на выполнение запроса. Должен быть >= max_execution_time
Создание папки для логов PHP:
sudo mkdir /var/log/php
sudo chown www-data:www-data /var/log/php
sudo systemctl restart php8.1-fpm
Безопасность – это не просто желательная опция, а абсолютная необходимость для любого сервера, подключенного к интернету. Пробелы в защите могут привести к несанкционированному доступу, потере данных или использованию вашего сервера для вредоносной деятельности.
Брандмауэр действует как охранник, который контролирует входящий и исходящий сетевой трафик, разрешая или блокируя соединения на основе заданных правил. Для Linux-систем наиболее распространенным является UFW (Uncomplicated Firewall) – упрощенная оболочка для iptables.
sudo apt update
sudo apt install ufw
Прежде чем активировать брандмауэр, убедитесь, что вы разрешили SSH-доступ, иначе вы рискуете заблокировать себя из системы.
sudo ufw allow OpenSSH # Разрешить SSH-соединения (обычно порт 22)
sudo ufw allow http # Разрешить HTTP (порт 80)
sudo ufw allow https # Разрешить HTTPS (порт 443)
# sudo ufw allow 80/tcp # Можно указывать порты напрямую
# sudo ufw allow 443/tcp
# sudo ufw allow 22/tcp
Если вы используете другие сервисы (например, FTP на порту 21, MySQL на 3306), не забудьте разрешить их соответствующие порты.
sudo ufw enable # Активировать брандмауэр (подтвердите ‘y’)
sudo ufw status verbose # Проверить текущие правила и статус
После включения UFW, он будет запускаться автоматически при каждой перезагрузке сервера.
SSH является основной точкой входа на ваш сервер, поэтому его защита критически важна.
Порт 22 очень часто атакуется ботами. Изменение его на нестандартный порт (например, 2222, 54321) значительно снизит количество автоматических попыток подбора пароля.
Откройте конфигурационный файл SSH:
sudo nano /etc/ssh/sshd_config
Найдите строку Port 22. Раскомментируйте ее (если закомментирована #) и измените 22 на желаемый порт (например, Port 2222).
Важно: Прежде чем закрыть файл, добавьте правило в UFW для нового порта!
sudo ufw allow 2222/tcp # Разрешить новый SSH порт
Перезапустите службу SSH для применения изменений:
sudo systemctl restart sshd
Проверка: Откройте НОВОЕ окно терминала и попробуйте подключиться к серверу по новому порту (например, ssh ваш_пользователь@ваш_ip -p 2222). Не закрывайте старую сессию, пока не убедитесь, что новая работает!
После успешного подключения, можно удалить старое правило SSH и запретить доступ к старому порту (если вы не хотите его использовать):
sudo ufw delete allow OpenSSH # Удалить правило OpenSSH
# Или: sudo ufw deny 22/tcp # Явно запретить порт 22
Используйте только аутентификацию по SSH-ключам. Это значительно безопаснее, чем пароли, которые могут быть подобраны или перехвачены.
Убедитесь, что вы уже настроили SSH-ключи для доступа (см. предыдущую часть статьи).
Откройте sshd_config снова:
sudo nano /etc/ssh/sshd_config
Найдите строки и измените их значения:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no # Иногда требуется для полного отключения паролей
Сохраните и перезапустите службу SSH:
sudo systemctl restart sshd
Внимание: Убедитесь, что у вас есть рабочий SSH-ключ, прежде чем отключать парольную аутентификацию! Иначе вы навсегда заблокируете себя от сервера.
Это предотвратит прямые атаки на учетную запись root. Всегда используйте обычного пользователя, а затем sudo для выполнения административных задач.
Откройте sshd_config:
sudo nano /etc/ssh/sshd_config
Найдите строку PermitRootLogin и измените ее на:
PermitRootLogin no
Сохраните и перезапустите службу SSH:
sudo systemctl restart sshd
Fail2Ban автоматически сканирует логи сервера (SSH, веб-сервера и т.д.) на предмет подозрительной активности, такой как многократные неудачные попытки входа. При обнаружении такой активности, он временно или постоянно блокирует IP-адрес злоумышленника в брандмауэре.
sudo apt install fail2ban
Основной конфигурационный файл находится по адресу /etc/fail2ban/jail.conf. Однако, для внесения изменений рекомендуется создавать копию этого файла с расширением .local, чтобы ваши изменения не были перезаписаны при обновлении пакета.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
В этом файле вы найдете различные секции ([DEFAULT], [sshd], [nginx-http-auth] и т.д.).
В секции [sshd]:
Убедитесь, что она активна (enabled = true). Если вы изменили порт SSH, укажите его здесь:
[[sshd]
enabled = true
port = ssh,2222 # Если вы изменили порт на 2222
# filter = sshd
# logpath = %(sshd_log)s
# maxretry = 5
Если вы используете nginx или apache с аутентификацией, найдите соответствующие секции ([nginx-http-auth], [apache-auth]) и активируйте их.
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban # Убедиться, что он запускается при старте
sudo systemctl status fail2ban # Проверить статус
sudo fail2ban-client status
sudo fail2ban-client status sshd # Для конкретного «jail»
После обеспечения безопасности, важно убедиться, что ваш VPS работает эффективно и использует свои ресурсы оптимально.
Swap-файл (или раздел) используется операционной системой как «виртуальная оперативная память», когда физическая RAM заполнена. Это помогает предотвратить сбои приложений, но полагаться на swap для регулярной работы не рекомендуется, так как он значительно медленнее RAM.
sudo swapon —show
sudo free -h
Рекомендуемый размер swap обычно составляет 1-2x от размера RAM, но не более 4GB для большинства случаев.
Создайте файл (например, 2GB):
sudo fallocate -l 2G /swapfile
# Или, для старых систем: sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
Установите правильные разрешения:
sudo chmod 600 /swapfile
Отформатируйте файл как swap:
sudo mkswap /swapfile
Активируйте swap-файл:
sudo swapon /swapfile
Сделайте swap постоянным (чтобы он активировался при перезагрузке):
Добавьте следующую строку в конец файла /etc/fstab:
sudo nano /etc/fstab
Добавьте:
/swapfile none swap sw 0 0
swappiness — это параметр ядра Linux, который определяет, насколько часто система будет использовать swap. Значение 0 означает, что swap будет использоваться только в крайнем случае, 100 — очень агрессивно. Для VPS обычно рекомендуется значение от 10 до 30.
Проверьте текущее значение:
cat /proc/sys/vm/swappiness
Измените значение (например, на 10) временно:
sudo sysctl vm.swappiness=10
Сделайте изменение постоянным:
Откройте /etc/sysctl.conf и добавьте или измените строку:
sudo nano /etc/sysctl.conf
Добавьте:
vm.swappiness = 10
Этот параметр контролирует, насколько агрессивно ядро очищает кэш inode и dentry (метаданные файловой системы). Более высокое значение (по умолчанию 100) означает, что кэш будет очищаться чаще, освобождая RAM, но потенциально замедляя доступ к файлам. Для большинства VPS значение по умолчанию подходит, но если вы наблюдаете проблемы с производительностью дискового ввода/вывода при высокой загрузке RAM, можно попробовать снизить его (например, до 50), чтобы ядро дольше держало кэш в памяти.
cat /proc/sys/vm/vfs_cache_pressure
Откройте /etc/sysctl.conf и добавьте или измените строку:
sudo nano /etc/sysctl.conf
Добавьте:
vm.vfs_cache_pressure = 50
Точное время на сервере критически важно для корректной работы множества сервисов, ведения логов, работы SSL-сертификатов и синхронизации данных.
Современные версии Ubuntu/Debian часто используют systemd-timesyncd по умолчанию, который достаточно прост. Для более продвинутых нужд можно установить ntp.
sudo apt install ntp # Для установки NTP
# Или убедиться, что systemd-timesyncd активен:
# timedatectl status
timedatectl
Если время не синхронизировано, убедитесь, что служба ntp или systemd-timesyncd запущена:
sudo systemctl status ntp # или systemctl status systemd-timesyncd
Если необходимо, перезапустите:
sudo systemctl restart ntp # или systemctl restart systemd-timesyncd
Выполняем работы по по IT-безопасности. Оставить заявку можно здесь.