نحوهٔ میزبانی مستقل اپلیکیشن Next.js – پیکربندی، کشینگ، و استراتژی‌های استقرار

nextjs-self-hosting-deployment-cache-isr-proxy-env

Self-hostingNext.jsISRProxyEnvironment Variables

~3 دقیقه مطالعه • بروزرسانی ۶ آبان ۱۴۰۴

بهینه‌سازی تصاویر


کامپوننت next/image به‌صورت پیش‌فرض با next start در حالت self-hosted کار می‌کند. همچنین می‌توانید از loader سفارشی در next.config.js استفاده کنید.

  • تصاویر در زمان اجرا بهینه می‌شوند، نه در زمان build
  • می‌توانید بهینه‌سازی را غیرفعال کرده و فقط از مزایای layout و فرمت استفاده کنید
  • در سیستم‌های لینوکس glibc ممکن است نیاز به تنظیمات حافظه باشد

پشتیبانی از Proxy


Proxy در حالت self-hosted با next start بدون نیاز به پیکربندی فعال است. از Edge runtime برای اجرای سریع‌تر قبل از پاسخ‌دهی استفاده می‌کند.

  • در حالت static export پشتیبانی نمی‌شود
  • برای منطق پیچیده‌تر از Server Component یا سرور سفارشی استفاده کنید

متغیرهای محیطی


Next.js از متغیرهای محیطی در زمان build و اجرا پشتیبانی می‌کند:

  • به‌صورت پیش‌فرض فقط در سرور قابل دسترسی هستند
  • برای دسترسی در کلاینت باید با NEXT_PUBLIC_ شروع شوند
  • در رندر دینامیک در زمان اجرا ارزیابی می‌شوند
const value = process.env.MY_VALUE

کشینگ و ISR


Next.js به‌صورت خودکار صفحات استاتیک، خروجی ISR، و فایل‌های استاتیک را کش می‌کند. کش به‌صورت پیش‌فرض روی دیسک و حافظه ذخیره می‌شود.

  • فایل‌های immutable: Cache-Control: public, max-age=31536000, immutable
  • صفحات ISR: s-maxage و stale-while-revalidate
  • صفحات دینامیک: private, no-cache, no-store

استفاده از cache handler سفارشی


برای اشتراک‌گذاری کش بین کانتینرها یا غیرفعال‌سازی حافظه داخلی:

// next.config.js
module.exports = {
  cacheHandler: require.resolve('./cache-handler.js'),
  cacheMaxMemorySize: 0,
}

مثال cache-handler.js:

const cache = new Map()

module.exports = class CacheHandler {
  async get(key) { return cache.get(key) }
  async set(key, data, ctx) {
    cache.set(key, { value: data, lastModified: Date.now(), tags: ctx.tags })
  }
  async revalidateTag(tags) {
    tags = [tags].flat()
    for (let [key, value] of cache) {
      if (value.tags.some(tag => tags.includes(tag))) {
        cache.delete(key)
      }
    }
  }
  resetRequestCache() {}
}

کش بیلد و نسخه‌گذاری


برای استفاده از بیلد ثابت بین کانتینرها:

generateBuildId: async () => process.env.GIT_HASH

Next.js در صورت تشخیص اختلاف نسخه، اپ را ریفرش می‌کند. برای حفظ وضعیت، از localStorage یا URL state استفاده کنید.


استریمینگ و Suspense


استریمینگ در App Router پشتیبانی می‌شود. برای فعال‌سازی در Nginx:

// next.config.js
headers: [
  {
    source: '/:path*{/}?',
    headers: [{ key: 'X-Accel-Buffering', value: 'no' }],
  },
]

فایل‌های استاتیک و CDN


برای میزبانی فایل‌ها در دامنه دیگر:

assetPrefix: 'https://cdn.example.com'

صفحات دینامیک با Cache-Control: private و صفحات استاتیک با Cache-Control: public ارسال می‌شوند.


جمع‌بندی


با میزبانی مستقل اپلیکیشن Next.js، کنترل کامل بر کشینگ، متغیرهای محیطی، استریمینگ، و استقرار خواهید داشت. با پیکربندی مناسب، می‌توانید عملکرد را بهینه کرده و سازگاری بین محیط‌ها را حفظ کنید.


نوشته و پژوهش شده توسط دکتر شاهین صیامی