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

برنامه های وب مدرن باید مقیاس پذیر ، انعطاف پذیر و قابل نگهداری باشند. یکی از مؤثرترین راه های دستیابی به این هدف ، استفاده از Docker برای کانتینر کردن برنامه و NGINX به عنوان یک متعادل کننده بار است. در این پست ، من شما را طی می کنم که چگونه من یک API با نام تجاری Express.js را ساختم ، متعادل با nginx و با استفاده از آهنگسازی Docker ، ارکستر شده است.
چرا تعادل بار مهم است
-
عملکرد بهبود یافته – با به اشتراک گذاشتن بار کار.
-
افزایش در دسترس بودن – از طریق افزونگی.
-
مقیاس بندی افقی آسان تر – با افزایش تقاضا ، می توانید ظروف بیشتری را بچرخانید.
بررسی اجمالی پروژه
این پروژه نحوه:
-
Containerize یک API Express.js با استفاده از Docker.
-
API را در چندین ظروف مقیاس مقیاس کنید.
-
از nginx به عنوان یک پروکسی معکوس و ظروف بیشتر بوالانسی استفاده کنید.
-
توزیع درخواست 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 compose up
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 استفاده کنم اما با خطاهای پیکربندی روبرو شدم.
راه حل: با استفاده از حجم ، روش ایمن برای تزریق متغیرهای محیط در زمان اجرا بدون پخت آنها در تصویر کانتینر فراهم شده است.
تأیید توازن بار
چالش: تأیید اینکه درخواست ها در واقع در ظروف توزیع می شوند.
راه حل: اجرای نقطه پایانی /پینگ که نام میزبان کانتینر را برمی گرداند ، تأیید بصری واضح را ارائه می دهد.
توصیه هایی برای پیشرفت های آینده
-
نظارت و مشاهده: نظارت جامع برای API با پس زمینه از جمله مجموعه معیارها ، ورود به سیستم متمرکز و ردیابی توزیع شده
-
خط لوله CI/CD: با استفاده از خطوط لوله خودکار CI/CD با اقدامات GitHub به زیرساخت های ابری مستقر شوید
-
پیشرفت های امنیتی: خاتمه SSL/TLS را در لایه nginx اضافه کنید تا ارتباطات API را تضمین کنید