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
helmetkabi 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:
- GitHub yoki GitLab repozitoriyingizni ulang
- Deploy qilinadigan branch’ni tanlang
- Build va ishga tushirish buyruqlarini sozlang
- Muhit o‘zgaruvchilaringizni tanlang
- 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-sizeparametridan 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));
});
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
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
