Как установить Node.js в Debian 12 и запустить Next.js приложение?

1. Установка Node.js 22.x LTS

Рекомендую установить через NodeSource репозиторий для получения актуальной версии:

# Обновляем систему
sudo apt update && sudo apt upgrade -y

# Устанавливаем необходимые пакеты
sudo apt install -y curl software-properties-common

# Добавляем NodeSource репозиторий для Node.js 22.x
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -

# Устанавливаем Node.js
sudo apt install -y nodejs

# Проверяем версии
node --version  # должно показать v22.x.x
npm --version

Альтернативный способ через NVM (Node Version Manager)

Если хотите иметь возможность легко переключаться между версиями Node.js:

# Устанавливаем NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# Перезагружаем shell или выполняем
source ~/.bashrc

# Устанавливаем Node.js 22 LTS
nvm install --lts
nvm use --lts
nvm alias default lts/*

# Проверяем
node --version  # покажет v22.x.x

Node.js 22 LTS имеет ряд преимуществ:

  • Улучшенная производительность
  • Встроенная поддержка WebSocket клиента
  • Улучшенная поддержка ESM модулей
  • Обновлённый V8 движок
  • Поддержка до апреля 2027 года

2. Установка PM2 (менеджер процессов)

PM2 — это специальная программа, которая следит за работой вашего Node.js приложения на сервере. Представьте её как надёжного администратора, который работает круглосуточно и следит, чтобы ваш сайт всегда оставался доступным.

Основная проблема

Когда вы запускаете Node.js приложение обычным способом, оно работает только пока открыт терминал. Стоит закрыть окно терминала или разорвать SSH-соединение — приложение останавливается. Если приложение падает из-за ошибки, оно не перезапускается самостоятельно. После перезагрузки сервера приложение не запустится автоматически — нужно вручную подключаться и запускать его снова.

Что делает PM2

PM2 решает все эти проблемы. Он запускает ваше приложение в фоновом режиме и постоянно следит за его состоянием. Если приложение упадёт из-за ошибки, PM2 моментально его перезапустит. При перезагрузке сервера PM2 автоматически запустит все необходимые приложения без вашего участия.

Кроме базового функционала «держать приложение живым», PM2 предоставляет удобные инструменты для production-окружения: ведение логов, мониторинг потребления памяти и процессора, возможность запуска нескольких экземпляров приложения для распределения нагрузки, обновление кода без остановки сервиса.

Почему это важно

Для production-сервера критически важна стабильность и непрерывность работы. PM2 обеспечивает эту стабильность, автоматизируя рутинные задачи администрирования Node.js приложений. Это стандартный инструмент в индустрии — практически каждый Node.js проект в production использует PM2 или аналогичные решения.

В контексте Next.js приложения PM2 особенно полезен, так как позволяет эффективно использовать серверные ресурсы, автоматически перезапускать приложение при обновлениях и вести подробные логи работы приложения, что упрощает отладку и мониторинг.

sudo npm install -g pm2

3. Создание Next.js приложения

# Создаём директорию для проекта
mkdir -p /var/www/nextjs-app
cd /var/www/nextjs-app

# Создаём новое Next.js приложение
npx create-next-app@latest

# Устанавливаем зависимости
npm install

# Собираем production версию
npm run build

4. Настройка PM2 для Next.js

Создайте файл ecosystem.config.js в корне проекта:

module.exports = {
  apps: [{
    name: 'nextjs-app',
    script: 'npm',
    args: 'start',
    cwd: '/var/www/nextjs-app',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    }
  }]
}

Запустите приложение:

# Запускаем через PM2
pm2 start ecosystem.config.js

# Сохраняем конфигурацию PM2
pm2 save

# Настраиваем автозапуск при перезагрузке
pm2 startup systemd -u $USER --hp /home/$USER

Если всё сделано правильно, то вы увидите в консоли это:

image 2 - Как установить Node.js в Debian 12 и запустить Next.js приложение?

В процессе PM2 сгенерирует команду, которую нужно выполнить. Скопируйте и выполните эту команду:

sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ВАШ_ЮЗЕР --hp /home/ВАШ_ЮЗЕР

5. Настройка nginx для проксирования

Создайте конфигурационный файл для вашего сайта:

sudo nano /etc/nginx/sites-available/nextjs-app

Добавьте следующую конфигурацию:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;  # Замените на ваш домен

    # Максимальный размер загружаемых файлов
    client_max_body_size 20M;

    # Gzip сжатие
    gzip on;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # Проксирование на Next.js
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        
        # Дополнительные заголовки
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # Таймауты
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # Кеширование статических файлов Next.js
    location /_next/static {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        
        # Кеширование на 1 год
        add_header Cache-Control "public, max-age=31536000, immutable";
    }
}

6. Активация конфигурации

# Создаём символическую ссылку
sudo ln -s /etc/nginx/sites-available/nextjs-app /etc/nginx/sites-enabled/

# Проверяем конфигурацию
sudo nginx -t

# Перезапускаем nginx
sudo systemctl reload nginx

7. Настройка SSL (опционально, но рекомендуется)

# Устанавливаем Certbot
sudo apt install -y certbot python3-certbot-nginx

# Получаем SSL сертификат
sudo certbot --nginx -d example.com -d www.example.com

# Автообновление сертификатов уже настроено автоматически

Теперь ваш Next.js сайт должен быть доступен по адресу вашего домена. Next.js будет работать на порту 3000, а nginx будет проксировать все запросы к нему.

Полезные команды для управления

# PM2 команды
pm2 status          # Статус приложений
pm2 logs           # Логи
pm2 restart all    # Перезапуск
pm2 monit          # Мониторинг

# Просмотр логов nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# Перезапуск после изменений в коде
cd /var/www/nextjs-app
git pull           # Если используете git
npm install        # Если изменились зависимости
npm run build      # Пересборка
pm2 restart nextjs-app

Как установить WordPress с Nginx и PHP 8.4 на Debian 12: пошаговое руководство

Это руководство покажет, как установить и настроить WordPress с веб-сервером Nginx и PHP 8.4 на Debian 12. Мы пройдем через полную настройку сервера, включая безопасность, SSL-сертификаты и оптимизацию производительности.

Что вы получите:

  • Безопасная настройка сервера Debian 12
  • Nginx с оптимизированной конфигурацией для WordPress
  • PHP 8.4 с необходимыми модулями
  • MariaDB для базы данных
  • SSL-сертификат Let’s Encrypt
  • Firewall и базовая защита

1. Начальная настройка сервера Debian 12

Подключение к серверу

ssh root@your_server_ip

Обновление системы

apt update -y && apt upgrade -y

Создание пользователя с sudo привилегиями

# Создаем нового пользователя
adduser debian

# Добавляем в группу sudo
usermod -a -G sudo debian

Настройка SSH безопасности

nano /etc/ssh/sshd_config

Измените следующие параметры:

Port 22500
Protocol 2
PermitRootLogin no
UseDNS no
AllowUsers debian

Обратите внимание, что мы изменили стандартный порт 22.

Перезапустите SSH:

systemctl restart ssh.service

Выйдите и подключитесь под новым пользователем:

# Выход
exit

# Подключение под новым пользователем
ssh -p 22500 debian@your_server_ip

2. Установка Nginx, PHP 8.4 и MariaDB

Установка базовых пакетов

sudo apt install nginx mariadb-server mariadb-client unzip wget git curl gnupg2 software-properties-common -y

Установка PHP 8.4 из репозитория Sury

# Добавляем GPG ключ
curl -sSL https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /usr/share/keyrings/sury-php.gpg

# Добавляем репозиторий
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list

# Обновляем список пакетов
sudo apt update

# Устанавливаем PHP 8.4 и необходимые модули
sudo apt install php8.4-fpm php8.4-common php8.4-mysql php8.4-gd php8.4-bcmath php8.4-curl php8.4-mbstring php8.4-xml php8.4-zip php8.4-intl php8.4-soap php8.4-readline php8.4-opcache -y

Скрупулезным людям можно воспользоваться этой ссылкой и посмотреть точные зависимости расширений PHP для работы CMS WordPress.

Настройка PHP 8.4

sudo nano /etc/php/8.4/fpm/php.ini

Измените следующие параметры:

post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 32M
date.timezone = Europe/Moscow
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000

Перезапустите PHP-FPM:

sudo systemctl restart php8.4-fpm.service
sudo systemctl enable php8.4-fpm.service

3. Настройка Nginx для WordPress

Создание директории сайта

sudo mkdir -p /var/www/yourdomain.com

Создание конфигурации Nginx

sudo nano /etc/nginx/sites-available/yourdomain.com.conf

Добавьте конфигурацию:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    root /var/www/yourdomain.com;
    index index.php index.html;

    # Логи
    access_log /var/log/nginx/yourdomain.com_access.log;
    error_log /var/log/nginx/yourdomain.com_error.log;

    # Максимальный размер загружаемых файлов
    client_max_body_size 64M;

    # Favicon и robots.txt
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Основная локация
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP обработка
    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_read_timeout 3600s;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 128k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_index index.php;
    }

    # Кеширование статических файлов
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        log_not_found off;
    }

    # Защита от доступа к системным файлам
    location ~ /\. {
        deny all;
    }

    location ~ ^/(wp-config\.php|readme\.html|license\.txt)$ {
        deny all;
    }
}

Активация конфигурации

# Проверка синтаксиса
sudo nginx -t

# Создание символической ссылки
sudo ln -s /etc/nginx/sites-available/yourdomain.com.conf /etc/nginx/sites-enabled/

# Удаление дефолтной конфигурации
sudo rm /etc/nginx/sites-enabled/default

# Перезапуск Nginx
sudo systemctl restart nginx.service
sudo systemctl enable nginx.service

4. Настройка базы данных MariaDB

Безопасная установка MariaDB

sudo mysql_secure_installation

Ответьте на вопросы:

  • Set root password: Y (задайте сильный пароль)
  • Remove anonymous users: Y
  • Disallow root login remotely: Y
  • Remove test database: Y
  • Reload privilege tables: Y

Создание базы данных для WordPress

mysql -u root -p

Выполните SQL команды:

CREATE DATABASE wp_yourdomain DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

GRANT ALL ON wp_yourdomain.* TO 'wpuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';

FLUSH PRIVILEGES;

EXIT;

5. Установка WordPress

Загрузка и распаковка WordPress

cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xvzf latest.tar.gz

Настройка конфигурации WordPress

# Копирование конфигурационного файла
cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php

# Редактирование конфигурации
nano /tmp/wordpress/wp-config.php

Генерация ключей безопасности

curl -s https://api.wordpress.org/secret-key/1.1/salt/

Скопируйте полученные ключи и вставьте в wp-config.php

Настройка подключения к базе данных

В файле wp-config.php замените:

// ** Database settings ** //
define( 'DB_NAME', 'wp_yourdomain' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'StrongPassword123!' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );

Копирование файлов WordPress

# Копирование файлов
sudo cp -av /tmp/wordpress/* /var/www/yourdomain.com/

# Установка правильных прав доступа
sudo chown -R www-data:www-data /var/www/yourdomain.com/
sudo chmod -R 755 /var/www/yourdomain.com/

# Удаление временных файлов
rm -rf /tmp/wordpress*

6. Установка SSL-сертификата Let’s Encrypt

Установка Certbot

sudo apt install python3-acme python3-certbot python3-certbot-nginx -y

Получение SSL-сертификата

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot автоматически:

  • Получит сертификат
  • Обновит конфигурацию Nginx
  • Настроит автоматическое перенаправление с HTTP на HTTPS

Настройка автоматического обновления

# Тест обновления
sudo certbot renew --dry-run

# Создание cron задачи
echo "0 12 * * * /usr/bin/certbot renew --quiet" | sudo crontab -

7. Настройка Firewall (UFW)

Установка и настройка UFW

# Установка UFW
sudo apt install ufw -y

# Настройка правил
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Открытие необходимых портов
sudo ufw allow 22500/tcp comment 'SSH port 22500'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# Активация firewall
sudo ufw enable

# Проверка статуса
sudo ufw status verbose

8. Завершение установки WordPress

Доступ к веб-интерфейсу

Откройте браузер и перейдите по адресу: https://yourdomain.com

Заполнение формы установки WordPress

  1. Название сайта: ваше название
  2. Имя пользователя: admin (или другое)
  3. Пароль: создайте сильный пароль
  4. Email: ваш email адрес
  5. Приватность: снимите галочку для продакшн сайта

9. Оптимизация и безопасность

Настройка PHP OpCache

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.save_comments=1

Настройка логов Nginx

# Создание директории для логов
sudo mkdir -p /var/log/nginx/

# Ротация логов
sudo nano /etc/logrotate.d/nginx

Дополнительная безопасность в wp-config.php

// Отключение редактирования файлов из админки
define('DISALLOW_FILE_EDIT', true);

// Ограничение ревизий постов
define('WP_POST_REVISIONS', 3);

// Автоматическое удаление корзины
define('EMPTY_TRASH_DAYS', 30);

// Отключение отладки в продакшене
define('WP_DEBUG', false);

10. Проверка работоспособности

Команды для диагностики

# Проверка статуса сервисов
sudo systemctl status nginx
sudo systemctl status php8.4-fpm
sudo systemctl status mariadb

# Проверка PHP версии
php -v

# Проверка конфигурации Nginx
sudo nginx -t

# Проверка портов
sudo netstat -tlnp | grep -E "(80|443|3306)"

# Проверка SSL сертификата
sudo certbot certificates

Тест производительности

# Установка утилит для тестирования
sudo apt install apache2-utils -y

# Простой тест нагрузки
ab -n 100 -c 10 https://yourdomain.com/

Заключение

Вы успешно установили WordPress с Nginx и PHP 8.4 на Debian 12. Ваш сайт теперь работает с современными технологиями, имеет SSL-сертификат и базовую защиту.

Что дальше:

  • Установите необходимые плагины WordPress
  • Настройте резервное копирование
  • Рассмотрите установку CDN
  • Настройте мониторинг сервера

Полезные команды для обслуживания:

# Обновление системы
sudo apt update && sudo apt upgrade

# Перезапуск сервисов
sudo systemctl restart nginx php8.4-fpm mariadb

# Проверка логов
sudo tail -f /var/log/nginx/yourdomain.com_error.log

Ваш WordPress сайт готов к работе!