پرش به محتویات

شب ۰۸: مسیریاب‌ها و میان‌افزارها در Compose

بخش ۰۸ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثال‌ها مطابق منبع با Traefik Proxy v3.7 نوشته شده‌اند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزموده‌شده یا digest مشخصی را ثابت کنید. تمرین‌ها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.

فهرست کامل دورهٔ ترافیک در ۳۰ شب

هدف‌های یادگیری

  • ساخت قواعد دقیق Host و Path و درک اولویت.
  • ترکیب میان‌افزارها با ترتیب آگاهانه.
  • دسترسی ایمن به داشبورد از طریق api@internal.

تمرین عملی: میان‌افزارهای قابل‌استفادهٔ مجدد

# dynamic/http.yml
http:
  middlewares:
    secure-headers:
      headers:
        contentTypeNosniff: true
        frameDeny: true
        referrerPolicy: no-referrer
    lab-auth:
      basicAuth:
        usersFile: /run/secrets/dashboard_users
        removeHeader: true
    standard-chain:
      chain:
        middlewares: [secure-headers, compress]
    compress:
      compress: {}
    api-strip:
      stripPrefix: {prefixes: [/api]}

اتصال فقط‌خواندنی فایل اعتبارنامه و برچسب‌ها را به Traefik اضافه کنید:

services:
  traefik:
    volumes:
      - ./secrets/dashboard_users:/run/secrets/dashboard_users:ro
    labels:
      traefik.enable: "true"
      traefik.http.routers.dashboard.rule: "Host(`dashboard.example.test`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
      traefik.http.routers.dashboard.entrypoints: web
      traefik.http.routers.dashboard.service: api@internal
      traefik.http.routers.dashboard.middlewares: lab-auth@file,secure-headers@file
  whoami:
    labels:
      traefik.http.routers.whoami.rule: "Host(`whoami.example.test`) && PathPrefix(`/app`)"
      traefik.http.routers.whoami.priority: "100"
      traefik.http.routers.whoami.middlewares: standard-chain@file
mkdir -p secrets
htpasswd -nbB admin 'replace-this-lab-password' > secrets/dashboard_users
chmod 600 secrets/dashboard_users
docker compose config --quiet
docker compose up -d
curl -sv --resolve whoami.example.test:80:127.0.0.1 http://whoami.example.test/app
curl -I --resolve dashboard.example.test:80:127.0.0.1 http://dashboard.example.test/dashboard/
curl -u admin:replace-this-lab-password --resolve dashboard.example.test:80:127.0.0.1 \
  http://dashboard.example.test/api/overview

ترتیب میان‌افزارها مهم است: احراز هویت پیش از محدودسازی نرخ، رفتار عملیاتی و امنیتی متفاوتی از ترتیب عکس دارد. حذف پیشوند پیش از احراز هویت می‌تواند URL احراز هویت را تغییر دهد. میان‌افزار زنجیره‌ای ترتیب سیاست‌ها را قابل‌بازبینی می‌کند.

فهرست تمرین

  • مسیریاب عمومی‌تری فقط با Host اضافه کنید و اولویت خودکار مبتنی بر طول قاعده را ببینید.
  • اولویت‌ها را صریح تعیین کنید و نشان دهید کدام مسیریاب انتخاب می‌شود.
  • خطای 404 ناشی از نبود تطابق را با 502 ناشی از تطابق مسیر و خرابی پشت‌صحنه مقایسه کنید.
  • هدرهای امنیتی و فشرده‌سازی پاسخ را تأیید کنید.
  • تأیید کنید دسترسی به داشبورد بدون اعتبارنامه پاسخ 401 می‌دهد.
  • پس از تمرین، گذرواژه‌های متن سادهٔ آزمایشگاه را از تاریخچهٔ پوسته و یادداشت‌ها حذف کنید.

نکته‌های عیب‌یابی

  • داشبورد خالی است یا 404 می‌دهد: قاعده باید هم /dashboard و هم /api را پوشش دهد؛ اسلش پایانی /dashboard/ را حفظ کنید.
  • میان‌افزار پیدا نمی‌شود: Docker به شیء فایل بدون @file ارجاع داده است.
  • خطای پردازش Basic auth: کوتیشن‌گذاری هش یا فایل، یا مجوزها نادرست است.
  • مسیریاب غیرمنتظره انتخاب می‌شود: اولویت مؤثر و قواعد هم‌پوشان را بررسی کنید.

خودآزمایی

  1. api@internal چیست؟ سرویس داخلی داشبورد و API در Traefik.
  2. قواعد تطبیق مشابه چگونه مرتب می‌شوند؟ بر اساس اولویت قاعده؛ اولویت ضمنی از طول قاعده می‌آید، پس برای هم‌پوشانی‌ها آن را صریح تعیین کنید.
  3. چرا از زنجیرهٔ میان‌افزار استفاده می‌کنیم؟ سیاست را متمرکز و ترتیب را قابل‌استفادهٔ مجدد و بازبینی می‌کند.
  4. اثبات کنید: درخواست غیرمجاز داشبورد 401، درخواست مجاز 200 و Host ناشناخته 404 می‌گیرد.