Docker Compose ve Nginx ile Çok-özel Web Uygulamaları

Giriş Giriş Giriş

Modern web uygulamaları nadiren tek bir monolithic process olarak çalıştırılırlar. Bunun yerine, birden fazla işbirliği hizmetinden oluşur: bir ön ve bir API, bir veritabanı, önbellek, bir mesaj kuyruk ve belki de bir iş koşucusu.Bir iş seti, bu çok ayarlı sistemlerini her bir konteynerin yaşam döngüsünü yönetmek için, onların bağımlılıkları hızlı bir şekilde hataya ve zaman alıcı bir şekilde tanımlamak için bir araya gelir.Dockere ve Nginx birlikte, doğrulayıcı bir şekilde genişletici bir şekilde, bu multi-konuşturucuyu kullanarak, en iyi şekilde genişletici bir şekilde kontrol etmek için bir şekilde bir araya getirir.

Önlemler Önlemler

Atla dalıştan önce, sisteminizde aşağıdakilere sahip olmanızı sağlayın:

Seçmeli olarak, SSL yapılandırma bölümünü takip etmeyi plansanız sunucunuza işaret eden bir alan adı vardır.

Docker Kompüsü Derinlik

Docker Compose sadece basit bir “docker run” sarmalayıcı değildir.Bu, hizmet, ağ, hacimler, çevre değişkenleri, yeniden yapılandırılan tek bir dosyada yapılandırın ve bulut sağlayıcıların bir parçası.

Hizmetler Hizmetler

Her konteyner görüntüsü, limanları, hacimleri, ortamı ve bağımlılıklar, algFLT:2) anahtar. Hizmetler, toplayıcıların otomatik olarak oluşturduğu özel bir köprü ağı aracılığıyla birbirleriyle iletişim kurabilir. Bu, hizmet iletişimi için asla ev sahibi limanlara açmanız gerektiği anlamına gelir - sadece dış dünyaya ortaya çıkmanız gerekir.

Ağlar

Varsayılan olarak, meta-taptif olarak, tüm hizmetler için tek bir ağ oluşturur, onlara DNS tabanlı hizmet keşiflerini ev sahibi adı olarak kullanarak servis adını verir. Örneğin, adı verilen bir hizmet olarak, başka hizmetler tarafından ulaşılabilmektedir.You can also define custom networks for partition - for example, only the correct on a public-face network and keeping database kapsayıcıları iç bir ağ üzerinde tutabilir.

networks:
 frontend:
 backend:
services:
 nginx:
 networks:
 - frontend
 app:
 networks:
 - frontend
 - backend
 db:
 networks:
 - backend

Ciltler

Volumes, Docker konteynerleri tarafından üretilen verileri sürdürmek için tercih edilen mekanizmadır. Boşaltmada, onlara üst düzeydeki hacimleri ilan edebilir ve onları hizmetlere arayabilirsiniz.Bu veritabanı için temel, dosya yüklemeleri ve herhangi bir devletli hizmettir.

volumes:
 db_data:
services:
 postgres:
 image: postgres:16
 volumes:
 - db_data:/var/lib/postgresql/data

Çevre Değişkenleri

Çevre değişkenlerini kullanarak dış yapılandırma. Onları geliştirme için bir koleksiyon dosyasında zorlayabilirsiniz, ancak üretim için www.FLT:7) dosyaları veya Docker sırları kullanmalısınız. Boşanmış dosya aynı dizinin içinde yer alıyorsanız.

services:
 api:
 image: my-api:latest
 env_file:
 - ./api.env
 environment:
 - NODE_ENV=production

Nginx'i bir Ters Proxy olarak yapılandırın - Advanced Proxy – Advanced

Nginx, yüksek performans, düşük hafıza ayak izi ve zengin bir özellik seti nedeniyle geri dönüşümlü olarak parlıyor.Çok sınırlı bir mimaride Nginx, müşteri istekleri kabul ediyor ve URI, üst düzeylere veya hatta vücut içeriğine dayanarak uygun hizmet için onları ileri sürüyor.

Birden Upstreams ile Temel Ters Proxy

İşte statik varlıklar ve WebSockets'i de ele geçirmek dahil olmak üzere iki farklı uygulama arasında trafik nasıl bölüneceğini gösteren daha tam bir yapılandırma:

upstream app1_upstream {
 server app1:8000;
}

upstream app2_upstream {
 server app2:8001;
}

server {
 listen 80;
 server_name example.com;
 return 301 https://$server_name$request_uri;
}

server {
 listen 443 ssl http2;
 server_name example.com;

 ssl_certificate /etc/nginx/certs/fullchain.pem;
 ssl_certificate_key /etc/nginx/certs/privkey.pem;

 # Security headers
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-Content-Type-Options "nosniff" always;
 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

 # App 1 – main web frontend
 location / {
 proxy_pass http://app1_upstream;
 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;
 }

 # App 2 – admin dashboard
 location /admin/ {
 proxy_pass http://app2_upstream/;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 }

 # WebSocket support (e.g., for live updates)
 location /ws/ {
 proxy_pass http://app1_upstream;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 }

 # Static assets – serve directly for better performance
 location /static/ {
 alias /var/www/static/;
 expires 30d;
 add_header Cache-Control "public, immutable";
 }
}

Blokların kullanımını dikkate alın. Bir tek sunucuyla bile, bir upstream grubu kullanarak sunucu blokuna dokunmadan daha fazla çoğaltma eklemek kolay hale getirir.

SSL/TLS Let's Encrypt

Üretim için, HTTPS'ye hizmet etmek, kullanılamaz. Örneğin, Certbot veya ESFLT:0)acme.sh) tarafından yapılan sertifikaları Nginx konteynerine yerleştirmek için ortak bir modeldir.

services:
 nginx:
 image: nginx:alpine
 volumes:
 - ./nginx.conf:/etc/nginx/conf.d/default.conf
 - ./certs:/etc/nginx/certs:ro
 - ./static:/var/www/static:ro
 ports:
 - "80:80"
 - "443:443"
 depends_on:
 - app1
 - app2

Otomatik yenileme için, sertifikalar yenilenirken bir cron işi çalıştırıp Nginx'i yeniden yükleyen bir arkadaşınız konteyner ekleyebilirsiniz.

Yük Balancing ve Sağlık Kontrolleri

Birden fazla çoğaltmaya hizmet ölçeklendiğinde, Nginx, yuvarlak-robin, en azından bağlantı veya IP'nin bunu Docker Compose'sFLT:16 ile bir araya getirebiliyor:

upstream api_servers {
 least_conn;
 server api:80 max_fails=3 fail_timeout=30s;
}

Sinirli konteynerleri tespit etmek için, Nginx, Docker'in sağlık kontrollerine ve sadece geçiş yapan konteynerlere güvenmektir.

Docker Boşalıcı Dosyası – Gerçek Bir Dünya Örnek

Her şeyi bir Node.js API'si olan bir web uygulaması için pratik bir komplike dosyasına birleştirelim, Nginx tarafından servis edilen bir Reakt kutusu, bir PostgreSQL veritabanı ve Redis önbelleği. Nginx konteyner statik dosyaları ve proxy API talepleri hizmet edecek.

version: "3.9"

services:
 nginx:
 image: nginx:alpine
 container_name: reverse-proxy
 restart: unless-stopped
 volumes:
 - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
 - ./frontend/build:/var/www/frontend:ro
 - ./certs:/etc/nginx/certs:ro
 ports:
 - "80:80"
 - "443:443"
 depends_on:
 - api
 - frontend
 networks:
 - public

 frontend:
 image: my-frontend:latest
 # In production, frontend is built into static files and served by Nginx
 # This container may run a dev server, but Nginx will bypass it for static files
 container_name: frontend-dev
 ports:
 - "3000:3000"
 networks:
 - public
 # healthcheck: ...

 api:
 image: my-api:latest
 container_name: api-server
 restart: unless-stopped
 env_file:
 - ./api/.env.production
 depends_on:
 postgres:
 condition: service_healthy
 redis:
 condition: service_started
 networks:
 - public
 - internal
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
 interval: 30s
 timeout: 10s
 retries: 3

 postgres:
 image: postgres:16-alpine
 container_name: database
 restart: unless-stopped
 environment:
 POSTGRES_USER: app_user
 POSTGRES_DB: app_db
 POSTGRES_PASSWORD_FILE: /run/secrets/db_password
 volumes:
 - pgdata:/var/lib/postgresql/data
 secrets:
 - db_password
 networks:
 - internal
 healthcheck:
 test: ["CMD-SHELL", "pg_isready -U app_user"]
 interval: 10s
 timeout: 5s
 retries: 5

 redis:
 image: redis:7-alpine
 container_name: cache
 restart: unless-stopped
 volumes:
 - redisdata:/data
 networks:
 - internal
 healthcheck:
 test: ["CMD", "redis-cli", "ping"]
 interval: 10s
 timeout: 3s

volumes:
 pgdata:
 redisdata:

networks:
 public:
 internal:
 internal: true

secrets:
 db_password:
 file: ./secrets/db_password.txt

Bu dosyadaki anahtar noktalar:

Uygulamayı işe almak - Adım Tarafından Adım

Komplike dosyası ve Nginx konfigürasyonu hazır, dağıtım birkaç basit komut içerir. Birincisi, tüm yapılandırma dosyalarının yerinde olmasını sağlar:

project/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
├── api/
│ └── .env.production
├── frontend/
│ └── build/
├── certs/
│ └── (fullchain.pem, privkey.pem)
└── secrets/
 └── db_password.txt

Sonra koşmak:

docker compose pull # pull latest images
docker compose up -d # start all services in background
docker compose ps # verify services are running
docker compose logs -f # tail logs for all services

Her şey yukarılandığında, uygulamanızı alan alanınızı ziyaret ederek test edin. İstekleri doğru şekilde teyit etmek için Nginx logları kontrol edin. yapılandırma veya çevre değişkenlerini güncellemeniz gerekiyorsa, ilgili dosyaları ve koşmak:

docker compose up -d --no-deps --build nginx # rebuild only nginx if config changed

Sıfır zamanlı dağıtımlar için, [[0)blue-green) veya [[Döneticileri [Döneticileri ile [Döneticileri 3 ), Komplak sağlık kontrolleri ile ilgili olarak.

Scaling ve Performans Tuning

Docker Compose API gibi devletsiz hizmetleri ölçeklendirmek için önemsiz yapar:

docker compose up -d --scale api=3

Şimdi API konteynerinin üç kopyası çalışıyor. Nginx, yukarı uç blok ile yapılandırıldı, bunlar arasında otomatik olarak istekler dağıtacak.

Veritabanı için API'nizde bağlantı havuzunuz olmasını ve PgBouncer'i bir yancar konteyner olarak kullanmayı düşünün.

Sorun Ortak Konuları Sorun Gidermek

İyi yapılandırılmış bir kurulumla bile, işler ters gidebilir. İşte sık sık sık tuzaklar ve onları nasıl düzeltin:

Güvenlik En İyi Uygulamaları

Üretimde çok sayıda uygulama yürütmek vigilance gerektirir:

services:
 api:
 deploy:
 resources:
 limits:
 cpus: '0.50'
 memory: 256M
 reservations:
 cpus: '0.25'
 memory: 128M

Bu sınırlar Docker swarm kullanırken saygı duyuyorlar; düz bir eğlence için, (Ücretsizliğe veya K8'leri üretim orkestrası için kullanmak daha iyi olsa da).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Docker Compose ve Nginx birlikte güçlü, ölçeklenebilir ve çok dolu bir web uygulamaları dağıtmak için kullanılabilir bir platform oluşturur.Tek bir YAML dosyasında, üretim ile çevre paritesini elde edersiniz. Nginx, değişkenleri, ölçeklendirme ipuçları ve sorun giderme için merkezi bir SSL noktası sunar.