Teil: Bereitstellung einer PHP-Anwendung (Laravel) in Amazon ECS

DDD
Freigeben: 2024-10-20 06:07:02
Original
171 Leute haben es durchsucht

In diesem ersten Teil unserer Tutorialreihe gehen wir die Schritte zum Bereitstellen einer PHP-Anwendung (Laravel) in Amazon ECS durch. Wir beginnen damit, ein Docker-Image zu erstellen, es an Amazon ECR zu übertragen, eine ECS-Aufgabendefinition, einen ECS-Cluster und einen ECS-Dienst zu erstellen und einen Domänennamen mit dem Dienst zu verbinden.

Arbeiten mit Docker und ECR

Erstellen Sie eine Docker-Datei und eine Nginx-Konfiguration

Erstellen Sie im Stammverzeichnis Ihres Git-Repositorys eine Docker-Datei mit folgendem Inhalt:

# Use the official PHP-FPM image as the base
FROM public.ecr.aws/docker/library/php:fpm

# Define a user variable
ARG user=www-data

# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y \
    git curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip unzip libzip-dev \
    nginx \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-install \
        pdo_mysql \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        zip

# Install Composer
COPY --from=public.ecr.aws/composer/composer:latest-bin /usr/bin/composer /usr/bin/composer

# Create a system user for running Composer and Artisan commands
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Copy Nginx configuration and entrypoint script
COPY ./docker/default.conf /etc/nginx/sites-enabled/default
COPY ./docker/entrypoint.sh /etc/entrypoint.sh

# Make the entrypoint script executable
RUN chmod +x /etc/entrypoint.sh

# Set the working directory
WORKDIR /var/www

# Copy the application code
COPY --chown=www-data:www-data . /var/www

# Install PHP dependencies
RUN composer install

# Expose port 80
EXPOSE 80

# Define the entrypoint
ENTRYPOINT ["/etc/entrypoint.sh"]
Nach dem Login kopieren

Erstellen Sie einen neuen Ordner mit dem Namen Docker und legen Sie die folgenden zwei Dateien darin ab.

  • docker/entrypoint.sh
#!/usr/bin/env bash

# Start Nginx service
service nginx start

# Run Laravel migrations
php artisan migrate --force

# Create symbolic link for storage
php artisan storage:link

# Clear and optimize the application cache
php artisan optimize:clear
php artisan optimize

# Start PHP-FPM
php-fpm
Nach dem Login kopieren
  • docker/default.conf
server {
    listen 80 default_server;
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_hide_header X-Powered-By;

        # Tells PHP we're using a reverse proxy with TLS termination
        fastcgi_param HTTPS on;
        fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
        fastcgi_param HTTP_X_FORWARDED_SSL on;
        add_header Content-Security-Policy "upgrade-insecure-requests" always;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}
Nach dem Login kopieren

Und machen Sie Entrypoint.sh ausführbar, indem Sie chmod x docker/entrypoint.sh ausführen.

Übertragen des Bildes an Amazon ECR

Der erste Schritt besteht darin, das Bild an ECR zu übertragen. Sie müssen diesen Schritt zunächst manuell ausführen, bevor Sie mit der Bereitstellung der Anwendung im ECS fortfahren können.

Erstellen Sie ein ECR-Repository

Erstellen Sie ein ECR-Repository, indem Sie zur Amazon ECR-Konsole gehen, auf Repository erstellen klicken und einen Repository-Namen eingeben. Für dieses Beispiel verwenden wir die Demo-App.

Part  Deploying a PHP (Laravel) application to Amazon ECS

Kopieren Sie nach der Erstellung den URI des Repositorys. Diesen URI benötigen Sie später.

Schieben Sie das Bild an ECR

Wählen Sie das gerade erstellte Repository aus, klicken Sie auf Push-Befehle anzeigen und führen Sie die Befehle in Ihrem Terminal aus. Die Befehle sehen folgendermaßen aus (stellen Sie sicher, dass Sie die richtige Region auswählen und die richtige Konto-ID verwenden):

aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
docker build -t demo-app .
docker tag demo-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest
Nach dem Login kopieren

Sobald die Befehle erfolgreich ausgeführt wurden, kehren Sie zur Amazon ECR-Konsole zurück, geben Sie das Repository ein und bestätigen Sie mit dem Tag „latest“, dass das Image erfolgreich übertragen wurde.

Part  Deploying a PHP (Laravel) application to Amazon ECS

Arbeiten mit Amazon ECS

Erstellen Sie eine ECS-Aufgabendefinition

Der nächste Schritt besteht darin, eine ECS-Aufgabendefinition mit dem Docker-Image zu erstellen, das wir gerade an ECR übertragen haben.
Gehen Sie zunächst zur Amazon ECS-Konsole und klicken Sie unter Aufgabendefinitionen auf Neue Aufgabendefinition erstellen.

Wählen Sie einen eindeutigen Namen für die Aufgabendefinition (wir verwenden die Demo-App) und stellen Sie sicher, dass Fargate als Starttyp ausgewählt ist. Ändern Sie in diesem Abschnitt vorerst nichts anderes.

Scrollen Sie nach unten zum Abschnitt Container – 1 und geben Sie die folgenden Werte ein:

  • Name: Demo-App
  • Bild: 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest (ersetzen Sie es durch Ihren eigenen ECR-URI, den wir zuvor kopiert haben)

Später möchten Sie wahrscheinlich die Speicher- und CPU-Einstellungen je nach Anwendung anpassen. Bei Bedarf können Sie hier auch Umgebungsvariablen und EFS-Volumes hinzufügen. Wir werden es in einem separaten Tutorial behandeln.

Part  Deploying a PHP (Laravel) application to Amazon ECS

Ändern Sie in diesem Abschnitt vorerst nichts anderes. Scrollen Sie nach unten und klicken Sie auf Erstellen.

Erstellen Sie einen ECS-Cluster

Wir müssen jetzt einen ECS-Cluster erstellen. Im Cluster führen wir den Dienst aus, der in der soeben erstellten Aufgabendefinition definiert ist.

Gehen Sie zur Amazon ECS-Konsole, klicken Sie unter Cluster auf Cluster erstellen, geben Sie einen Clusternamen ein und stellen Sie sicher, dass Sie AWS auswählen Fargate (serverlos) als Infrastruktur:

Part  Deploying a PHP (Laravel) application to Amazon ECS

Die Erstellung des Clusters dauert einige Minuten. Die Clustererstellung kann gelegentlich fehlschlagen, insbesondere bei neuen Konten; Warten Sie einfach ein paar Minuten und versuchen Sie es erneut, indem Sie einen anderen Clusternamen wählen.

Erstellen Sie einen ECS-Dienst

Öffnen Sie den soeben erstellten Cluster, scrollen Sie nach unten zur Tabelle Dienste, klicken Sie auf Erstellen und geben Sie die folgenden Werte ein:

  • Familie: Demo-App
  • Überarbeitung: 1 (diese unverändert lassen)
  • Dienstname: Demo-App

Part  Deploying a PHP (Laravel) application to Amazon ECS

Klicken Sie noch nicht auf Erstellen.

Fügen Sie einen Load Balancer hinzu

Da wir die Anwendung wahrscheinlich über HTTPS bereitstellen, möchten wir einen Load Balancer hinzufügen. Sie können dies später nicht mehr tun.

Scrollen Sie nach unten zum Abschnitt Netzwerk und wählen Sie eine VPC aus, auf der Sie den Dienst bereitstellen möchten. Stellen Sie sicher, dass die VPC über ein öffentliches Subnetz verfügt, an das ein Internet-Gateway angeschlossen ist. Wenn Sie keine VPC haben, können Sie eine erstellen, indem Sie auf Neue VPC erstellen klicken und dem Assistenten folgen.

Sobald Sie eine VPC ausgewählt haben, lesen Sie weiter.

Scrollen Sie nach unten zum Abschnitt Lastausgleich, wählen Sie Application Load Balancer und wählen Sie die Option Neuen Lastausgleich erstellen.

Wenn diese Option nicht verfügbar ist, haben Sie im vorherigen Schritt wahrscheinlich keine VPC ausgewählt.

Passen Sie die folgenden Werte an:

  • Load-Balancer-Name: demo-app-alb
  • Kulanzfrist für die Gesundheitsprüfung: 300 (Ich empfehle die Einstellung auf 300 Sekunden, also 5 Minuten, damit Ihre App starten und stabilisieren kann)

Lassen Sie im Abschnitt Listener die Option Neuen Listener erstellen ausgewählt, passen Sie die Werte jedoch so an, dass Port 443 und das HTTPS-Protokoll verwendet werden. Um diese Auswahl zu bestätigen, benötigen Sie ein ACM-Zertifikat für die Domain, die Sie verwenden möchten; Weitere Informationen zum Erhalt finden Sie in der AWS-Dokumentation.

Part  Deploying a PHP (Laravel) application to Amazon ECS

Passen Sie im Abschnitt Zielgruppe die folgenden Werte an:

  • Protokoll: HTTP (das ist die Standardeinstellung, stellen Sie sicher, dass Sie sie beibehalten, da unser Nginx-Container Port 80 überwacht)
  • Abmeldeverzögerung: 60 (Ich empfehle, diese auf 60 Sekunden statt der standardmäßigen 5 Minuten einzustellen, um die Bereitstellung etwas schneller zu machen)
  • Gesundheitsprüfungspfad: / (Ich empfehle, dies auf eine Route festzulegen, z. B. /healthcheck, die Sie speziell in Ihrer App erstellen; Sie können es vorerst als Standard belassen)

Part  Deploying a PHP (Laravel) application to Amazon ECS

Klicken Sie auf Erstellen.

Überprüfen Sie den Servicestatus

Es kann einige Minuten dauern, bis Dienste in der Tabelle Dienste angezeigt werden. Warten Sie einfach ein wenig und aktualisieren Sie die Seite, wenn Sie den neuen Dienst nicht sofort sehen.

Wenn alles gut gelaufen ist, sollten Sie den Dienst in der Tabelle Dienste mit dem Status Aktiv und Bereitstellungen und Aufgaben mit 1/1 sehen laufende Aufgabe.

Bereitstellungsfehler werden wie folgt angezeigt:

Part  Deploying a PHP (Laravel) application to Amazon ECS

Um Bereitstellungsfehler zu beheben, öffnen Sie den Dienst und klicken Sie dann auf die Registerkarte Bereitstellungen. Scrollen Sie nach unten zum Abschnitt Ereignisse und klicken Sie auf die ID der zuletzt gestarteten Aufgabe. Der Abschnitt Protokolle der Aufgabenausführung zeigt Ihnen weitere Details darüber, was schief gelaufen ist.

Laravel beschwert sich normalerweise über eine unvollständige Speicherordnerstruktur (z. B. fehlendes Framework, Cache, Sitzungen). Wir werden in einem separaten Tutorial sehen, wie man ein EFS-Volume an die Aufgabendefinition anfügt, um dieses Problem zu beheben.

Verbinden Sie einen Domänennamen mit dem Dienst

Sie möchten wahrscheinlich einen Domänennamen mit dem Dienst verbinden, den wir gerade bereitgestellt haben. In den vorherigen Schritten haben wir bereits einen Application Load Balancer erstellt, die AWS-Komponente, die für die Weiterleitung des Internetverkehrs an den Dienst verantwortlich ist.

Wir haben außerdem bereits ein ACM-Zertifikat bereitgestellt, das zur Verschlüsselung des Datenverkehrs zwischen den Endbenutzern und dem Load Balancer verwendet wird.

Um den Vorgang abzuschließen und Ihre Anwendung über HTTPS aus dem öffentlichen Internet zugänglich zu machen, müssen Sie einen DNS-Eintrag erstellen, der Ihren Domänennamen auf den Load Balancer verweist. Dieser Vorgang unterscheidet sich je nachdem, welchen DNS-Anbieter Sie verwenden. Weitere Informationen finden Sie in der Dokumentation.

Ermitteln Sie zunächst den DNS-Namen des Application Load Balancers. Navigieren Sie zur Suchleiste in der AWS-Konsole (Option S unter macOS), geben Sie Load Balancer ein und wählen Sie Load Balancers (EC2 Feature). Sie sehen eine Tabelle mit dem Load Balancer, mit dem wir unseren Domainnamen verbinden müssen:

Part  Deploying a PHP (Laravel) application to Amazon ECS

Kopieren Sie den DNS-Namen des Load Balancers.

Wenn Sie Route 53 verwenden, befolgen Sie diese Anweisungen:

  • Navigieren Sie zur Route 53-Konsole, klicken Sie auf Gehostete Zonen und wählen Sie Ihren Domainnamen aus.
  • Klicken Sie auf die Schaltfläche Datensatz erstellen.
  • Setzen Sie den Datensatztyp auf A.
  • Aktivieren Sie die Option Alias.
  • Wählen Sie im Feld Datenverkehr weiterleiten an die Option Alias ​​für Anwendung und klassischen Load Balancer aus und wählen Sie die Region des Load Balancers aus.
  • Wählen Sie im Dropdown-Menü Load Balancer auswählen den Load Balancer aus, mit dem wir unseren Domänennamen verbinden müssen. Wenn Sie über mehrere Load Balancer verfügen, überprüfen Sie, ob der aus der Dropdown-Liste ausgewählte Load Balancer mit dem DNS-Namen des Load Balancers übereinstimmen muss, den wir zuvor kopiert haben.
  • Deaktivieren Sie Zielgesundheit bewerten.
  • Klicken Sie auf Datensätze erstellen.

Wenn Sie nicht die Route 53 nutzen:

Weitere Informationen finden Sie in der Dokumentation Ihres DNS-Anbieters. Sie müssen wahrscheinlich einen CNAME-Eintrag erstellen, dessen Ziel/Wert der DNS-Name des Load Balancers ist.

Glückwunsch

Sobald Sie den DNS-Eintrag erstellt haben, warten Sie einige Minuten, bis er sich verbreitet, und versuchen Sie dann, über den Domänennamen auf Ihre Anwendung zuzugreifen.

Herzlichen Glückwunsch!Sie haben jetzt erfolgreich eine PHP-Anwendung (Laravel) in AWS ECS bereitgestellt.

Demnächst in dieser Tutorial-Reihe verfügbar

  • Anhängen eines EFS-Volumes an die Aufgabendefinition, um das Problem mit der Speicherordnerstruktur von Laravel zu beheben
  • Mit AWS CodePipeline automatisch neuen Code für den Service bereitstellen
  • Automatisierung der Infrastrukturbereitstellung mit AWS CDK

Das obige ist der detaillierte Inhalt vonTeil: Bereitstellung einer PHP-Anwendung (Laravel) in Amazon ECS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!