استقرار Next.js روی سرور مجازی با Nginx و PM2

راهنمای کامل انتشار Next.js روی سرور Ubuntu: نصب Node.js، اجرای دائمی با PM2، پیکربندی Nginx به‌عنوان Reverse Proxy و گواهی SSL رایگان Let's Encrypt.

استقرار Next.js روی سرور مجازی با Nginx و PM2
زمان انتشار:
۱۵ مرداد ۱۴۰۵
زمان مطالعه:
حدود 3 دقیقه
نویسنده:
علیرضا مهدی زاده
دسته‌بندی:فول‌استکدواپس

استقرار Next.js روی سرور مجازی؛ بدون وابستگی به پلتفرم‌های خارجی

پلتفرم‌هایی مثل Vercel استقرار Next.js را بسیار ساده کرده‌اند، اما برای بسیاری از پروژه‌های ایرانی، محدودیت‌های تحریم، هزینه‌ی ارزی و نیاز به دسترسی کامل به سرور، استفاده از یک سرور مجازی (VPS) را منطقی‌تر می‌کند. در این راهنما یک اپلیکیشن Next.js را روی Ubuntu مستقر می‌کنیم، با PM2 همیشه روشن نگهش می‌داریم و با Nginx و گواهی SSL رایگان آن را روی دامنه منتشر می‌کنیم.

ساختمانی با ده‌ها پنجره‌ی یکسان؛ یادآور ردیف سرورها در یک دیتاسنتر

۱. آماده‌سازی سرور

پس از ورود با SSH، ابتدا سیستم را به‌روز کنید، یک کاربر غیر root بسازید و Node.js نسخه‌ی LTS را نصب کنید:

sudo apt update && sudo apt upgrade -y
sudo adduser deploy
sudo usermod -aG sudo deploy

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs nginx
sudo npm install -g pm2

فعال کردن فایروال هم نباید فراموش شود. فقط پورت‌های SSH و وب را باز بگذارید:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

۲. بیلد و اجرای پروژه با PM2

کد را از مخزن Git دریافت کنید، فایل .env را بسازید و پروژه را بیلد کنید. سپس به‌جای اجرای مستقیم npm start، مدیریت پروسس را به PM2 بسپارید تا در صورت کرش یا ری‌استارت سرور، برنامه خودکار دوباره اجرا شود:

git clone git@github.com:username/my-site.git && cd my-site
npm ci
npx prisma migrate deploy
npm run build

pm2 start npm --name my-site -- start
pm2 save
pm2 startup

ریل‌ها، سیم‌ها و چراغ‌های سیگنال یک ایستگاه قطار؛ مسیریابی درخواست‌ها توسط Nginx

۳. پیکربندی Nginx به‌عنوان Reverse Proxy

Next.js روی پورت ۳۰۰۰ اجرا می‌شود؛ Nginx درخواست‌های پورت ۸۰ و ۴۴۳ را دریافت و به آن پاس می‌دهد. علاوه بر این، فشرده‌سازی، کش فایل‌های استاتیک و مدیریت SSL را هم بر عهده می‌گیرد:

server {
    server_name example.com www.example.com;
    client_max_body_size 10M;

    location /_next/static/ {
        proxy_pass http://127.0.0.1:3000;
        add_header Cache-Control "public, max-age=31536000, immutable";
    }

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        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;
    }
}

فایل را در /etc/nginx/sites-available/ ذخیره کنید، با یک لینک در sites-enabled فعالش کنید و با sudo nginx -t از درستی تنظیمات مطمئن شوید.

۴. گواهی SSL رایگان با Let's Encrypt

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot به‌صورت خودکار تنظیمات Nginx را برای HTTPS به‌روز می‌کند و یک تایمر برای تمدید گواهی می‌سازد.

لپ‌تاپ بسته و کتاب روی میز سفید؛ پیکربندی تمیز و مینیمال سرور

۵. نظارت و نگهداری

استقرار پایان کار نیست. چند عادت ساده جلوی بسیاری از مشکلات را می‌گیرد:

  • لاگ‌ها: با pm2 logs my-site خطاهای زمان اجرا را ببینید و با pm2-logrotate حجم لاگ‌ها را کنترل کنید.
  • مانیتورینگ منابع: دستور pm2 monit مصرف CPU و حافظه را به‌صورت زنده نشان می‌دهد.
  • پشتیبان‌گیری: از پایگاه داده و پوشه‌ی آپلودها به‌صورت روزانه نسخه‌ی پشتیبان تهیه کنید.
  • استقرار بدون قطعی: با pm2 reload به‌جای restart، نسخه‌ی جدید بدون قطع شدن سایت جایگزین می‌شود.

فانوس دریایی روشن در آسمان آبی؛ نمادی از نظارت دائمی روی سرور

یک اسکریپت استقرار ساده

برای اینکه هر بار دستورها را دستی تکرار نکنید، آن‌ها را در یک اسکریپت قرار دهید:

#!/usr/bin/env bash
set -e
cd ~/my-site
git pull origin main
npm ci
npx prisma migrate deploy
npm run build
pm2 reload my-site
echo "Deployed ✔"

ساعت کلاسیک با عقربه‌های مشکی؛ زمان‌بندی تمدید گواهی و پشتیبان‌گیری خودکار

جمع‌بندی

با یک سرور مجازی ارزان، Nginx، PM2 و Certbot می‌توانید یک اپلیکیشن Next.js را با کنترل کامل، سرعت مناسب و هزینه‌ی ریالی منتشر کنید. همین سایت هم با رویکردی مشابه روی سرور اجرا می‌شود. وقتی این مراحل را یک بار انجام دهید، استقرارهای بعدی تنها چند دقیقه زمان خواهند برد.

دیدگاه‌ها

برای ثبت دیدگاه باید شماره موبایل خود را تأیید کنید.

هنوز دیدگاهی ثبت نشده است. اولین نفر باشید!