2025年4月21日 星期一

如何使用 Nginx 作為反向代理,搭配 Laravel、Swoole 和 Redis 來打造高效能的 API

好的,我會根據你的需求重新撰寫一份優化後的架構設計與配置版本,針對電子商務平台的高併發需求進行改進。以下是優化後的完整方案,涵蓋前端、後端基礎設施、後端應用程式及相關配置,確保系統高效、穩定且安全。

優化後的架構設計與配置
1. 前端 (Vue 3)
  • 技術選型:
    • 使用 Vue 3,搭配 Composition API 提升代碼可維護性。
    • Pinia 作為狀態管理工具,Vue Router 處理路由。
  • API 通訊:
    • 採用 RESTful API 與後端交互,通過 AWS API Gateway 管理請求。
    • API Gateway 提供請求驗證、限流和安全性增強(例如 JWT 認證)。
  • 效能優化:
    • 商品列表頁面使用虛擬滾動(Virtual Scrolling)優化長列表渲染。
    • 利用 Webpack 的 Code Splitting 減少首屏載入時間。
  • 建議:
    • 整合 CDN(如 AWS CloudFront)加速靜態資源傳輸。

2. 後端基礎設施 (AWS ALB + CDN + ECS + RDS)
  • AWS ALB (Application Load Balancer):
    • 負責負載均衡和 SSL/TLS 終止。
    • 配置健康檢查,指向後端 /health 端點,確保服務正常運行。
  • CDN (CloudFront):
    • 加速靜態資源(如圖片、CSS、JS)的傳輸。
    • 配置緩存策略,根據資源更新頻率調整 TTL。
  • ECS (Elastic Container Service):
    • 部署容器化的後端應用(Nginx + Swoole + Laravel API)。
    • 配置 AWS Auto Scaling Group,根據 CPU 使用率或請求數量自動調整容器數量。
  • RDS (Relational Database Service):
    • 使用 MySQL 或 PostgreSQL 作為資料庫。
    • 配置 Read Replicas 分擔讀取負載,優化索引和查詢以提升效能。

3. 後端應用程式 (Nginx + Swoole + Laravel + Redis)
  • Nginx:
    • 作為反向代理和靜態資源伺服器。
    • 與 Swoole 使用 Unix Socket 通訊,提升內部通訊效率。
  • Swoole + Laravel API:
    • Swoole 運行於常駐記憶體模式,配置為 daemonize
    • 通過 Supervisor 或 ECS 任務管理 Swoole 進程。
    • 配置 worker_num 為 CPU 核心數的 2-4 倍,根據伺服器規格調整。
  • Redis:
    • 使用 Redis Cluster 提升高可用性和效能。
    • 應用於快取(例如熱門商品數據)、佇列(異步任務處理)、Session 管理和限流。

4. Docker 環境設定
Docker Compose 配置
yaml
version: '3.8'

services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    environment:
      APP_NAME: your-api
      APP_ENV: production
      APP_KEY: your_secret_key
      CACHE_DRIVER: redis
      QUEUE_CONNECTION: redis
      SESSION_DRIVER: redis
      REDIS_HOST: redis
    depends_on:
      - redis
    volumes:
      - ./:/var/www/html
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9501/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - app

  redis:
    image: redis:latest
    command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru
  • 說明:
    • app 服務: 移除外部端口映射,Nginx 通過 Docker 網路訪問 app:9501
    • nginx 服務: 移除 links,依賴 Docker Compose 的內建網路解析。
    • redis 服務: 配置 AOF 持久化和記憶體限制,避免記憶體溢出。
Dockerfile 配置
Dockerfile
FROM php:8.2-cli-alpine

RUN docker-php-ext-install pdo pdo_mysql gd redis swoole
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www/html
COPY . /var/www/html
RUN composer install --no-dev --optimize-autoloader
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
RUN chmod -R 755 /var/www/html/bootstrap/cache /var/www/html/storage

CMD ["sh", "-c", "php artisan swoole:http start --daemon"]
  • 說明:
    • 使用 php:8.2-cli-alpine 作為基礎映像,輕量化且高效。
    • 安裝必要擴展(Swoole、Redis 等),並優化 Composer 安裝。

5. Nginx 配置
nginx
upstream laravel_swoole {
    server unix:/var/run/swoole.sock;
}

server {
    listen 80;
    server_name your-api.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-api.com;

    ssl_certificate /etc/nginx/ssl/your_domain.crt;
    ssl_certificate_key /etc/nginx/ssl/your_domain.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/html/public;

    location / {
        proxy_pass http://laravel_swoole;
        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;
        proxy_buffering on;
    }

    location ~ \.(js|css|png|jpg|jpeg|gif|svg|ico)$ {
        try_files $uri /index.php?$query_string;
        expires 30d;
        add_header Cache-Control public;
    }

    location /health {
        proxy_pass http://laravel_swoole/api/health;
        proxy_set_header Host $host;
    }

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
}
  • 說明:
    • 使用 Unix Socket 與 Swoole 通訊。
    • 配置 HTTPS 和靜態資源緩存,提升安全性與效能。

6. Laravel 配置
  • Redis 驅動:
    • 配置 CACHE_DRIVER=redisQUEUE_CONNECTION=redisSESSION_DRIVER=redis
  • 路由和控制器:
    • 避免不必要的資料庫查詢,使用快取(Redis)或懶加載(Lazy Loading)優化效能。

7. 整體建議
  • 安全性:
    • 採用 OAuth2 認證,確保 API 請求安全。
    • 所有通訊使用 HTTPS 加密。
  • 監控:
    • 使用 AWS CloudWatch 監控系統狀態(CPU、記憶體、請求延遲等)。
  • 效能測試:
    • 進行壓力測試,驗證高併發場景下的穩定性。
  • 部署流程:
    • 使用 CI/CD 管道(例如 GitHub Actions 或 AWS CodePipeline)自動化 Docker 映像構建和 ECS 部署。

結論
這份優化後的版本通過以下改進提升了系統效能與可靠性:
  1. 前端與後端的 RESTful API 通訊由 AWS API Gateway 管理,安全高效。
  2. 後端基礎設施利用 ALB、ECS 自動擴展和 RDS Read Replicas 應對高併發。
  3. Nginx 與 Swoole 的 Unix Socket 通訊減少通訊開銷。
  4. Redis Cluster 提升快取與佇列的高可用性。
  5. Docker 配置和 CI/CD 流程確保部署一致性與快速迭代。

沒有留言:

張貼留言