از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
Node.js بهینه سازی عملکرد برای میزبانی VPS تولید
سرفصلهای مطلب

این مقاله تنظیمی را پوشش می دهد که در واقع تاخیر p95 و ظرفیت درخواست همزمان را جابجا می کند روی یک VPS تولیدی، با الگوهای پیکربندی که در ترافیک واقعی پایدار است.
چرا تنظیم عملکرد Node.js اهمیت دارد؟ روی یک VPS تولید
یک VPS به شما می دهد root دسترسی، تخصیص اختصاصی vCPU، و پایدار process کنترل کنید که میزبانی مشترک نمی تواند، که دقیقا همان چیزی است که Node.js طولانی مدت است process نیاز دارد. پیش فرض node راه اندازی server.js برنامه شما را به صورت تک اجرا می کند process روی یک رشته واحد، بنابراین یک VPS 4-vCPU که یک برنامه تنظیم نشده را اجرا می کند، تقریباً 25 درصد از سخت افزاری را که برای آن پرداخت می کنید استفاده می کند. تنظیم این شکاف را از بین می برد.
دلیل دیگر تنظیم در لایه VPS این است که Node.js برای کد برنامه با طراحی تک رشته ای است. زمان اجرا استفاده می کند یک حلقه رویداد و یک thread pool libuv برای مدیریت I/O، اما هر کاری که به CPU می نویسید همچنان هر درخواستی را مسدود می کند روی آن کارگر تنظیم تولید بیشتر در مورد خارج کردن کار متصل به CPU از حلقه رویداد است. همچنین شامل قرار دادن لایههای ارزانتر در مقابل Node میشود تا زمان اجرا فقط به آنچه که باید رسیدگی کند.
رایج ترین گلوگاه های عملکرد Node.js چیست؟
مسائل تولید واقعی در اطراف تعداد انگشت شماری از آنها جمع می شوند root علل:
- مجرد-process استقرارها یک گره process نمی تواند از بیش از یک هسته CPU برای کد برنامه استفاده کند، بنابراین یک VPS چند هسته ای در حالت بیکار قرار می گیرد.
- حلقه رویداد مسدود شده است. فایل همزمان خوانده می شود، JSON.parse روی محموله های بزرگ، هش bcrypt روی رشته اصلی یا regex نامحدود هر درخواست همزمان را متوقف می کند.
- نشت حافظه از منابع حفظ شده بسته شدن طولانی مدت، افزایش حافظه نهان بدون تخلیه، و شنوندگان رویداد متصل شده بدون پاکسازی، به آرامی استفاده از پشته را از سقف پیشفرض 1.5 گیگابایت عبور میدهند.
- حافظه نهان در سطح HTTP وجود ندارد. هر درخواستی به کد برنامه برخورد می کند، حتی برای پاسخ هایی که هر ساعت یک بار تغییر می کنند.
- قرار گرفتن در معرض مستقیم در اینترنت. در حال دویدن node روی پورت 80 یا 443 بدون Nginx در جلو، خاتمه TLS، سرویس دهی فایل استاتیک و بافر آهسته کلاینت را به برنامه شما میگذارد.
- سفرهای رفت و برگشت پایگاه داده روی مسیر داغ نمایههای گمشده و پرسوجوهای N+1 بهعنوان مشکلات عملکرد گره نشان داده میشوند، حتی اگر زمان واقعی در انتظار صرف شود. روی پایگاه داده
دانستن اینکه کدام یک را دارید نیاز به اندازه گیری دارد، نه حدس زدن. قبل از تغییر هر چیزی، با بررسی تاخیر حلقه رویداد و استفاده از پشته شروع کنید.
چگونه تعداد خوشه و کارگر Node.js درست را تنظیم می کنید؟
الگوی خوشه ای یک Node را اجرا می کند process در هر هسته CPU، با یک Master process توزیع اتصالات بین کارگران را ماژول کلاستر Node.js در زمان اجرا تعبیه شده است و پایه و اساس است که PM2 و بیشتر process مدیران زیر کاپوت استفاده می کنند.

قانون کلی:
- بارهای کاری محدود یا متعادل: کارگران = تعداد vCPU. در VPS 4-vCPU، 4 کارگر را اجرا کنید.
- بارهای کاری سنگین I/O: کارگران = vCPU ها هنوز نقطه شروع مناسب است. اضافه کردن موارد به ندرت کمک می کند، زیرا گلوگاه پایگاه داده یا API خارجی است نه Node.
- برنامه های VPS با محدودیت حافظه: کارگران = کف (رم در دسترس / پشته برای هر کارگر). اگر هر کارگر 400 مگابایت پشته داشته باشد و بعد از سیستم عامل 2 گیگابایت رایگان داشته باشید، بدون در نظر گرفتن تعداد هسته، سقف چهار کارگر است.
با PM2 شما این را به طور آشکار تنظیم می کنید:
pm2 start app.js -i max --name api
را -i max پرچم در هر هسته موجود یک کارگر ایجاد می کند. از یک عدد خاص استفاده کنید، مانند -i 4، زمانی که می خواهید فضای اصلی را برای پایگاه داده یا حافظه پنهان بگذارید process روی همان وی پی اس
کدام تنظیمات PM2 و Process Manager ثبات را بهبود می بخشد؟
PM2 رایج ترین تولید است process مدیر برای Node، و پیش فرض ها پیکربندی مورد نظر شما در مقیاس نیستند. آماده تولید ecosystem.config.js به این نزدیک تر به نظر می رسد:
module.exports = {
apps: ({
name: 'api',
script: './server.js',
instances: 'max',
exec_mode: 'cluster',
max_memory_restart: '500M',
node_args: '--max-old-space-size=460',
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: '/var/log/pm2/api-err.log',
out_file: '/var/log/pm2/api-out.log',
merge_logs: true,
time: true
})
};
چند جزئیات مهم در تولید:
max_memory_restartقبل از اینکه کارگری به محدودیت پشته V8 برسد و توسط قاتل OS OOM کشته شود، یک راه اندازی مجدد دلپذیر را آغاز می کند. آن را 5 تا 10 درصد در زیر تنظیم کنید--max-old-space-size.exec_mode: clusterچیزی است که در واقع تعادل بار را در بین کارگران امکان پذیر می کند. حالت فورک فرآیندهای مستقل را بدون اتصال پورت مشترک اجرا می کند.- چرخش گزارش نیست روی به طور پیش فرض نصب کنید
pm2-logrotateو تنظیم کنیدpm2 setpm2-logrotate:max_size 50Mوpm2 set pm2-logrotate:retain 14بنابراین گزارشها دیسک را در هنگام افزایش ترافیک پر نمیکنند. - تداوم راه اندازی اجرا کنید
pm2 startup systemdوpm2 saveبنابراین کارگران پس از راهاندازی مجدد یا بهروزرسانی هسته بهطور خودکار برمیگردند.
برای بارگذاری مجدد بدون توقف روی مستقر می کند، استفاده می کند pm2 reload api به جای restart. بارگذاری مجدد، کارگران را یک به یک در حالی که خوشه را آنلاین نگه می دارد، تعویض می کند.
چگونه باید Nginx را به عنوان یک پروکسی معکوس برای Node.js پیکربندی کنید؟
قرار دادن Nginx در مقابل Node تنها تاثیرگذارترین تغییر برای اکثر استقرارهای تولید است. Nginx خاتمه TLS، تحویل دارایی استاتیک، فشردهسازی gzip و Brotli، بافر درخواست برای کلاینتهای کند و HTTP/2 را مدیریت میکند و Node را آزاد میکند تا فقط کارهایی را که کد برنامه شما نیاز دارد انجام دهد.
یک بلوک سرور حداقل تولید:
uupstream node_api {
server 127.0.0.1:3000;
keepalive 64;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
gzip روی;
gzip_types application/json text/css application/javascript;
location /static/ {
alias /var/www/api/public/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location / {
proxy_pass http://node_api;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_read_timeout 60s;
}
}
دو جزئیات را که توسعه دهندگان اغلب از دست می دهند: تنظیم proxy_http_version 1.1 به علاوه خالی Connection هدر استفاده مجدد از اتصال را فعال می کند استخر نگهدارنده بالادست، که به طور چشمگیری سربار دست دادن TCP را تحت بار کاهش می دهد. در حال خدمت کردن /static/ به طور مستقیم از Nginx با طولانی Cache-Control هدرها همچنین هزاران درخواست را در دقیقه از کارگران Node شما برای فایلهایی که هرگز نباید لمس میکردند، میکشد.
چه پرچم های حافظه و جمع آوری زباله را باید تنظیم کنید؟
Node از V8 در زیر هود استفاده می کند و اندازه پیش فرض نسل قدیمی Heap V8 تقریباً 1.5 گیگابایت است. روی سیستم های 64 بیتی صرف نظر از اینکه VPS واقعا چقدر رم دارد. در یک VPS 4 گیگابایتی که دارای چهار کارگر است، این پیشفرض حدود 10 گیگابایت ظرفیت تئوری پشته باقی میگذارد که نمیتوانید از آن استفاده کنید زیرا هر کارگر خودش را محدود میکند.
پرچم برای تنظیم است --max-old-space-size، بیان شده در مگابایت:
راهنمای اندازه گیری:
- تقریباً 25٪ از کل RAM را برای سیستم عامل، Nginx و هر پایگاه داده یا حافظه پنهان در حال اجرا رزرو کنید. روی همان وی پی اس
- بقیه را بر تعداد کارگران خود تقسیم کنید، سپس 10٪ را برای سربار V8 کم کنید. در یک VPS 2 گیگابایتی با 4 کارگر، این ریاضی برای هر کارگر حدود 460 مگابایت است.
- مطابقت دادن
max_memory_restartدر PM2 به این مقدار یا کمی کمتر است. کارگر راه اندازی مجدد توسط PM2 قابل بازیابی است. یکی کشته شده توسط kernel OOM قاتل نیست.
برای سرویسهای با توان بسیار بالا، پرچمهای اضافی ارزش آزمایش را شامل میشوند --max-semi-space-size برای دادن فضای بیشتر به نسل جوان (کاهش فرکانس GC جزئی روی خدماتی که به صورت تهاجمی تخصیص می دهند) و --no-compilation-cache اگر فشار حافظه را از کد کامپایل شده کش در کارگران کوتاه مدت مشاهده می کنید. قبل از اینکه آنها را به تولید متعهد کنید، تغییرات را تحت بار آزمایش کنید.
چگونه یک برنامه Slow Node.js را نمایه می کنید؟
اکثر کارها با شکست مواجه می شوند زیرا مهندس چیز اشتباهی را بهینه کرده است. ابتدا نمایه، سپس کد را تغییر دهید:
node --inspect server.jsبا Chrome DevTools یک نمودار شعله از زمان CPU و یک ابزار عکس فوری پشته ای برای یافتن اشیاء حفظ شده در اختیار شما قرار می دهد. برگه DevTools Performance سریعترین مسیر برای شناسایی حلقه رویداد مسدود شده است.clinic doctor(clinicjs.org) برنامه شما را تحت بارگذاری اجرا می کند و تشخیص ایجاد می کند. این به ویژه در علامت گذاری تاخیر حلقه رویداد و فشار بیش از حد GC قبل از اینکه عمیق تر شوید خوب است.autocannonتولید کننده باری است که اکثر توسعه دهندگان Node به آن دسترسی دارند. یک معیار پایه قبل از هر تنظیم، نقطه مقایسه ای را به شما می دهد که باید بدانید آیا تغییرات شما کمک کرده است یا آسیب می رساند.- نظارت بر تاخیر حلقه رویداد در تولید متعلق به APM شما یا یک ساده است
perf_hooks.monitorEventLoopDelay()صادر کننده به پرومتئوس تأخیر بیش از 50 میلیثانیه تحت بار ثابت، سیگنالی است که نشان میدهد چیزی همزمان کارگران را مسدود میکند.
اگر یک نقطه پایانی منفرد کند است، زمان کوئری پایگاه داده را جدا از کنترل کننده زمان بندی کنید. نمایه گر Node به آن اشاره خواهد کرد await pool.query(...) به عنوان خط آهسته، اما کار در PostgreSQL یا MySQL اتفاق می افتد، نه در کد شما.
کدام لایه های کش بیشترین تفاوت را دارند؟
ذخیره سازی با بالاترین نرخ بازگشت سرمایه بهینه سازی است که اکثر تیم ها از آن صرف نظر می کنند. سه لایه برای بارهای کاری تولید Node.js مهم است:
- ذخیره سازی در سطح برنامه با Redis. فضای ذخیرهسازی جلسه، شمارندههای محدود نرخ، و نتایج پرس و جوی مکرر را از پایگاه داده به Redis منتقل کنید روی همان VPS یا همسایه شبکه خصوصی. یک سفر رفت و برگشت به محلی Redis زیر میلی ثانیه است. همان پرس و جو در برابر PostgreSQL روی حافظه پنهان سرد ممکن است 20 تا 80 میلی ثانیه باشد.
- ذخیره پاسخ HTTP در Nginx. برای نقاط پایانی که پاسخهای یکسانی را برای URL یکسان برمیگردانند،
proxy_cacheدر Nginx می تواند هزاران درخواست را در هر ثانیه از دیسک بدون لمس Node انجام دهد. حتی یک پنجره کش 10 ثانیه ای روی یک نقطه پایانی محبوب بار بالادست را به طور چشمگیری کاهش می دهد. - CDN در مقابل VPS شما. Cloudflare، Bunny، یا هر CDN پروکسی معکوس، ترافیک دارایی ثابت را جذب میکند، TLS را در لبه خاتمه میدهد و از مبدأ از ترافیک ربات محافظت میکند. برای کاربرانی که در سطح جهانی توزیع شده اند، بهبود تأخیر معمولاً بیشتر از هر تنظیم در سطح برنامه است.
ترتیب اضافه کردن آنها به ترتیب ذکر شده است. Redis ابتدا به این دلیل که روش ساختار برنامه شما را تغییر می دهد. ذخیره Nginx دوم به این دلیل که نیازی به تغییر کد ندارد و یک CDN سوم زیرا حتی برای یک برنامه تنظیم نشده نیز مفید است.
چگونه VPS تولید Node.js را ایمن می کنید؟
عملکرد و امنیت بیش از آنچه توسعه دهندگان انتظار دارند همپوشانی دارند، زیرا یک برنامه در معرض نمایش یک اسکن بات نت تا در دسترس نبودن فاصله دارد. سخت شدن پایه برای VPS Node.js:
- Node را به صورت غیر اجرا کنیدroot کاربر. استفاده کنید
setcap 'cap_net_bind_service=+ep' $(which node)اگر نیاز به اتصال به پورت های زیر 1024 بدون نیاز دارید root، یا در Nginx خاتمه دهید و اجازه دهید Node گوش کند روی 3000. - a را پیکربندی کنید host فایروال UFW روی اوبونتو یا
firewalldروی AlmaLinux سرور را فقط روی پورت هایی که عمداً در معرض نمایش قرار می دهید قفل می کند، معمولاً 22، 80 و 443. - وابستگی ها را اصلاح شده نگه دارید.
npm auditدر CI و Dependabot یا Renovate روی مخزن CVE ها را در وابستگی های گذرا قبل از رسیدن به تولید می گیرد. - هدرهای امنیتی HTTP را تنظیم کنید. کلاه ایمنی میان افزار استاندارد Express برای هدرهایی مانند
Strict-Transport-Security،Content-Security-Policy، وX-Frame-Options. هدرهای پیکربندی نادرست یکی از رایج ترین یافته ها در ممیزی های امنیتی است. - رازها را بچرخانید و از متغیرهای محیطی استفاده کنید. هرگز فایل های .env را commit نکنید. ابزارهایی مانند Doppler، Vault یا حتی systemd
EnvironmentFile=دستورالعمل ها اعتبارنامه ها را خارج از مخزن نگه می دارند.
چه زمانی باید فراتر از یک VPS واحد مقیاس کنید؟
یک برنامه Node.js که به خوبی تنظیم شده است روی یک VPS 4 تا 8 vCPU با Nginx و Redis می تواند به راحتی میلیون ها درخواست را در روز ارائه دهد. مقیاس بندی افقی معمولاً به یکی از سه دلیل ضروری می شود:
- استفاده پایدار از CPU بالای 70٪ در همه کارگران، حتی پس از نمایه سازی و ذخیره سازی تغییرات، نشان می دهد که شما از جعبه بزرگتر شده اید.
- SLA های آپتایم فشرده که نمی تواند یک نفر را تحمل کندhost خرابی به حداقل دو نمونه برنامه VPS در پشت یک متعادل کننده بار نیاز دارد.
- جداسازی منابع دولتی زمانی ارزش هزینه عملیاتی را دارد که پایگاه داده، حافظه پنهان و بارهای کاری برنامه شما برای همان ورودی/خروجی یا RAM دیسک شروع به رقابت کنند. روی یک VPS مشترک
برنامههای VPS ابری رسانگار و برنامههای VPS مدیریتشده هر دو به صورت کامل ارسال میشوند root دسترسی، تخصیص اختصاصی vCPU و توزیعهای لینوکس از جمله AlmaLinux 9، Ubuntu 22.04 LTS، و Debian 12، که الزامات زمان اجرا را برای هر نسخه فعلی Node.js LTS پوشش میدهند. 99.99% آپتایم SLA و دسترسی 24/7 به تیم APS در نقطه ای که برنامه شما دیگر پروژه جانبی نیست و شروع به کسب درآمد کرده است، بیشترین اهمیت را دارد.
اگر یک برنامه تولیدی Node.js را اجرا می کنید روی هاست اشتراکی یا روی یک VPS که از پیشفرضهای پیشفرض تنظیم نشده است، تغییرات این مقاله احتمالاً تأخیر p95 را به نصف کاهش میدهد. آنها همچنین می توانند قبل از اینکه یک دلار دیگر خرج کنید، ظرفیت درخواست پایدار را دو برابر کنند روی زیرساخت با حالت خوشه PM2 و Nginx در جلو شروع کنید، آنچه را که باقی مانده است نمایه کنید و در جایی که داده ها از آن پشتیبانی می کنند، حافظه پنهان را اضافه کنید.
تنظیم عملی عملکرد Node.js برای میزبانی VPS تولیدی، از جمله خوشهبندی، PM2، پراکسی معکوس Nginx، پرچمهای حافظه و لایههای کش.
آماده اجرای Node.js در مرحله تولید هستید؟ برنامه های مدیریت VPS رسانگار به شما می دهد root دسترسی، تخصیص اختصاصی vCPU، و انتخابی از AlmaLinux 9، Ubuntu 22.04 LTS، یا Debian 12. با پشتیبانی 24/7 انسانی و 99.99% uptime SLA پشتیبانی می شود.
منتشر شده در 2026-06-19 01:13:04

