برنامه نویسی

Scaling Express.js با تعادل بار nginx: یک رویکرد dockerized

برنامه های وب مدرن باید مقیاس پذیر ، انعطاف پذیر و قابل نگهداری باشند. یکی از مؤثرترین راه های دستیابی به این هدف ، استفاده از Docker برای کانتینر کردن برنامه و NGINX به عنوان یک متعادل کننده بار است. در این پست ، من شما را طی می کنم که چگونه من یک API با نام تجاری Express.js را ساختم ، متعادل با nginx و با استفاده از آهنگسازی Docker ، ارکستر شده است.

چرا تعادل بار مهم است

  1. عملکرد بهبود یافته – با به اشتراک گذاشتن بار کار.

  2. افزایش در دسترس بودن – از طریق افزونگی.

  3. مقیاس بندی افقی آسان تر – با افزایش تقاضا ، می توانید ظروف بیشتری را بچرخانید.

بررسی اجمالی پروژه

این پروژه نحوه:

  1. Containerize یک API Express.js با استفاده از Docker.

  2. API را در چندین ظروف مقیاس مقیاس کنید.

  3. از nginx به عنوان یک پروکسی معکوس و ظروف بیشتر بوالانسی استفاده کنید.

  4. توزیع درخواست ROBIN ROBIN را اجرا کنید.

نصب

قبل از خواندن این نکته ، لطفاً پروژه Express.js را کلون کنید ، یا می توانید API با پس زمینه Express.js خود را توسعه داده و پورت را در پرونده compose.yml قرار دهید.

کلون مخزن:

   git clone https://github.com/noruwa03/express-js-nginx-lb
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

به فهرست پروژه بروید:

   cd express-js-nginx-lb/app
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

وابستگی ها را نصب کنید:

   npm install
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

متغیرهای محیط را تنظیم کنید:
ایجاد a .env پرونده در داخل app دایرکتوری با متغیرهای زیر:

  • PORT – شماره پورت برای سرور Express.js
  • DB_CONN_LINK – رشته اتصال postgreSQL از نئون db. برای ایجاد بانک اطلاعاتی و جداول لطفاً باز کنید Express-test-db.sql در پرونده app/src/db/express-test-db.sql

سرور توسعه را شروع کنید:

   npm run dev
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ساختار پروژه

express-js-nginx-lb/
├── app/
│   ├── src/
│   │   ├── controllers/
│   │   │   ├── create-post.ts
│   │   │   ├── delete-post.ts
│   │   │   ├── get-post-by-id.ts
│   │   │   ├── get-posts.ts
│   │   │   └── update-post.ts
│   │   ├── db/
│   │   │   ├── express-test-db.sql
│   │   │   └── index.ts
│   │   ├── middlewares/
│   │   │   └── post-validation.ts
│   │   ├── routes/
│   │   │   └── index.ts
│   │   └── app.ts
│   ├── .dockerignore
│   ├── package-lock.json
│   ├── package.json
│   └── tsconfig.json
├── nginx/
│   └── nginx.conf
├── compose.yml
└── README.md
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اجزای کلیدی

express.js api

API Backend با این نقاط پایانی عملیات اصلی CRUD را برای پست ها انجام می دهد:

  • GET /post – همه پست ها را بازیابی کنید.

  • GET /post/:id – یک پست خاص دریافت کنید.

  • POST /create-post – ایجاد یک پست جدید.

  • PATCH/update-post/:id – یک پست را به روز کنید.

  • DELETE/post/:id – یک پست را حذف کنید.

پیکربندی داکر: compose.yml

services:
  myapp:
    build: ./app
    deploy:
      replicas: 3
    expose: 
      - 8080
    volumes:
      - ./app/.env:/etc/express_env/.env

  nginx:
    image: nginx:alpine
    ports:
      - 3000:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - myapp

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر در حال توسعه API Backend.js خود در حال توسعه هستید ، به یاد داشته باشید که پورت را در لیست افشای تغییر دهید

پیکربندی nginx: nginx.conf واقع در nginx فهرست راهنما

events {}

http {
  include mime.types;

  upstream myapp {
    server myapp:8080;
  }

  server {
    listen 80;
    location / {
      proxy_pass http://myapp;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

جزئیات اجرای

دستورات Docker و عکس های فوری در زیر ارائه شده است.

docker compose build
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ساخت Docker Build

docker compose up
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

Docker آهنگسازی می کند

docker ps
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

Docker PS

شناسایی کانتینر

برای تأیید تعادل بار در حال کار بود ، من یک نقطه پایانی /پینگ را اضافه کردم که نام میزبان ظرف را که در آن درخواست می کند بازگرداند:

import os from "os"

app.get("/ping", (_: Request, res: Response): any => {
  return res.status(200).json({
    message: `Served by: ${os.hostname()}`,
  });
});

app.listen(PORT, () => {
  console.log(`Server running at port ${PORT}.....`);
  console.log(`Served by: ${os.hostname()}`);
});

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کانتینر یک

کانتینر دو

مدیریت متغیر محیط

من می خواستم با اطمینان اداره کنم .env پرونده با استفاده از secrets و نقشه .env پرونده در یک حجم به اسرار موجود در پیکربندی آهنگسازی Docker. با این حال ، هنگام دویدن docker compose -f compose.yml config برای اعتبار سنجی پرونده compose.yml ، با خطایی روبرو شدم. من نمی خواستم کپی کنم .env مستقیماً وارد ظرف Docker شوید ، بنابراین من از جلد Docker برای نقشه برداری استفاده کردم app/.env پرونده به /etc/express_env/.env فهرست داخل ظرف. این روش داده های حساس را از تصویر کانتینر دور نگه می دارد در حالی که هنوز هم در زمان اجرا آن را در دسترس قرار می دهد.

volumes:
  - ./app/.env:/etc/express_env/.env
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در اینجا نحوه بازرسی از متغیرهای محیط داخل یک ظرف در حال اجرا آورده شده است:

docker exec -it  /bin/sh
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ls
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

cd /
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

cd etc/express_env
ls -a
exit
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اطلاعات کانتینر

عکس فوری پاسخ API

/api/v1/ – مسیر ریشه

مسیر ریشه

/api/v1/create-post – ایجاد مسیر پست

ایجاد پست

/api/v1/post/:id – ارسال توسط شناسه

ارسال توسط شناسه

چالش ها و راه حل ها

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

چالش: در ابتدا ، من می خواستم از اسرار Docker استفاده کنم اما با خطاهای پیکربندی روبرو شدم.

راه حل: با استفاده از حجم ، روش ایمن برای تزریق متغیرهای محیط در زمان اجرا بدون پخت آنها در تصویر کانتینر فراهم شده است.

تأیید توازن بار

چالش: تأیید اینکه درخواست ها در واقع در ظروف توزیع می شوند.

راه حل: اجرای نقطه پایانی /پینگ که نام میزبان کانتینر را برمی گرداند ، تأیید بصری واضح را ارائه می دهد.

توصیه هایی برای پیشرفت های آینده

  1. نظارت و مشاهده: نظارت جامع برای API با پس زمینه از جمله مجموعه معیارها ، ورود به سیستم متمرکز و ردیابی توزیع شده

  2. خط لوله CI/CD: با استفاده از خطوط لوله خودکار CI/CD با اقدامات GitHub به زیرساخت های ابری مستقر شوید

  3. پیشرفت های امنیتی: خاتمه SSL/TLS را در لایه nginx اضافه کنید تا ارتباطات API را تضمین کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا