Настройка LEMP стека Linux-Nginx-MySQL-PHP — различия между версиями
Admin (обсуждение | вклад) (Новая страница: «= Настройка LEMP стека (Linux, Nginx, MySQL, PHP) = == 1. Подготовка системы == * Войдите в систему под уче…») |
Admin (обсуждение | вклад) |
||
Строка 6: | Строка 6: | ||
* Убедитесь, что у вас есть доступ к серверу через SSH или консоль. | * Убедитесь, что у вас есть доступ к серверу через SSH или консоль. | ||
− | == 2. Установка Nginx | + | == 2. Установка Nginx == |
=== Обновление системы === | === Обновление системы === | ||
1. Обновите систему: | 1. Обновите систему: | ||
− | < | + | <pre>sudo apt update</pre> |
2. Установите необходимые пакеты: | 2. Установите необходимые пакеты: | ||
− | < | + | <pre>sudo apt install -y wget curl unzip</pre> |
=== Установка Nginx === | === Установка Nginx === | ||
1. Установите Nginx: | 1. Установите Nginx: | ||
− | < | + | <pre>sudo apt install -y nginx</pre> |
2. Запустите и включите автозапуск: | 2. Запустите и включите автозапуск: | ||
− | < | + | <pre>sudo systemctl start nginx</pre> |
− | < | + | <pre>sudo systemctl enable nginx</pre> |
3. Проверьте статус: | 3. Проверьте статус: | ||
− | < | + | <pre>sudo systemctl status nginx</pre> |
4. Проверьте работу Nginx: | 4. Проверьте работу Nginx: | ||
− | < | + | <pre>curl -I http://localhost</pre> |
=== Настройка Nginx === | === Настройка Nginx === | ||
1. Проверьте конфигурацию: | 1. Проверьте конфигурацию: | ||
− | < | + | <pre>sudo nginx -t</pre> |
2. Перезапустите Nginx: | 2. Перезапустите Nginx: | ||
− | < | + | <pre>sudo systemctl restart nginx</pre> |
3. Проверьте порты: | 3. Проверьте порты: | ||
− | < | + | <pre>sudo netstat -tlnp | grep :80</pre> |
− | == 3. Установка MySQL | + | == 3. Установка MySQL == |
=== Установка MySQL === | === Установка MySQL === | ||
1. Установите MySQL: | 1. Установите MySQL: | ||
− | < | + | <pre>sudo apt install -y mysql-server</pre> |
2. Запустите и включите автозапуск: | 2. Запустите и включите автозапуск: | ||
− | < | + | <pre>sudo systemctl start mysql</pre> |
− | < | + | <pre>sudo systemctl enable mysql</pre> |
3. Проверьте статус: | 3. Проверьте статус: | ||
− | < | + | <pre>sudo systemctl status mysql</pre> |
=== Настройка безопасности MySQL === | === Настройка безопасности MySQL === | ||
1. Запустите скрипт безопасности: | 1. Запустите скрипт безопасности: | ||
− | < | + | <pre>sudo mysql_secure_installation</pre> |
2. Следуйте инструкциям: | 2. Следуйте инструкциям: | ||
Строка 71: | Строка 71: | ||
1. Подключитесь к MySQL: | 1. Подключитесь к MySQL: | ||
− | < | + | <pre>sudo mysql -u root -p</pre> |
2. Создайте базу данных: | 2. Создайте базу данных: | ||
− | < | + | <pre>CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;</pre> |
3. Создайте пользователя: | 3. Создайте пользователя: | ||
− | < | + | <pre>CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password';</pre> |
4. Предоставьте права: | 4. Предоставьте права: | ||
− | < | + | <pre>GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';</pre> |
− | < | + | <pre>FLUSH PRIVILEGES;</pre> |
5. Выйдите из MySQL: | 5. Выйдите из MySQL: | ||
− | < | + | <pre>EXIT;</pre> |
− | == 4. Установка PHP | + | == 4. Установка PHP == |
=== Установка PHP-FPM === | === Установка PHP-FPM === | ||
1. Установите PHP-FPM и необходимые модули: | 1. Установите PHP-FPM и необходимые модули: | ||
− | < | + | <pre>sudo apt install -y php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip php8.1-intl php8.1-soap php8.1-json php8.1-bcmath</pre> |
2. Проверьте версию PHP: | 2. Проверьте версию PHP: | ||
− | < | + | <pre>php --version</pre> |
3. Проверьте статус PHP-FPM: | 3. Проверьте статус PHP-FPM: | ||
− | < | + | <pre>sudo systemctl status php8.1-fpm</pre> |
=== Настройка PHP-FPM === | === Настройка PHP-FPM === | ||
1. Отредактируйте конфигурацию PHP: | 1. Отредактируйте конфигурацию PHP: | ||
− | < | + | <pre>sudo nano /etc/php/8.1/fpm/php.ini</pre> |
2. Настройте основные параметры: | 2. Настройте основные параметры: | ||
− | < | + | <pre>upload_max_filesize = 64M |
post_max_size = 64M | post_max_size = 64M | ||
max_execution_time = 300 | max_execution_time = 300 | ||
Строка 114: | Строка 114: | ||
log_errors = On | log_errors = On | ||
error_log = /var/log/php_errors.log | error_log = /var/log/php_errors.log | ||
− | </ | + | </pre> |
3. Настройте пул PHP-FPM: | 3. Настройте пул PHP-FPM: | ||
− | < | + | <pre>sudo nano /etc/php/8.1/fpm/pool.d/www.conf</pre> |
4. Настройте параметры пула: | 4. Настройте параметры пула: | ||
− | < | + | <pre>user = www-data |
group = www-data | group = www-data | ||
listen = /run/php/php8.1-fpm.sock | listen = /run/php/php8.1-fpm.sock | ||
Строка 131: | Строка 131: | ||
pm.min_spare_servers = 5 | pm.min_spare_servers = 5 | ||
pm.max_spare_servers = 35 | pm.max_spare_servers = 35 | ||
− | </ | + | </pre> |
5. Перезапустите PHP-FPM: | 5. Перезапустите PHP-FPM: | ||
− | < | + | <pre>sudo systemctl restart php8.1-fpm</pre> |
=== Тестирование PHP === | === Тестирование PHP === | ||
1. Создайте тестовый файл: | 1. Создайте тестовый файл: | ||
− | < | + | <pre>sudo nano /var/www/html/info.php</pre> |
2. Добавьте содержимое: | 2. Добавьте содержимое: | ||
− | < | + | <pre><?php |
phpinfo(); | phpinfo(); | ||
?> | ?> | ||
− | </ | + | </pre> |
3. Проверьте в браузере: | 3. Проверьте в браузере: | ||
− | < | + | <pre>http://your-server-ip/info.php</pre> |
4. Удалите тестовый файл: | 4. Удалите тестовый файл: | ||
− | < | + | <pre>sudo rm /var/www/html/info.php</pre> |
− | == 5. Настройка Nginx для PHP | + | == 5. Настройка Nginx для PHP == |
=== Базовая конфигурация === | === Базовая конфигурация === | ||
1. Отредактируйте конфигурацию сайта по умолчанию: | 1. Отредактируйте конфигурацию сайта по умолчанию: | ||
− | < | + | <pre>sudo nano /etc/nginx/sites-available/default</pre> |
2. Замените содержимое: | 2. Замените содержимое: | ||
− | < | + | <pre>server { |
listen 80 default_server; | listen 80 default_server; | ||
listen [::]:80 default_server; | listen [::]:80 default_server; | ||
Строка 183: | Строка 183: | ||
} | } | ||
} | } | ||
− | </ | + | </pre> |
3. Проверьте конфигурацию: | 3. Проверьте конфигурацию: | ||
− | < | + | <pre>sudo nginx -t</pre> |
4. Перезапустите Nginx: | 4. Перезапустите Nginx: | ||
− | < | + | <pre>sudo systemctl restart nginx</pre> |
− | == 6. Настройка виртуальных хостов | + | == 6. Настройка виртуальных хостов == |
=== Создание виртуального хоста === | === Создание виртуального хоста === | ||
1. Создайте директорию для сайта: | 1. Создайте директорию для сайта: | ||
− | < | + | <pre>sudo mkdir -p /var/www/example.com/public_html</pre> |
2. Установите права доступа: | 2. Установите права доступа: | ||
− | < | + | <pre>sudo chown -R www-data:www-data /var/www/example.com</pre> |
− | < | + | <pre>sudo chmod -R 755 /var/www/example.com</pre> |
3. Создайте конфигурацию виртуального хоста: | 3. Создайте конфигурацию виртуального хоста: | ||
− | < | + | <pre>sudo nano /etc/nginx/sites-available/example.com</pre> |
4. Добавьте конфигурацию: | 4. Добавьте конфигурацию: | ||
− | < | + | <pre>server { |
listen 80; | listen 80; | ||
listen [::]:80; | listen [::]:80; | ||
Строка 233: | Строка 233: | ||
} | } | ||
} | } | ||
− | </ | + | </pre> |
5. Включите сайт: | 5. Включите сайт: | ||
− | < | + | <pre>sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/</pre> |
6. Удалите сайт по умолчанию: | 6. Удалите сайт по умолчанию: | ||
− | < | + | <pre>sudo rm /etc/nginx/sites-enabled/default</pre> |
7. Проверьте конфигурацию: | 7. Проверьте конфигурацию: | ||
− | < | + | <pre>sudo nginx -t</pre> |
8. Перезапустите Nginx: | 8. Перезапустите Nginx: | ||
− | < | + | <pre>sudo systemctl restart nginx</pre> |
=== Создание тестовой страницы === | === Создание тестовой страницы === | ||
1. Создайте index.html: | 1. Создайте index.html: | ||
− | < | + | <pre>sudo nano /var/www/example.com/public_html/index.html</pre> |
2. Добавьте содержимое: | 2. Добавьте содержимое: | ||
− | < | + | <pre><!DOCTYPE html> |
<html> | <html> | ||
<head> | <head> | ||
Строка 263: | Строка 263: | ||
</body> | </body> | ||
</html> | </html> | ||
− | </ | + | </pre> |
3. Создайте PHP тест: | 3. Создайте PHP тест: | ||
− | < | + | <pre>sudo nano /var/www/example.com/public_html/info.php</pre> |
4. Добавьте содержимое: | 4. Добавьте содержимое: | ||
− | < | + | <pre><?php |
echo "<h1>PHP is working!</h1>"; | echo "<h1>PHP is working!</h1>"; | ||
echo "<p>Current time: " . date('Y-m-d H:i:s') . "</p>"; | echo "<p>Current time: " . date('Y-m-d H:i:s') . "</p>"; | ||
phpinfo(); | phpinfo(); | ||
?> | ?> | ||
− | </ | + | </pre> |
− | == 7. Настройка SSL | + | == 7. Настройка SSL == |
=== Установка Certbot === | === Установка Certbot === | ||
1. Установите Certbot: | 1. Установите Certbot: | ||
− | < | + | <pre>sudo apt install -y certbot python3-certbot-nginx</pre> |
2. Получите SSL сертификат: | 2. Получите SSL сертификат: | ||
− | < | + | <pre>sudo certbot --nginx -d example.com -d www.example.com</pre> |
3. Настройте автоматическое обновление: | 3. Настройте автоматическое обновление: | ||
− | < | + | <pre>sudo crontab -e</pre> |
4. Добавьте задачу: | 4. Добавьте задачу: | ||
− | < | + | <pre>0 12 * * * /usr/bin/certbot renew --quiet</pre> |
=== Проверка SSL === | === Проверка SSL === | ||
1. Проверьте SSL сертификат: | 1. Проверьте SSL сертификат: | ||
− | < | + | <pre>sudo certbot certificates</pre> |
2. Протестируйте SSL: | 2. Протестируйте SSL: | ||
− | < | + | <pre>curl -I https://example.com</pre> |
− | == 8. Настройка безопасности | + | == 8. Настройка безопасности == |
=== Настройка файрвола === | === Настройка файрвола === | ||
1. Настройте UFW: | 1. Настройте UFW: | ||
− | < | + | <pre>sudo ufw allow 22/tcp</pre> |
− | < | + | <pre>sudo ufw allow 80/tcp</pre> |
− | < | + | <pre>sudo ufw allow 443/tcp</pre> |
− | < | + | <pre>sudo ufw enable</pre> |
2. Проверьте статус: | 2. Проверьте статус: | ||
− | < | + | <pre>sudo ufw status</pre> |
=== Настройка fail2ban === | === Настройка fail2ban === | ||
1. Установите fail2ban: | 1. Установите fail2ban: | ||
− | < | + | <pre>sudo apt install -y fail2ban</pre> |
2. Создайте конфигурацию: | 2. Создайте конфигурацию: | ||
− | < | + | <pre>sudo nano /etc/fail2ban/jail.local</pre> |
3. Добавьте настройки: | 3. Добавьте настройки: | ||
− | < | + | <pre>[DEFAULT] |
bantime = 3600 | bantime = 3600 | ||
findtime = 600 | findtime = 600 | ||
Строка 336: | Строка 336: | ||
port = http,https | port = http,https | ||
logpath = /var/log/nginx/error.log | logpath = /var/log/nginx/error.log | ||
− | </ | + | </pre> |
4. Запустите fail2ban: | 4. Запустите fail2ban: | ||
− | < | + | <pre>sudo systemctl start fail2ban</pre> |
− | < | + | <pre>sudo systemctl enable fail2ban</pre> |
=== Настройка безопасности Nginx === | === Настройка безопасности Nginx === | ||
1. Создайте конфигурацию безопасности: | 1. Создайте конфигурацию безопасности: | ||
− | < | + | <pre>sudo nano /etc/nginx/conf.d/security.conf</pre> |
2. Добавьте правила безопасности: | 2. Добавьте правила безопасности: | ||
− | < | + | <pre>\# Скрытие версии Nginx |
server_tokens off; | server_tokens off; | ||
− | # Защита от clickjacking | + | \# Защита от clickjacking |
add_header X-Frame-Options "SAMEORIGIN" always; | add_header X-Frame-Options "SAMEORIGIN" always; | ||
− | # Защита от MIME sniffing | + | \# Защита от MIME sniffing |
add_header X-Content-Type-Options "nosniff" always; | add_header X-Content-Type-Options "nosniff" always; | ||
− | # XSS Protection | + | \# XSS Protection |
add_header X-XSS-Protection "1; mode=block" always; | add_header X-XSS-Protection "1; mode=block" always; | ||
− | # Strict Transport Security | + | \# Strict Transport Security |
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; | add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; | ||
− | # Запрет доступа к скрытым файлам | + | \# Запрет доступа к скрытым файлам |
location ~ /\. { | location ~ /\. { | ||
deny all; | deny all; | ||
Строка 370: | Строка 370: | ||
} | } | ||
− | # Запрет доступа к backup файлам | + | \# Запрет доступа к backup файлам |
location ~* \.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)$ { | location ~* \.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)$ { | ||
deny all; | deny all; | ||
} | } | ||
− | </ | + | </pre> |
3. Включите конфигурацию в виртуальный хост: | 3. Включите конфигурацию в виртуальный хост: | ||
− | < | + | <pre>sudo nano /etc/nginx/sites-available/example.com</pre> |
4. Добавьте в начало файла: | 4. Добавьте в начало файла: | ||
− | < | + | <pre>include /etc/nginx/conf.d/security.conf; |
− | </ | + | </pre> |
5. Перезапустите Nginx: | 5. Перезапустите Nginx: | ||
− | < | + | <pre>sudo systemctl restart nginx</pre> |
− | == 9. Оптимизация производительности | + | == 9. Оптимизация производительности == |
=== Настройка кэширования === | === Настройка кэширования === | ||
1. Создайте конфигурацию кэширования: | 1. Создайте конфигурацию кэширования: | ||
− | < | + | <pre>sudo nano /etc/nginx/conf.d/cache.conf</pre> |
2. Добавьте настройки: | 2. Добавьте настройки: | ||
− | < | + | <pre>\# Кэширование статических файлов |
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { | location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { | ||
expires 1y; | expires 1y; | ||
Строка 401: | Строка 401: | ||
} | } | ||
− | # Кэширование шрифтов | + | \# Кэширование шрифтов |
location ~* \.(woff|woff2|ttf|eot)$ { | location ~* \.(woff|woff2|ttf|eot)$ { | ||
expires 1y; | expires 1y; | ||
Строка 408: | Строка 408: | ||
} | } | ||
− | # Gzip сжатие | + | \# Gzip сжатие |
gzip on; | gzip on; | ||
gzip_vary on; | gzip_vary on; | ||
Строка 424: | Строка 424: | ||
application/atom+xml | application/atom+xml | ||
image/svg+xml; | image/svg+xml; | ||
− | </ | + | </pre> |
=== Настройка PHP-FPM пулов === | === Настройка PHP-FPM пулов === | ||
1. Создайте отдельный пул для сайта: | 1. Создайте отдельный пул для сайта: | ||
− | < | + | <pre>sudo nano /etc/php/8.1/fpm/pool.d/example.com.conf</pre> |
2. Добавьте конфигурацию: | 2. Добавьте конфигурацию: | ||
− | < | + | <pre>[example.com] |
user = www-data | user = www-data | ||
group = www-data | group = www-data | ||
Строка 449: | Строка 449: | ||
php_admin_value[error_log] = /var/log/php8.1-fpm-example.com.log | php_admin_value[error_log] = /var/log/php8.1-fpm-example.com.log | ||
php_admin_flag[log_errors] = on | php_admin_flag[log_errors] = on | ||
− | </ | + | </pre> |
3. Обновите конфигурацию Nginx: | 3. Обновите конфигурацию Nginx: | ||
− | < | + | <pre>sudo nano /etc/nginx/sites-available/example.com</pre> |
4. Измените fastcgi_pass: | 4. Измените fastcgi_pass: | ||
− | < | + | <pre>fastcgi_pass unix:/run/php/php8.1-fpm-example.com.sock; |
− | </ | + | </pre> |
5. Перезапустите сервисы: | 5. Перезапустите сервисы: | ||
− | < | + | <pre>sudo systemctl restart php8.1-fpm</pre> |
− | < | + | <pre>sudo systemctl restart nginx</pre> |
− | == 10. Мониторинг и логирование | + | == 10. Мониторинг и логирование == |
=== Настройка логирования === | === Настройка логирования === | ||
1. Настройте ротацию логов: | 1. Настройте ротацию логов: | ||
− | < | + | <pre>sudo nano /etc/logrotate.d/lemp</pre> |
2. Добавьте конфигурацию: | 2. Добавьте конфигурацию: | ||
− | < | + | <pre>/var/log/nginx/*.log { |
daily | daily | ||
missingok | missingok | ||
Строка 495: | Строка 495: | ||
endscript | endscript | ||
} | } | ||
− | </ | + | </pre> |
=== Создание скрипта мониторинга === | === Создание скрипта мониторинга === | ||
1. Создайте скрипт мониторинга: | 1. Создайте скрипт мониторинга: | ||
− | < | + | <pre>sudo nano /usr/local/bin/lemp-monitor.sh</pre> |
2. Добавьте содержимое: | 2. Добавьте содержимое: | ||
− | < | + | <pre>\#!/bin/bash |
− | # Проверка статуса Nginx | + | \# Проверка статуса Nginx |
if ! systemctl is-active --quiet nginx; then | if ! systemctl is-active --quiet nginx; then | ||
echo "Nginx is down!" | mail -s "LEMP Alert" admin@example.com | echo "Nginx is down!" | mail -s "LEMP Alert" admin@example.com | ||
fi | fi | ||
− | # Проверка статуса MySQL | + | \# Проверка статуса MySQL |
if ! systemctl is-active --quiet mysql; then | if ! systemctl is-active --quiet mysql; then | ||
echo "MySQL is down!" | mail -s "LEMP Alert" admin@example.com | echo "MySQL is down!" | mail -s "LEMP Alert" admin@example.com | ||
fi | fi | ||
− | # Проверка статуса PHP-FPM | + | \# Проверка статуса PHP-FPM |
if ! systemctl is-active --quiet php8.1-fpm; then | if ! systemctl is-active --quiet php8.1-fpm; then | ||
echo "PHP-FPM is down!" | mail -s "LEMP Alert" admin@example.com | echo "PHP-FPM is down!" | mail -s "LEMP Alert" admin@example.com | ||
fi | fi | ||
− | # Проверка использования диска | + | \# Проверка использования диска |
DISK_USAGE=$(df /var/www | tail -1 | awk '{print $5}' | sed 's/%//') | DISK_USAGE=$(df /var/www | tail -1 | awk '{print $5}' | sed 's/%//') | ||
if [ $DISK_USAGE -gt 80 ]; then | if [ $DISK_USAGE -gt 80 ]; then | ||
Строка 526: | Строка 526: | ||
fi | fi | ||
− | # Проверка доступности сайта | + | \# Проверка доступности сайта |
if ! curl -s -o /dev/null -w "%{http_code}" http://example.com | grep -q "200"; then | if ! curl -s -o /dev/null -w "%{http_code}" http://example.com | grep -q "200"; then | ||
echo "Website is not responding!" | mail -s "LEMP Alert" admin@example.com | echo "Website is not responding!" | mail -s "LEMP Alert" admin@example.com | ||
fi | fi | ||
− | </ | + | </pre> |
3. Сделайте скрипт исполняемым: | 3. Сделайте скрипт исполняемым: | ||
− | < | + | <pre>sudo chmod +x /usr/local/bin/lemp-monitor.sh</pre> |
4. Добавьте в crontab: | 4. Добавьте в crontab: | ||
− | < | + | <pre>sudo crontab -e</pre> |
5. Добавьте задачу: | 5. Добавьте задачу: | ||
− | < | + | <pre>*/5 * * * * /usr/local/bin/lemp-monitor.sh</pre> |
− | == 11. Резервное копирование | + | == 11. Резервное копирование == |
=== Создание скрипта резервного копирования === | === Создание скрипта резервного копирования === | ||
1. Создайте скрипт резервного копирования: | 1. Создайте скрипт резервного копирования: | ||
− | < | + | <pre>sudo nano /usr/local/bin/lemp-backup.sh</pre> |
2. Добавьте содержимое: | 2. Добавьте содержимое: | ||
− | < | + | <pre>\#!/bin/bash |
BACKUP_DIR="/backup/lemp" | BACKUP_DIR="/backup/lemp" | ||
Строка 555: | Строка 555: | ||
SITE_DIR="/var/www/example.com" | SITE_DIR="/var/www/example.com" | ||
− | # Создание директории для бэкапа | + | \# Создание директории для бэкапа |
mkdir -p $BACKUP_DIR | mkdir -p $BACKUP_DIR | ||
− | # Резервное копирование файлов сайта | + | \# Резервное копирование файлов сайта |
tar -czf $BACKUP_DIR/website-$DATE.tar.gz -C $SITE_DIR . | tar -czf $BACKUP_DIR/website-$DATE.tar.gz -C $SITE_DIR . | ||
− | # Резервное копирование базы данных | + | \# Резервное копирование базы данных |
mysqldump -u myapp_user -p'strong_password' myapp > $BACKUP_DIR/database-$DATE.sql | mysqldump -u myapp_user -p'strong_password' myapp > $BACKUP_DIR/database-$DATE.sql | ||
− | # Сжатие SQL файла | + | \# Сжатие SQL файла |
gzip $BACKUP_DIR/database-$DATE.sql | gzip $BACKUP_DIR/database-$DATE.sql | ||
− | # Резервное копирование конфигурации Nginx | + | \# Резервное копирование конфигурации Nginx |
tar -czf $BACKUP_DIR/nginx-config-$DATE.tar.gz -C /etc nginx | tar -czf $BACKUP_DIR/nginx-config-$DATE.tar.gz -C /etc nginx | ||
− | # Резервное копирование конфигурации PHP-FPM | + | \# Резервное копирование конфигурации PHP-FPM |
tar -czf $BACKUP_DIR/php-config-$DATE.tar.gz -C /etc php | tar -czf $BACKUP_DIR/php-config-$DATE.tar.gz -C /etc php | ||
− | # Удаление старых бэкапов (старше 7 дней) | + | \# Удаление старых бэкапов (старше 7 дней) |
find $BACKUP_DIR -name "*$DATE*" -mtime +7 -delete | find $BACKUP_DIR -name "*$DATE*" -mtime +7 -delete | ||
echo "LEMP backup completed: $DATE" | echo "LEMP backup completed: $DATE" | ||
− | </ | + | </pre> |
3. Сделайте скрипт исполняемым: | 3. Сделайте скрипт исполняемым: | ||
− | < | + | <pre>sudo chmod +x /usr/local/bin/lemp-backup.sh</pre> |
4. Добавьте в crontab: | 4. Добавьте в crontab: | ||
− | < | + | <pre>sudo crontab -e</pre> |
5. Добавьте задачу: | 5. Добавьте задачу: | ||
− | < | + | <pre>0 3 * * * /usr/local/bin/lemp-backup.sh</pre> |
− | == 12. Установка популярных CMS | + | == 12. Установка популярных CMS == |
=== Установка WordPress === | === Установка WordPress === | ||
1. Скачайте WordPress: | 1. Скачайте WordPress: | ||
− | < | + | <pre>cd /tmp</pre> |
− | < | + | <pre>wget https://wordpress.org/latest.tar.gz</pre> |
− | < | + | <pre>tar -xzf latest.tar.gz</pre> |
2. Переместите файлы: | 2. Переместите файлы: | ||
− | < | + | <pre>sudo mv wordpress/* /var/www/example.com/public_html/</pre> |
− | < | + | <pre>sudo chown -R www-data:www-data /var/www/example.com/public_html</pre> |
3. Настройте WordPress: | 3. Настройте WordPress: | ||
− | < | + | <pre>sudo cp /var/www/example.com/public_html/wp-config-sample.php /var/www/example.com/public_html/wp-config.php</pre> |
4. Отредактируйте конфигурацию: | 4. Отредактируйте конфигурацию: | ||
− | < | + | <pre>sudo nano /var/www/example.com/public_html/wp-config.php</pre> |
=== Установка Laravel === | === Установка Laravel === | ||
1. Установите Composer: | 1. Установите Composer: | ||
− | < | + | <pre>curl -sS https://getcomposer.org/installer | php</pre> |
− | < | + | <pre>sudo mv composer.phar /usr/local/bin/composer</pre> |
2. Создайте Laravel проект: | 2. Создайте Laravel проект: | ||
− | < | + | <pre>cd /var/www/example.com/public_html</pre> |
− | < | + | <pre>composer create-project laravel/laravel .</pre> |
3. Настройте права доступа: | 3. Настройте права доступа: | ||
− | < | + | <pre>sudo chown -R www-data:www-data /var/www/example.com/public_html</pre> |
− | < | + | <pre>sudo chmod -R 755 /var/www/example.com/public_html</pre> |
− | == 13. Устранение неполадок | + | == 13. Устранение неполадок == |
=== Частые проблемы === | === Частые проблемы === | ||
1. '''Nginx не запускается''': | 1. '''Nginx не запускается''': | ||
− | * Проверьте конфигурацию: < | + | * Проверьте конфигурацию: <pre>sudo nginx -t</pre> |
− | * Проверьте логи: < | + | * Проверьте логи: <pre>sudo journalctl -u nginx</pre> |
− | * Проверьте порты: < | + | * Проверьте порты: <pre>sudo netstat -tlnp | grep :80</pre> |
2. '''PHP не работает''': | 2. '''PHP не работает''': | ||
− | * Проверьте статус PHP-FPM: < | + | * Проверьте статус PHP-FPM: <pre>sudo systemctl status php8.1-fpm</pre> |
− | * Проверьте сокет: < | + | * Проверьте сокет: <pre>ls -la /run/php/php8.1-fpm.sock</pre> |
* Проверьте конфигурацию Nginx | * Проверьте конфигурацию Nginx | ||
3. '''MySQL не подключается''': | 3. '''MySQL не подключается''': | ||
− | * Проверьте статус: < | + | * Проверьте статус: <pre>sudo systemctl status mysql</pre> |
− | * Проверьте логи: < | + | * Проверьте логи: <pre>sudo tail -f /var/log/mysql/error.log</pre> |
* Проверьте права пользователя | * Проверьте права пользователя | ||
Строка 643: | Строка 643: | ||
1. '''Проверка статуса сервисов''': | 1. '''Проверка статуса сервисов''': | ||
− | < | + | <pre>sudo systemctl status nginx</pre> |
− | < | + | <pre>sudo systemctl status mysql</pre> |
− | < | + | <pre>sudo systemctl status php8.1-fpm</pre> |
2. '''Проверка логов''': | 2. '''Проверка логов''': | ||
− | < | + | <pre>sudo tail -f /var/log/nginx/error.log</pre> |
− | < | + | <pre>sudo tail -f /var/log/mysql/error.log</pre> |
− | < | + | <pre>sudo tail -f /var/log/php8.1-fpm.log</pre> |
3. '''Проверка подключения к базе данных''': | 3. '''Проверка подключения к базе данных''': | ||
− | < | + | <pre>mysql -u myapp_user -p -e "SELECT 1;"</pre> |
4. '''Тестирование PHP''': | 4. '''Тестирование PHP''': | ||
− | < | + | <pre>php -r "echo 'PHP is working';"</pre> |
5. '''Проверка конфигурации Nginx''': | 5. '''Проверка конфигурации Nginx''': | ||
− | < | + | <pre>sudo nginx -t</pre> |
== Заключение == | == Заключение == |
Текущая версия на 10:33, 15 октября 2025
Содержание
- 1 Настройка LEMP стека (Linux, Nginx, MySQL, PHP)
- 1.1 1. Подготовка системы
- 1.2 2. Установка Nginx
- 1.3 3. Установка MySQL
- 1.4 4. Установка PHP
- 1.5 5. Настройка Nginx для PHP
- 1.6 6. Настройка виртуальных хостов
- 1.7 7. Настройка SSL
- 1.8 8. Настройка безопасности
- 1.9 9. Оптимизация производительности
- 1.10 10. Мониторинг и логирование
- 1.11 11. Резервное копирование
- 1.12 12. Установка популярных CMS
- 1.13 13. Устранение неполадок
- 1.14 Заключение
Настройка LEMP стека (Linux, Nginx, MySQL, PHP)
1. Подготовка системы
- Войдите в систему под учетной записью с правами root или пользователя с правами sudo.
- Убедитесь, что у вас есть доступ к серверу через SSH или консоль.
2. Установка Nginx
Обновление системы
1. Обновите систему:
sudo apt update
2. Установите необходимые пакеты:
sudo apt install -y wget curl unzip
Установка Nginx
1. Установите Nginx:
sudo apt install -y nginx
2. Запустите и включите автозапуск:
sudo systemctl start nginx
sudo systemctl enable nginx
3. Проверьте статус:
sudo systemctl status nginx
4. Проверьте работу Nginx:
curl -I http://localhost
Настройка Nginx
1. Проверьте конфигурацию:
sudo nginx -t
2. Перезапустите Nginx:
sudo systemctl restart nginx
3. Проверьте порты:
sudo netstat -tlnp | grep :80
3. Установка MySQL
Установка MySQL
1. Установите MySQL:
sudo apt install -y mysql-server
2. Запустите и включите автозапуск:
sudo systemctl start mysql
sudo systemctl enable mysql
3. Проверьте статус:
sudo systemctl status mysql
Настройка безопасности MySQL
1. Запустите скрипт безопасности:
sudo mysql_secure_installation
2. Следуйте инструкциям:
- Установите пароль для root
- Удалите анонимных пользователей
- Запретите удаленный вход root
- Удалите тестовую базу данных
- Перезагрузите таблицы привилегий
Создание базы данных и пользователя
1. Подключитесь к MySQL:
sudo mysql -u root -p
2. Создайте базу данных:
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. Создайте пользователя:
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password';
4. Предоставьте права:
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
5. Выйдите из MySQL:
EXIT;
4. Установка PHP
Установка PHP-FPM
1. Установите PHP-FPM и необходимые модули:
sudo apt install -y php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip php8.1-intl php8.1-soap php8.1-json php8.1-bcmath
2. Проверьте версию PHP:
php --version
3. Проверьте статус PHP-FPM:
sudo systemctl status php8.1-fpm
Настройка PHP-FPM
1. Отредактируйте конфигурацию PHP:
sudo nano /etc/php/8.1/fpm/php.ini
2. Настройте основные параметры:
upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300 max_input_time = 300 memory_limit = 256M date.timezone = Europe/Moscow display_errors = Off log_errors = On error_log = /var/log/php_errors.log
3. Настройте пул PHP-FPM:
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
4. Настройте параметры пула:
user = www-data group = www-data listen = /run/php/php8.1-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35
5. Перезапустите PHP-FPM:
sudo systemctl restart php8.1-fpm
Тестирование PHP
1. Создайте тестовый файл:
sudo nano /var/www/html/info.php
2. Добавьте содержимое:
<?php phpinfo(); ?>
3. Проверьте в браузере:
http://your-server-ip/info.php
4. Удалите тестовый файл:
sudo rm /var/www/html/info.php
5. Настройка Nginx для PHP
Базовая конфигурация
1. Отредактируйте конфигурацию сайта по умолчанию:
sudo nano /etc/nginx/sites-available/default
2. Замените содержимое:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; } location ~ /\.ht { deny all; } }
3. Проверьте конфигурацию:
sudo nginx -t
4. Перезапустите Nginx:
sudo systemctl restart nginx
6. Настройка виртуальных хостов
Создание виртуального хоста
1. Создайте директорию для сайта:
sudo mkdir -p /var/www/example.com/public_html
2. Установите права доступа:
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
3. Создайте конфигурацию виртуального хоста:
sudo nano /etc/nginx/sites-available/example.com
4. Добавьте конфигурацию:
server { listen 80; listen [::]:80; root /var/www/example.com/public_html; index index.php index.html index.htm; server_name example.com www.example.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; } location ~ /\.ht { deny all; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } }
5. Включите сайт:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
6. Удалите сайт по умолчанию:
sudo rm /etc/nginx/sites-enabled/default
7. Проверьте конфигурацию:
sudo nginx -t
8. Перезапустите Nginx:
sudo systemctl restart nginx
Создание тестовой страницы
1. Создайте index.html:
sudo nano /var/www/example.com/public_html/index.html
2. Добавьте содержимое:
<!DOCTYPE html> <html> <head> <title>Welcome to Example.com</title> </head> <body> <h1>LEMP Stack is Working!</h1> <p>Nginx, MySQL, and PHP are running successfully.</p> </body> </html>
3. Создайте PHP тест:
sudo nano /var/www/example.com/public_html/info.php
4. Добавьте содержимое:
<?php echo "<h1>PHP is working!</h1>"; echo "<p>Current time: " . date('Y-m-d H:i:s') . "</p>"; phpinfo(); ?>
7. Настройка SSL
Установка Certbot
1. Установите Certbot:
sudo apt install -y certbot python3-certbot-nginx
2. Получите SSL сертификат:
sudo certbot --nginx -d example.com -d www.example.com
3. Настройте автоматическое обновление:
sudo crontab -e
4. Добавьте задачу:
0 12 * * * /usr/bin/certbot renew --quiet
Проверка SSL
1. Проверьте SSL сертификат:
sudo certbot certificates
2. Протестируйте SSL:
curl -I https://example.com
8. Настройка безопасности
Настройка файрвола
1. Настройте UFW:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
2. Проверьте статус:
sudo ufw status
Настройка fail2ban
1. Установите fail2ban:
sudo apt install -y fail2ban
2. Создайте конфигурацию:
sudo nano /etc/fail2ban/jail.local
3. Добавьте настройки:
[DEFAULT] bantime = 3600 findtime = 600 maxretry = 3 [nginx-http-auth] enabled = true port = http,https logpath = /var/log/nginx/error.log [nginx-limit-req] enabled = true port = http,https logpath = /var/log/nginx/error.log
4. Запустите fail2ban:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
Настройка безопасности Nginx
1. Создайте конфигурацию безопасности:
sudo nano /etc/nginx/conf.d/security.conf
2. Добавьте правила безопасности:
\# Скрытие версии Nginx server_tokens off; \# Защита от clickjacking add_header X-Frame-Options "SAMEORIGIN" always; \# Защита от MIME sniffing add_header X-Content-Type-Options "nosniff" always; \# XSS Protection add_header X-XSS-Protection "1; mode=block" always; \# Strict Transport Security add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; \# Запрет доступа к скрытым файлам location ~ /\. { deny all; access_log off; log_not_found off; } \# Запрет доступа к backup файлам location ~* \.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)$ { deny all; }
3. Включите конфигурацию в виртуальный хост:
sudo nano /etc/nginx/sites-available/example.com
4. Добавьте в начало файла:
include /etc/nginx/conf.d/security.conf;
5. Перезапустите Nginx:
sudo systemctl restart nginx
9. Оптимизация производительности
Настройка кэширования
1. Создайте конфигурацию кэширования:
sudo nano /etc/nginx/conf.d/cache.conf
2. Добавьте настройки:
\# Кэширование статических файлов location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; } \# Кэширование шрифтов location ~* \.(woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; } \# Gzip сжатие gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
Настройка PHP-FPM пулов
1. Создайте отдельный пул для сайта:
sudo nano /etc/php/8.1/fpm/pool.d/example.com.conf
2. Добавьте конфигурацию:
[example.com] user = www-data group = www-data listen = /run/php/php8.1-fpm-example.com.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 20 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 10 pm.max_requests = 1000 php_admin_value[error_log] = /var/log/php8.1-fpm-example.com.log php_admin_flag[log_errors] = on
3. Обновите конфигурацию Nginx:
sudo nano /etc/nginx/sites-available/example.com
4. Измените fastcgi_pass:
fastcgi_pass unix:/run/php/php8.1-fpm-example.com.sock;
5. Перезапустите сервисы:
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
10. Мониторинг и логирование
Настройка логирования
1. Настройте ротацию логов:
sudo nano /etc/logrotate.d/lemp
2. Добавьте конфигурацию:
/var/log/nginx/*.log { daily missingok rotate 52 compress delaycompress notifempty create 644 www-data www-data postrotate systemctl reload nginx endscript } /var/log/mysql/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 mysql mysql postrotate systemctl reload mysql endscript }
Создание скрипта мониторинга
1. Создайте скрипт мониторинга:
sudo nano /usr/local/bin/lemp-monitor.sh
2. Добавьте содержимое:
\#!/bin/bash \# Проверка статуса Nginx if ! systemctl is-active --quiet nginx; then echo "Nginx is down!" | mail -s "LEMP Alert" admin@example.com fi \# Проверка статуса MySQL if ! systemctl is-active --quiet mysql; then echo "MySQL is down!" | mail -s "LEMP Alert" admin@example.com fi \# Проверка статуса PHP-FPM if ! systemctl is-active --quiet php8.1-fpm; then echo "PHP-FPM is down!" | mail -s "LEMP Alert" admin@example.com fi \# Проверка использования диска DISK_USAGE=$(df /var/www | tail -1 | awk '{print $5}' | sed 's/%//') if [ $DISK_USAGE -gt 80 ]; then echo "Disk usage is high: ${DISK_USAGE}%" | mail -s "LEMP Alert" admin@example.com fi \# Проверка доступности сайта if ! curl -s -o /dev/null -w "%{http_code}" http://example.com | grep -q "200"; then echo "Website is not responding!" | mail -s "LEMP Alert" admin@example.com fi
3. Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/lemp-monitor.sh
4. Добавьте в crontab:
sudo crontab -e
5. Добавьте задачу:
*/5 * * * * /usr/local/bin/lemp-monitor.sh
11. Резервное копирование
Создание скрипта резервного копирования
1. Создайте скрипт резервного копирования:
sudo nano /usr/local/bin/lemp-backup.sh
2. Добавьте содержимое:
\#!/bin/bash BACKUP_DIR="/backup/lemp" DATE=$(date +%Y%m%d_%H%M%S) SITE_DIR="/var/www/example.com" \# Создание директории для бэкапа mkdir -p $BACKUP_DIR \# Резервное копирование файлов сайта tar -czf $BACKUP_DIR/website-$DATE.tar.gz -C $SITE_DIR . \# Резервное копирование базы данных mysqldump -u myapp_user -p'strong_password' myapp > $BACKUP_DIR/database-$DATE.sql \# Сжатие SQL файла gzip $BACKUP_DIR/database-$DATE.sql \# Резервное копирование конфигурации Nginx tar -czf $BACKUP_DIR/nginx-config-$DATE.tar.gz -C /etc nginx \# Резервное копирование конфигурации PHP-FPM tar -czf $BACKUP_DIR/php-config-$DATE.tar.gz -C /etc php \# Удаление старых бэкапов (старше 7 дней) find $BACKUP_DIR -name "*$DATE*" -mtime +7 -delete echo "LEMP backup completed: $DATE"
3. Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/lemp-backup.sh
4. Добавьте в crontab:
sudo crontab -e
5. Добавьте задачу:
0 3 * * * /usr/local/bin/lemp-backup.sh
12. Установка популярных CMS
Установка WordPress
1. Скачайте WordPress:
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
2. Переместите файлы:
sudo mv wordpress/* /var/www/example.com/public_html/
sudo chown -R www-data:www-data /var/www/example.com/public_html
3. Настройте WordPress:
sudo cp /var/www/example.com/public_html/wp-config-sample.php /var/www/example.com/public_html/wp-config.php
4. Отредактируйте конфигурацию:
sudo nano /var/www/example.com/public_html/wp-config.php
Установка Laravel
1. Установите Composer:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
2. Создайте Laravel проект:
cd /var/www/example.com/public_html
composer create-project laravel/laravel .
3. Настройте права доступа:
sudo chown -R www-data:www-data /var/www/example.com/public_html
sudo chmod -R 755 /var/www/example.com/public_html
13. Устранение неполадок
Частые проблемы
1. Nginx не запускается:
- Проверьте конфигурацию:
sudo nginx -t
- Проверьте логи:
sudo journalctl -u nginx
- Проверьте порты:
sudo netstat -tlnp | grep :80
2. PHP не работает:
- Проверьте статус PHP-FPM:
sudo systemctl status php8.1-fpm
- Проверьте сокет:
ls -la /run/php/php8.1-fpm.sock
- Проверьте конфигурацию Nginx
3. MySQL не подключается:
- Проверьте статус:
sudo systemctl status mysql
- Проверьте логи:
sudo tail -f /var/log/mysql/error.log
- Проверьте права пользователя
Диагностика
1. Проверка статуса сервисов:
sudo systemctl status nginx
sudo systemctl status mysql
sudo systemctl status php8.1-fpm
2. Проверка логов:
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/mysql/error.log
sudo tail -f /var/log/php8.1-fpm.log
3. Проверка подключения к базе данных:
mysql -u myapp_user -p -e "SELECT 1;"
4. Тестирование PHP:
php -r "echo 'PHP is working';"
5. Проверка конфигурации Nginx:
sudo nginx -t
Заключение
LEMP стек успешно установлен и настроен! Теперь у вас есть высокопроизводительная веб-платформа с Nginx, MySQL и PHP-FPM для разработки и хостинга веб-приложений.
Для размещения ваших LEMP приложений на надежном хостинге рекомендуем воспользоваться услугами [ARK-HOSTER.RU](https://ark-hoster.ru):
- [Выделенные серверы](https://ark-hoster.ru/dedicated/) - для высоконагруженных LEMP приложений
- [VPS/VDS серверы](https://ark-hoster.ru/vpsgame/) - для небольших и средних проектов
Наши специалисты помогут с настройкой LEMP стека и оптимизацией производительности ваших веб-приложений!