Node.js deployment

Ushbu qo‘llanmada Node.js ilovalarini an’anaviy serverlardan tortib zamonaviy bulut platformalarigacha bo‘lgan turli muhitlarga deployment (joylashtirish) qilishning turli yondashuvlari ko‘rib chiqiladi.


Ilovangizni deploymentga tayyorlash

Node.js ilovangizni deploy qilishdan oldin u to‘g‘ri tayyorlanganiga ishonch hosil qiling:

1. Muhit konfiguratsiyasi

Ilovangizni muhitga qarab turlicha sozlash uchun muhit o‘zgaruvchilaridan foydalaning:

// config.js const config = {   development: {     port: 8080,     database: 'mongodb://localhost:27017/myapp_dev',     logLevel: 'debug'   },   test: {     port: 3001,     database: 'mongodb://localhost:27017/myapp_test',     logLevel: 'info'   },   production: {     port: process.env.PORT || 8080,     database: process.env.DATABASE_URL,     logLevel: 'error'   } }; // Export the configuration for the current environment const env = process.env.NODE_ENV || 'development'; module.exports = config[env];

2. Build (yig‘ish) jarayoni

Agar ilovangiz TypeScript, Babel, Webpack yoki boshqa build vositalaridan foydalansa, package.json faylida tegishli build skriptlarini sozlang:

// package.json {   "scripts": {     "build": "tsc",     "start": "node dist/server.js",     "dev": "nodemon src/server.ts"   } }

3. Holat tekshiruvlari (health checks)

Ilovangiz to‘g‘ri ishlayotganini tekshirish uchun holat tekshiruvi (health check) endpoint’ini yarating:

const express = require('express'); const app = express(); // Health check endpoint app.get('/health', (req, res) => {   // Check critical dependencies like database connections   const isDbConnected = checkDatabaseConnection();      if (isDbConnected) {     res.status(200).json({ status: 'healthy' });   } else {     res.status(500).json({ status: 'unhealthy', error: 'Database connection failed' });   } }); function checkDatabaseConnection() {   // Implement your database connection check   return true; // Example response }

4. Xavfsizlik choralari

  • Kod bazangizdan maxfiy ma’lumotlarni olib tashlang
  • Maxfiy qiymatlar (secrets) uchun muhit o‘zgaruvchilaridan foydalaning
  • helmet kabi paketlar yordamida tegishli xavfsizlik sarlavhalarini (security headers) qo‘llang
  • API’laringiz uchun so‘rovlar chastotasini cheklashni (rate limiting) sozlang
const express = require('express'); const helmet = require('helmet'); const rateLimit = require('express-rate-limit'); const app = express(); // Set security headers app.use(helmet()); // Rate limiting const apiLimiter = rateLimit({   windowMs: 15 * 60 * 1000, // 15 minutes   max: 100 // limit each IP to 100 requests per windowMs }); // Apply rate limiting to API routes app.use('/api/', apiLimiter);


An’anaviy deployment

Jarayon menejerlari (process managers) yordamida ishga tushirish

An’anaviy server muhitida Node.js ilovangiz uzluksiz ishlab turishi uchun jarayon menejeridan foydalaning:

PM2

# Install PM2 globally npm install -g pm2 # Start your application pm2 start app.js --name "my-app" # Configure auto-restart on server reboot pm2 startup pm2 save # View logs pm2 logs # Monitor your application pm2 monit

PM2 konfiguratsiya fayli (ecosystem.config.js)

module.exports = {   apps: [{     name: "my-app",     script: "./dist/server.js",     instances: "max",     exec_mode: "cluster",     env: {       NODE_ENV: "development",     },     env_production: {       NODE_ENV: "production",       PORT: 8080     }   }] }

Forever

# Install Forever globally npm install -g forever # Start your application forever start app.js # List running processes forever list # Stop application forever stop app.js

Teskari proksidan (reverse proxy) foydalanish

Node.js’ni Nginx kabi teskari proksi ortida ishga tushirish tavsiya etiladi:

Nginx konfiguratsiyasi

server {     listen 80;     server_name example.com;          location / {         proxy_pass http://localhost:8080;         proxy_http_version 1.1;         proxy_set_header Upgrade $http_upgrade;         proxy_set_header Connection 'upgrade';         proxy_set_header Host $host;         proxy_cache_bypass $http_upgrade;     } }

Bulut platformalarida deployment

Heroku

Heroku — Node.js deploymentini soddalashtiradigan xizmat sifatidagi platforma (PaaS):

# Login to Heroku heroku login # Create a new Heroku app heroku create my-node-app # Deploy your code git push heroku main # Ensure at least one instance is running heroku ps:scale web=1 # View logs heroku logs --tail

Heroku ilovangizni qanday ishga tushirishni belgilash uchun Procfile faylini talab qiladi:

web: node dist/server.js

AWS Elastic Beanstalk

AWS Elastic Beanstalk — veb-ilovalarni deploy qilish va masshtablash uchun xizmat:

# Install EB CLI pip install awsebcli # Initialize EB project eb init # Create environment and deploy eb create my-node-env # Deploy updates eb deploy

Bu xizmat haqida AWS Elastic Beanstalk darsligimizda batafsil o‘qing.

Digital Ocean App Platform

Digital Ocean’ning App Platform xizmati Node.js ilovalarini deploy qilishning oddiy usulini taklif etadi:

  1. GitHub yoki GitLab repozitoriyingizni ulang
  2. Deploy qilinadigan branch’ni tanlang
  3. Build va ishga tushirish buyruqlarini sozlang
  4. Muhit o‘zgaruvchilaringizni tanlang
  5. Ilovani deploy qiling

Eslatma: Aksariyat bulut platformalari Node.js ilovalarini avtomatik aniqlay oladi hamda ilovangizni build qilish va ishga tushirish uchun maqbul standart sozlamalarni o‘rnatadi.


Konteynerli deployment

Docker

Node.js ilovangizni konteynerlashtirish barcha muhitlarda bir xillikni ta’minlaydi:

Dockerfile

FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 8080 CMD ["node", "server.js"]

Docker konteynerini build qilish va ishga tushirish

# Build the Docker image docker build -t my-node-app . # Run the container docker run -p 8080:8080 -d my-node-app

Docker Compose

Bir nechta xizmatdan iborat ilovalar uchun (masalan, Node.js, MongoDB, Redis):

docker-compose.yml

version: '3' services:   app:     build: .     ports:       - "8080:8080"     depends_on:       - mongo     environment:       - NODE_ENV=production       - MONGO_URI=mongodb://mongo:27017/myapp          mongo:     image: mongo:4.4     volumes:       - mongo-data:/data/db     ports:       - "27017:27017"        volumes:   mongo-data:

Docker Compose yordamida ishga tushirish

# Start all services docker-compose up -d # View logs docker-compose logs -f app

Kubernetes

Murakkabroq deployment va masshtablash uchun Kubernetes konteyner orkestratsiyasini taqdim etadi:

Oddiy Kubernetes deployment

apiVersion: apps/v1 kind: Deployment metadata:   name: node-app spec:   replicas: 3   selector:     matchLabels:       app: node-app   template:     metadata:       labels:         app: node-app     spec:       containers:       - name: node-app         image: my-node-app:latest         ports:         - containerPort: 8080         env:         - name: NODE_ENV           value: production         resources:           limits:             cpu: "0.5"             memory: "512Mi"           requests:             cpu: "0.2"             memory: "256Mi" --- apiVersion: v1 kind: Service metadata:   name: node-app-service spec:   selector:     app: node-app   ports:   - port: 80     targetPort: 8080   type: LoadBalancer

Serversiz (serverless) deployment

AWS Lambda

Hodisalarga asoslangan (event-driven) ilovalar uchun AWS Lambda kabi serversiz platformalar tejamkor bo‘lishi mumkin:

Lambda qanday ishlashini bilish uchun AWS Lambda darsligimiz va AWS Serverless darsligi bilan tanishing.

Lambda ishlov beruvchisi (handler)

// lambda.js const serverless = require('serverless-http'); const express = require('express'); const app = express(); app.get('/', (req, res) => {   res.json({ message: 'Hello from Lambda!' }); }); module.exports.handler = serverless(app);

Serverless Framework konfiguratsiyasi

service: my-express-app provider:   name: aws   runtime: nodejs18.x   stage: dev   region: us-east-1    functions:   app:     handler: lambda.handler     events:       - http:           path: /           method: ANY       - http:           path: /{proxy+}           method: ANY

Serverless Framework yordamida deploy qilish

# Install Serverless Framework npm install -g serverless # Deploy serverless deploy

Vercel

Vercel serversiz Node.js ilovalarini deploy qilishning oson usulini taqdim etadi:

vercel.json

{   "version": 2,   "builds": [     {       "src": "server.js",       "use": "@vercel/node"     }   ],   "routes": [     {       "src": "/(.*)",       "dest": "server.js"     }   ] }

Vercel’ga deploy qilish

# Install Vercel CLI npm install -g vercel # Deploy vercel

Uzluksiz deployment (continuous deployment)

Deployment jarayoningizni uzluksiz integratsiya/uzluksiz deployment (CI/CD) pipeline’lari yordamida avtomatlashtiring:

GitHub Actions misoli

name: Deploy to Production on:   push:     branches: [ main ]      jobs:   deploy:     runs-on: ubuntu-latest     steps:       - uses: actions/checkout@v3              - name: Set up Node.js         uses: actions/setup-node@v3         with:           node-version: '18'                  - name: Install dependencies         run: npm ci                - name: Run tests         run: npm test                - name: Build         run: npm run build                - name: Deploy to production         run: |           # Add your deployment commands here           # Examples:           # - ssh into your server and pull the latest changes           # - deploy to a cloud platform with their CLI           # - use a deployment service like Vercel, Netlify, etc.

CI/CD pipeline’larini sozlash haqida batafsil ma’lumot uchun Node.js CI/CD darsligimizga qarang.


Deployment uchun nazorat ro‘yxati

Deploymentdan oldin

  • Debug kodini va konsol loglarini olib tashlang
  • Tegishli muhit o‘zgaruvchilarini o‘rnating
  • Zaifliklarni aniqlash uchun xavfsizlik tekshiruvlarini o‘tkazing (npm audit)
  • Barcha testlarni ishga tushiring
  • Bundle hajmini optimallashtiring
  • Xatolar to‘g‘ri qayta ishlanishini tekshiring

Deployment vaqtida

  • To‘xtab qolishsiz (zero-downtime) deployment usullaridan foydalaning
  • Holat tekshiruvlari (health checks) va monitoring ishlashini tekshiring
  • Deploy qilingan ilovani sinab ko‘ring

Deploymentdan keyin

  • Ilova loglarini kuzatib boring
  • Unumdorlik va xatolarni kuzatib boring
  • Jiddiy muammolar uchun ogohlantirishlarni (alerts) sozlang
  • Jamoa uchun deployment jarayonini hujjatlashtiring

Production uchun unumdorlikni optimallashtirish

Node.js ilovangizni production uchun optimallashtirish uning unumdorligi va ishonchliligini sezilarli darajada oshirishi mumkin. Asosiy optimallashtirish usullari quyidagilar:

1. Kod darajasidagi optimallashtirishlar

  • Unumdorlikni yaxshilash uchun Node.js’ning eng so‘nggi LTS versiyasidan foydalaning
  • Eng ko‘p bajariladigan kod qismlarini (hot code paths) optimallashtiring va hodisalar siklini (event loop) bloklamang
  • Katta hajmdagi ma’lumotlarni qayta ishlash uchun oqimlardan (streams) foydalaning
  • Keshlash strategiyalarini qo‘llang

2. Xotirani boshqarish

  • Xotira sarfini process.memoryUsage() yordamida kuzatib boring
  • Xotira limitini oshirish uchun --max-old-space-size parametridan foydalaning
  • Xotira sizib chiqishini (memory leak) heap snapshot’lar yordamida bartaraf eting
  • Tez-tez yaratiladigan obyektlar uchun obyektlar pulidan (object pooling) foydalaning

Misol: cluster rejimini yoqish

Node.js cluster moduli yordamida barcha CPU yadrolaridan foydalaning:

// cluster.js const cluster = require('cluster'); const numCPUs = require('os').cpus().length; const app = require('./app'); if (cluster.isMaster) {   console.log(`Master ${process.pid} is running`);   // Fork workers   for (let i = 0; i < numCPUs; i++) {     cluster.fork();   }   cluster.on('exit', (worker, code, signal) => {     console.log(`Worker ${worker.process.pid} died`);     cluster.fork(); // Replace the dead worker   }); } else {   // Workers can share any TCP connection   const PORT = process.env.PORT || 3000;   app.listen(PORT, () => {     console.log(`Worker ${process.pid} started on port ${PORT}`);   }); }

Unumdorlik monitoringi

Unumdorlikdagi tor joylarni (bottlenecks) aniqlash uchun monitoringni yo‘lga qo‘ying:

# Install monitoring tools npm install --save express-status-monitor prom-client # Enable Prometheus metrics endpoint const express = require('express'); const promBundle = require('express-prom-bundle'); const metricsMiddleware = promBundle({ includeMethod: true }); const app = express(); app.use(metricsMiddleware); // Your routes here app.get('/', (req, res) => {   res.send('Hello, monitored world!'); }); // Metrics endpoint app.get('/metrics', (req, res) => {   res.set('Content-Type', register.contentType);   register.metrics().then(data => res.send(data)); });

Maslahat: Production muhitini har tomonlama kuzatish va ogohlantirishlar uchun PM2’ning o‘rnatilgan monitoringi, New Relic yoki Datadog kabi vositalardan foydalaning.

Yuklama testi (load testing)

Tor joylarni aniqlash uchun ilovangizni muntazam ravishda yuklama ostida sinab turing:

# Install load testing tool npm install -g loadtest # Run a simple load test loadtest -n 1000 -c 100 http://your-app.com/api/endpoint # Example output will show requests per second, # mean latency, and error rates

Xulosa

  • Ilovangizni muhit konfiguratsiyasi, build jarayonlari, holat tekshiruvlari va xavfsizlik choralari yordamida to‘g‘ri tayyorlang
  • Ilovangiz ehtiyojlariga eng mos keladigan deployment yondashuvini tanlang
  • Maksimal nazorat uchun jarayon menejerlari bilan an’anaviy server deploymentini ko‘rib chiqing
  • Boshqarish va masshtablashni soddalashtirish uchun bulut platformalaridan foydalaning
  • Barcha muhitlarda bir xillikni ta’minlash uchun ilovangizni konteynerlashtiring
  • Hodisalarga asoslangan ilovalar uchun serversiz deploymentni ko‘rib chiqing
  • Deployment jarayoningizni CI/CD pipeline’lari yordamida avtomatlashtiring

Node.js mashqi: O‘z bilimingizni sinab ko‘rish uchun W3Schools mashqlar sahifasiga o‘ting.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!