- Home »

Установка WordPress на Ubuntu 24 с LAMP стеком
Рано или поздно каждый админ сталкивается с задачей развернуть WordPress на собственном сервере. Да, можно использовать готовые решения хостинг-провайдеров, но где в этом кайф? Настоящий контроль начинается тогда, когда у тебя есть root-доступ и полная свобода настройки стека. В этой статье разберём, как поднять WordPress на Ubuntu 24 с классическим LAMP-стеком (Linux, Apache, MySQL, PHP) — проверенное временем решение, которое работает стабильно и предсказуемо.
Мы пошагово пройдём весь процесс: от чистой установки Ubuntu до запущенного WordPress-сайта. Рассмотрим не только базовую настройку, но и нюансы безопасности, оптимизации производительности и автоматизации развёртывания. Плюс разберём частые грабли, на которые наступают новички, и способы их избежать.
Почему LAMP и почему Ubuntu 24?
LAMP-стек — это как джинсы в мире веб-разработки: классика, которая никогда не выходит из моды. Apache по-прежнему держит около 25% рынка веб-серверов, MySQL остаётся одной из самых популярных СУБД, а PHP… ну, на нём написано огромное количество сайтов, и WordPress — яркий тому пример.
Ubuntu 24.04 LTS — отличный выбор для продакшена благодаря долгосрочной поддержке до 2034 года. В этой версии:
- PHP 8.3 из коробки с улучшенной производительностью
- MySQL 8.0 с поддержкой JSON и улучшенной безопасностью
- Apache 2.4 с HTTP/2 и современными модулями
- Обновлённые пакеты безопасности
Подготовка сервера
Для начала нужен VPS или выделенный сервер. Если у вас ещё нет сервера, можете заказать VPS для небольших проектов или выделенный сервер для более серьёзных задач.
Минимальные требования:
- 1 GB RAM (рекомендуется 2 GB)
- 20 GB свободного места
- Ubuntu 24.04 LTS
Первым делом обновляем систему:
sudo apt update && sudo apt upgrade -y
sudo reboot
Установка Apache
Apache — наш веб-сервер. Устанавливаем и сразу включаем:
sudo apt install apache2 -y
sudo systemctl enable apache2
sudo systemctl start apache2
Проверяем статус:
sudo systemctl status apache2
Настраиваем файрвол для HTTP и HTTPS:
sudo ufw allow 'Apache Full'
sudo ufw enable
Теперь при переходе на IP-адрес вашего сервера должна отобразиться стандартная страница Apache “It works!”.
Установка MySQL
Устанавливаем MySQL Server:
sudo apt install mysql-server -y
sudo systemctl enable mysql
sudo systemctl start mysql
Обязательно запускаем скрипт безопасной настройки:
sudo mysql_secure_installation
Отвечаем на вопросы скрипта:
- VALIDATE PASSWORD PLUGIN: Y (да)
- Password validation policy: 2 (сильные пароли)
- Remove anonymous users: Y
- Disallow root login remotely: Y
- Remove test database: Y
- Reload privilege tables: Y
Создаём базу данных и пользователя для WordPress:
sudo mysql -u root -p
CREATE DATABASE wordpress_db;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'strong_password_here';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Установка PHP
Устанавливаем PHP и необходимые модули:
sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath -y
Проверяем версию PHP:
php -v
Создаём тестовый файл для проверки:
sudo nano /var/www/html/info.php
Вставляем содержимое:
<?php
phpinfo();
?>
Переходим на `http://ваш_ip/info.php` — должна отобразиться страница с информацией о PHP. После проверки удаляем файл:
sudo rm /var/www/html/info.php
Скачивание и установка WordPress
Скачиваем последнюю версию WordPress:
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
Копируем файлы WordPress в веб-директорию:
sudo cp -R wordpress/* /var/www/html/
sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 755 /var/www/html/
Создаём конфигурационный файл WordPress:
sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
sudo nano /var/www/html/wp-config.php
Обновляем настройки базы данных:
define('DB_NAME', 'wordpress_db');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'strong_password_here');
define('DB_HOST', 'localhost');
Генерируем соли безопасности на https://api.wordpress.org/secret-key/1.1/salt/ и заменяем соответствующие строки в конфиге.
Настройка виртуального хоста Apache
Создаём конфигурацию виртуального хоста:
sudo nano /etc/apache2/sites-available/wordpress.conf
Вставляем конфигурацию:
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/wordpress_error.log
CustomLog ${APACHE_LOG_DIR}/wordpress_access.log combined
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Активируем сайт и модуль rewrite:
sudo a2ensite wordpress.conf
sudo a2enmod rewrite
sudo systemctl reload apache2
Оптимизация и безопасность
Настройка PHP
Редактируем конфигурацию PHP для лучшей производительности:
sudo nano /etc/php/8.3/apache2/php.ini
Ключевые параметры:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_vars = 3000
Настройка безопасности
Скрываем версию Apache:
sudo nano /etc/apache2/conf-enabled/security.conf
Изменяем:
ServerTokens Prod
ServerSignature Off
Создаём .htaccess для дополнительной защиты:
sudo nano /var/www/html/.htaccess
Добавляем базовые правила безопасности:
# Блокируем доступ к конфигурационным файлам
<files wp-config.php>
order allow,deny
deny from all
</files>
# Защищаем от инъекций
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]
RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
RewriteCond %{QUERY_STRING} (\./|\../|\.../) [NC,OR]
RewriteCond %{QUERY_STRING} ^.*('+|+' [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(\;|\|) [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(%0A|%0D) [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>
Автоматизация развёртывания
Создаём скрипт для автоматической установки:
sudo nano /usr/local/bin/wordpress-installer.sh
Содержимое скрипта:
#!/bin/bash
# Переменные
DB_NAME="wordpress_db"
DB_USER="wp_user"
DB_PASS="$(openssl rand -base64 32)"
WP_DIR="/var/www/html"
# Обновляем систему
apt update && apt upgrade -y
# Устанавливаем LAMP
apt install apache2 mysql-server php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath -y
# Настраиваем MySQL
mysql -e "CREATE DATABASE $DB_NAME;"
mysql -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
mysql -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';"
mysql -e "FLUSH PRIVILEGES;"
# Скачиваем и устанавливаем WordPress
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
cp -R wordpress/* $WP_DIR/
chown -R www-data:www-data $WP_DIR/
chmod -R 755 $WP_DIR/
# Создаём wp-config.php
cp $WP_DIR/wp-config-sample.php $WP_DIR/wp-config.php
sed -i "s/database_name_here/$DB_NAME/" $WP_DIR/wp-config.php
sed -i "s/username_here/$DB_USER/" $WP_DIR/wp-config.php
sed -i "s/password_here/$DB_PASS/" $WP_DIR/wp-config.php
# Включаем mod_rewrite
a2enmod rewrite
systemctl reload apache2
echo "WordPress установлен!"
echo "База данных: $DB_NAME"
echo "Пользователь: $DB_USER"
echo "Пароль: $DB_PASS"
Делаем скрипт исполняемым:
sudo chmod +x /usr/local/bin/wordpress-installer.sh
Сравнение с альтернативными решениями
Стек | Производительность | Простота настройки | Потребление ресурсов | Совместимость с WordPress |
---|---|---|---|---|
LAMP (Apache + MySQL + PHP) | Хорошая | Средняя | Среднее | Отличная |
LEMP (Nginx + MySQL + PHP) | Отличная | Сложная | Низкое | Хорошая |
Docker контейнеры | Хорошая | Простая | Среднее | Отличная |
Панели управления (cPanel, Plesk) | Средняя | Очень простая | Высокое | Отличная |
Мониторинг и обслуживание
Настраиваем базовый мониторинг системы:
sudo apt install htop iotop netstat-nat -y
Создаём скрипт для мониторинга производительности:
sudo nano /usr/local/bin/server-stats.sh
#!/bin/bash
echo "=== Использование CPU ==="
top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1
echo "=== Использование памяти ==="
free -h
echo "=== Использование диска ==="
df -h
echo "=== Активные соединения Apache ==="
netstat -an | grep :80 | wc -l
echo "=== Процессы MySQL ==="
mysqladmin -u root -p processlist
echo "=== Лог ошибок Apache (последние 10 строк) ==="
tail -n 10 /var/log/apache2/error.log
Настраиваем автоматическое обновление WordPress через WP-CLI:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
Создаём cron-задачу для автоматических обновлений:
sudo crontab -e
Добавляем строку:
0 2 * * 1 /usr/local/bin/wp core update --path=/var/www/html --allow-root
Частые проблемы и их решения
Проблема: “Error establishing a database connection”
Решение:
- Проверьте настройки в wp-config.php
- Убедитесь, что MySQL работает: `sudo systemctl status mysql`
- Проверьте права пользователя базы данных
Проблема: Файлы не загружаются
Решение:
- Проверьте права доступа: `sudo chown -R www-data:www-data /var/www/html/`
- Увеличьте лимиты в php.ini
- Проверьте свободное место на диске
Проблема: Медленная работа сайта
Решение:
- Включите кэширование (например, установите W3 Total Cache)
- Оптимизируйте изображения
- Увеличьте memory_limit в PHP
- Настройте MySQL для SSD-дисков
Продвинутые настройки
Настройка SSL/TLS с Let’s Encrypt
Устанавливаем Certbot:
sudo apt install certbot python3-certbot-apache -y
Получаем SSL-сертификат:
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
Настраиваем автоматическое обновление:
sudo crontab -e
# Добавляем строку:
0 12 * * * /usr/bin/certbot renew --quiet
Настройка кэширования
Включаем модули кэширования Apache:
sudo a2enmod expires
sudo a2enmod headers
sudo systemctl reload apache2
Добавляем правила кэширования в .htaccess:
# Кэширование браузера
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>
Интеграция с системами мониторинга
Настраиваем интеграцию с популярными системами мониторинга:
# Для Zabbix
sudo apt install zabbix-agent -y
# Для Nagios
sudo apt install nagios-nrpe-server -y
# Для Prometheus
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xzf node_exporter-1.6.1.linux-amd64.tar.gz
sudo mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
Интересные факты и нестандартные применения
Знаете ли вы, что WordPress используется не только для блогов? Вот несколько интересных применений:
- Headless CMS: WordPress как бэкенд для мобильных приложений через REST API
- Мультисайт-сеть: Один WordPress может управлять сотнями сайтов
- E-commerce платформа: С WooCommerce превращается в полноценный интернет-магазин
- Learning Management System: С плагинами типа LearnDash становится системой дистанционного обучения
Статистика использования WordPress:
- 43% всех сайтов в интернете работают на WordPress
- 60% сайтов с CMS используют WordPress
- WordPress переведён на 169 языков
- Каждый день создаётся около 500 новых сайтов на WordPress
Автоматизация backup’ов
Создаём скрипт для автоматического резервного копирования:
sudo nano /usr/local/bin/wp-backup.sh
#!/bin/bash
# Переменные
BACKUP_DIR="/var/backups/wordpress"
WP_DIR="/var/www/html"
DB_NAME="wordpress_db"
DB_USER="wp_user"
DB_PASS="your_password"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
# Создаём директорию для бэкапов
mkdir -p $BACKUP_DIR
# Бэкап файлов
tar -czf $BACKUP_DIR/wp-files-$DATE.tar.gz $WP_DIR
# Бэкап базы данных
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/wp-database-$DATE.sql
# Удаляем старые бэкапы (старше 7 дней)
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed: $DATE"
Добавляем в cron для ежедневного выполнения:
sudo crontab -e
# Добавляем:
0 3 * * * /usr/local/bin/wp-backup.sh
Возможности автоматизации
С настроенным LAMP-стеком и WordPress открываются широкие возможности для автоматизации:
- CI/CD пайплайны: Автоматическое развёртывание через Git hooks
- Масштабирование: Ansible-плейбуки для развёртывания на множестве серверов
- Мониторинг: Интеграция с Grafana для визуализации метрик
- Безопасность: Автоматическое обновление и сканирование уязвимостей
- Оптимизация: Скрипты для автоматической оптимизации изображений и базы данных
Заключение и рекомендации
Установка WordPress на Ubuntu 24 с LAMP-стеком — это классический и надёжный подход, который подойдёт для большинства проектов. Главные преимущества такого решения:
- Полный контроль над всем стеком
- Отличная совместимость с WordPress и плагинами
- Огромное комьюнити и документация
- Простота в обслуживании и отладке
- Возможность тонкой настройки под конкретные задачи
Когда использовать:
- Корпоративные сайты с высокими требованиями к безопасности
- Проекты, требующие кастомизации на уровне сервера
- Мультисайт-сети
- Сайты с интенсивным использованием плагинов
Когда лучше выбрать альтернативы:
- Высоконагруженные проекты — рассмотрите LEMP (Nginx)
- Микросервисная архитектура — используйте Docker
- Простые блоги — managed WordPress-хостинг
- Статичные сайты — генераторы типа Jekyll или Hugo
Помните: правильно настроенный LAMP-стек способен выдерживать серьёзные нагрузки. Ключевые моменты для успеха — регулярное обновление, мониторинг производительности и бэкапы. Не забывайте про безопасность: используйте SSL, настройте файрвол и регулярно обновляйте все компоненты.
Этот стек проверен временем и миллионами сайтов — он просто работает. А с правильной настройкой автоматизации вы получите надёжную платформу, которая будет служить вам долгие годы.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.