在 Ubuntu 22.04 上使用 Docker Compose 安装和配置 Laravel — 全面指南
در این راهنما به صورت قدم‌به‌قدم با نحوه نصب و پیکربندی لاراول با استفاده از داکر کامپوز روی اوبونتو 22.04 آشنا شوید و محیط تولیدی امن و بهینه ایجاد کنید.

在 Ubuntu 22.04 上使用 Docker Compose 安装和配置 Laravel — 全面指南

本文将向您展示如何使用 Docker Compose 在 Ubuntu 22.04 上安装和部署 Laravel 应用程序。通过逐步讲解,您可以轻松创建一个安全且优化的生产环境。.
0 股票
0
0
0
0

چطور Laravel را با Docker Compose روی Ubuntu 22.04 نصب و راه‌اندازی کنیم؟

در این راهنمای عملی و فنی، گام‌به‌گام نصب و پیکربندی یک اپلیکیشن Laravel 使用 Docker Compose روی سرور Ubuntu 22.04 شرح داده شده است. هدف این مطلب فراهم کردن دستورالعمل‌های قابل تکرار برای توسعه‌دهندگان، تیم‌های DevOps و مدیران فنی است تا یک محیط تولیدی امن، قابل‌اسکیل و قابل نگهداری به‌وجود آورند.

چک‌لیست اولیه

قبل از شروع، موارد زیر را آماده کنید:

  • 服务器 Ubuntu 22.04 با دسترسی root یا کاربر دارای sudo
  • Docker (نسخه پایدار) و Docker Compose (یا استفاده از docker compose پلاگین)
  • پورت‌های باز: 80/443 برای وب؛ در صورت نیاز 3306 或者 5432 برای دیتابیس (ترجیحاً محدود به IPها)
  • فضای دیسک مناسب (SSD پیشنهاد می‌شود) و دسترسی به یکی از بیش از 85 لوکیشن جهانی در صورت استفاده از خدمات ابری
  • نام دامنه و رکورد DNS که به IP سرور اشاره کند

نصب Docker و Docker Compose روی Ubuntu 22.04

دستورات زیر را روی سرور اجرا کنید تا Docker و پلاگین docker compose نصب شوند:

sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER

سپس از سیستم خارج و دوباره وارد شوید یا از newgrp docker 使用。.

برای بررسی نصب:

docker --version
docker compose version

ساختار پیشنهادی پروژه

پیشنهاد می‌شود پوشه پروژه به شکل زیر سازمان‌دهی شود تا نگهداری و توسعه ساده‌تر باشد:

  • project-root/
    • docker/
      • nginx/default.conf
      • php/Dockerfile
    • src/ — کد Laravel (یا mount)
    • docker-compose.yml
    • .env

Dockerfile پیشنهادی برای PHP-FPM (PHP 8.1)

فایلی با مسیر docker/php/Dockerfile مانند مثال زیر بسازید:

FROM php:8.1-fpm

# Install required tools and extensions
RUN apt-get update && apt-get install -y \
    git zip unzip libpng-dev libjpeg-dev libfreetype6-dev libonig-dev libxml2-dev \
    libzip-dev libpq-dev cron curl supervisor \
  && docker-php-ext-configure gd --with-freetype --with-jpeg \
  && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql mbstring xml bcmath zip opcache \
  && pecl install redis && docker-php-ext-enable redis \
  && pecl install xdebug || true \
  && apt-get clean && rm -rf /var/lib/apt/lists/*

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# Create non-root user
RUN useradd -G www-data,root -u 1000 -d /home/appuser appuser
WORKDIR /var/www/html
USER appuser

نمونه docker-compose.yml

نسخه پیشنهادی docker-compose.yml برای اجرای اپلیکیشن، وب‌سرور، دیتابیس و Redis:

version: "3.8"

services:
  app:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    image: laravel_app:latest
    container_name: laravel_app
    restart: unless-stopped
    volumes:
      - ./src:/var/www/html
      - ./docker/php/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
    environment:
      - APP_ENV=production
      - APP_DEBUG=false
    networks:
      - laravel-net

  web:
    image: nginx:alpine
    container_name: laravel_web
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./src:/var/www/html:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./certs:/etc/letsencrypt
    depends_on:
      - app
    networks:
      - laravel-net

  db:
    image: mysql:8.0
    container_name: laravel_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - laravel-net

  redis:
    image: redis:6-alpine
    container_name: laravel_redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    networks:
      - laravel-net

volumes:
  db_data:
  redis_data:

networks:
  laravel-net:
    driver: bridge

فایل کانفیگ Nginx (docker/nginx/default.conf)

نمونه کانفیگ Nginx برای هدایت درخواست‌ها به PHP-FPM (app):

server {
    listen 80;
    server_name example.com;

    root /var/www/html/public;
    index index.php index.html;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        deny all;
    }
}

笔记: در معماری‌هایی با پروکسی معکوس یا چند سرویس، می‌توانید Nginx را در لایه لود بالانسر یا CDN قرار دهید.

آماده‌سازی کد و نصب وابستگی‌ها

اگر پروژه Laravel ندارید، می‌توانید با Composer یک پروژه جدید بسازید:

composer create-project --prefer-dist laravel/laravel src

سپس برای ساخت و اجرای کانتینرها:

docker compose build
docker compose up -d

برای اجرای دستورات Composer و Artisan داخل کانتینر PHP:

docker exec -it laravel_app bash
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan config:cache
php artisan route:cache
exit

تنظیم فایل .env برای Docker

نمونه تنظیمات .env منطبق با docker-compose:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

CACHE_DRIVER=redis
REDIS_HOST=redis

APP_URL=https://example.com

SSL و Let’s Encrypt — دو راه ساده

برای فعال‌سازی HTTPS دو راه ساده وجود دارد:

  • استفاده از Certbot روی host: Nginx را موقتا متوقف کنید، گواهی صادر شده را در پوشه ./certs قرار دهید و آن را به کانتینر mount کنید.
  • استفاده از راهکار خودکار: ابزارهایی مانند docker-letsencrypt-nginx-proxy-companion 或者 Traefik برای مدیریت خودکار گواهی مناسب‌اند.

مثال سریع با Certbot:

sudo apt install -y certbot
sudo docker compose down
sudo certbot certonly --standalone -d example.com --non-interactive --agree-tos -m [email protected]
# Copy certificates from /etc/letsencrypt/live/... to ./certs and then:
sudo docker compose up -d

راه‌اندازی در بوت و حفظ سرویس

برای اطمینان از اجرای سرویس‌ها پس از ریبوت:

sudo systemctl enable docker

علاوه بر این، در docker-compose از restart: unless-stopped استفاده شده است. در صورت نیاز می‌توان یک unit systemd برای docker-compose ساخت.

نکات امنیتی عملی

  • استفاده از کاربر غیرِ root در کانتینر PHP (appuser در Dockerfile بالا)
  • محدود کردن دسترسی به پورت دیتابیس با فایروال (UFW):
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

سایر توصیه‌ها:

  • بکاپ‌گیری منظم از حجم دیتابیس (db_data) و نگهداری آن خارج از سرور
  • فعال‌سازی HTTPS و HSTS
  • استفاده از secrets یا سرویس مدیریت کلید برای نگهداری رمزها (Docker secrets یا سرویس‌های مدیریت کلید)
  • استفاده از ابزارهای امنیتی مثل 失败2禁止 و در صورت نیاز WAF مانند ModSecurity
  • استفاده از CDN یا سرویس Anti-DDoS برای محافظت از ترافیک

بهینه‌سازی عملکرد برای محیط تولید

  • فعال‌سازی OPcache در php.ini:
    opcache.memory_consumption=256
    opcache.validate_timestamps=0
  • تنظیم php-fpm (pm = dynamic یا ondemand) و افزایش max_children مطابق با حافظه سرور
  • استفاده از Redis برای cache و session
  • استفاده از CDN برای فایل‌های استاتیک
  • Horizontal scaling: اجرای چند instance از سرویس app با load balancer (NGINX یا HAProxy)
  • برای real-time و queue از workerهای جداگانه و supervisor یا سرویس‌های مجزا استفاده کنید

Queue workers و Horizon

برای اجرای queue workers یک سرویس جداگانه در docker-compose اضافه کنید. نمونه:

worker:
  build: ...
  command: php /var/www/html/artisan queue:work --sleep=3 --tries=3
  depends_on: [app, redis]
  restart: unless-stopped

برای Laravel Horizon بهتر است از یک کانتینر اختصاصی با PHP و نصب Horizon استفاده کرده و آن را پشت Nginx/احراز هویت قرار دهید.

نکات مرتبط با لوکیشن و انتخاب دیتاسنتر

نکات عملی برای انتخاب لوکیشن:

  • برای کمترین latency سرور را در لوکیشن نزدیک به کاربران نهایی یا مقصد انتخاب کنید. شرکت ارائه‌دهنده خدمات بیش از 全球85个地点 دارد.
  • برای گیمرها یا تریدرها، لوکیشنی با پینگ پایین و شبکه BGP بهینه انتخاب کنید.
  • برای پردازش‌های AI و رندرینگ از سرورهای دارای GPU استفاده کنید.
  • برای مقاومت در برابر DDoS از سرورها و CDN دارای محافظت Anti-DDoS بهره ببرید.

پشتیبان‌گیری، مانیتورینگ و لاگ‌ها

  • لاگ‌های کانتینرها با docker logs قابل دسترسی هستند؛ برای جمع‌آوری مرکزی از ELK یا Prometheus+Grafana استفاده کنید.
  • بکاپ دیتابیس روزانه و انجام تست Restore دوره‌ای
  • مانیتورینگ منابع CPU/RAM، اپلیکیشن و پیگیری خطاها در CI/CD

اشکال‌زدایی رایج

  • خطای 502 Bad Gateway: بررسی کنید php-fpm در کانتینر app اجرا شود و fastcgi_pass به آدرس درست (app:9000) اشاره کند.
  • مشکل اتصال به دیتابیس: متغیرهای .env، شبکه docker و لاگ‌های MySQL را بررسی کنید.
  • مجوزهای فایل: در صورت خطاهای permission، مالکیت پوشه‌های storage و bootstrap/cache را تنظیم کنید:
sudo chown -R 1000:1000 src/storage src/bootstrap/cache

نتیجه‌گیری و توصیه نهایی

استفاده از Docker Compose برای اجرای Laravel روی Ubuntu 22.04 توسعه و استقرار را ساده، قابل تکرار و قابل مقیاس می‌کند. با پیروی از این راهنما می‌توانید یک محیط تولیدی امن، سریع و قابل نگهداری راه‌اندازی کنید: PHP-FPM همراه با Nginx، MySQL/MariaDB یا PostgreSQL، Redis برای cache و queue، و تنظیمات SSL و مانیتورینگ.

خدمات مرتبط

برای پیاده‌سازی حرفه‌ای این معماری می‌توانید از خدمات زیر بهره ببرید:

  • بیش از 全球85个地点 برای کاهش latency و نزدیک کردن سرور به کاربر یا مقصد
  • سرور گرافیکی (GPU) برای محاسبات AI و رندرینگ
  • VPS مخصوص ترید با پینگ پایین و شبکه BGP بهینه
  • VPS مخصوص گیم با پینگ پایین و Anti-DDoS
  • خدمات هاست و ثبت دامنه، CDN و راهکارهای شبکه و BGP
  • سرور ابری با عملکرد بالا و بکاپ مدیریت‌شده

常见问题解答

您可能也喜欢
如何在 Ubuntu 24.04 上安装 Cockpit

如何在 Ubuntu 24.04 上安装 Cockpit

Cockpit 是一个基于 Web 的服务器管理面板,它以简洁的图形化方式监控和管理服务、存储、日志和用户。在 VPS 上使用 Cockpit,系统管理员无需使用命令行即可执行许多服务器管理任务。下面,我们将逐步指导您如何安装、配置安全性和访问 Cockpit。.