Bereitstellen einer Symfony-Anwendung für die Produktion unter Ubuntu 14.04

Einführung

Symfony ist ein in PHP geschriebenes Open-Source-Webframework, das sich zum Erstellen von Projekten jeder Größe eignet. Es bietet eine gut gestaltete Struktur, die auf wiederverwendbaren Komponenten basiert, auf denen Sie Ihre eigene PHP-Anwendung erstellen können.

In diesem Lernprogramm werden die Schritte beschrieben, die zum manuellen Bereitstellen einer Symfony-Basisanwendung auf einem Ubuntu 14.04-Server erforderlich sind. Wir werden sehen, wie Sie den Server unter Berücksichtigung der Sicherheits- und Leistungsanforderungen richtig konfigurieren, um ein produktionsfertiges Setup durchzuführen.

Wenn Sie ein Einführungs-Tutorial zu Symfony suchen, können Sie https://www.digitalocean.com/community/tutorials/how-to-install-and-get-started-with-symfony-2-on-ubuntu- lesen. 14-04 [Installation und erste Schritte mit Symfony unter Ubuntu 14.04].

Voraussetzungen

Für dieses Tutorial benötigen Sie:

  • Ein neues Ubuntu 14.04 Droplet mit LAMP oder https : //www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 [LEMP]

  • Ein Benutzer ohne Rootberechtigung, den Sie einrichten können, indem Sie dem Tutorial Initial Server Setup folgen

Es ist wichtig zu berücksichtigen, dass die Bereitstellung ein sehr umfangreiches Thema ist, da jede Anwendung ihre eigenen spezifischen Anforderungen hat. Zur Vereinfachung verwenden wir eine mit Symfony erstellte Musteranwendung. Den Quellcode finden Sie unter GitHub.

Schritt 1 - Installieren der Serverabhängigkeiten

In diesem Schritt installieren wir die Serverabhängigkeiten.

Aktualisieren Sie zunächst den Paketmanager-Cache.

sudo apt-get update

Wir benötigen "+ git ", um die Anwendungsdateien auszuchecken, " acl ", um die richtigen Verzeichnisberechtigungen für die Installation der Anwendung festzulegen, und zwei PHP-Erweiterungen (" php5-cli +", um PHP in der Befehlszeile auszuführen und " + php5-curl + `für Symfony). Installieren Sie die erforderlichen Pakete.

sudo apt-get install git php5-cli php5-curl acl

Zuletzt benötigen wir "+ composer ", um die Anwendungsabhängigkeiten herunterzuladen. Um ` composer +` systemweit zu installieren, führen Sie Folgendes aus:

sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Sie sollten jetzt bereit sein zu gehen.

Schritt 2 - Konfiguration von MySQL

Beginnen wir damit, Ihr MySQL-Setup für die Produktion vorzubereiten. Für den nächsten Schritt benötigen Sie das Passwort für das * root * MySQL-Konto. Stellen Sie sicher, dass Sie MySQL sicher eingerichtet haben (siehe Schritt 2 unter https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on) -ubuntu-14-04 # step-two-% E2% 80% 94-install-mysql [LAMP] und https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql -php-lemp-stack-on-ubuntu-14-04 # step-two-% E2% 80% 94-install-mysql-to-manage-site-data (LEMP-Tutorials).

Festlegen der Standardsortierung und des Zeichensatzes

Symfony empfiehlt, den Zeichensatz und die Sortierung Ihrer Datenbank auf "+ utf8 +" einzustellen. Die meisten Datenbanken verwenden standardmäßig lateinische Sortierungen. Dies führt zu unerwarteten Ergebnissen beim Abrufen von Daten, die zuvor in der Datenbank gespeichert waren, z. B. seltsame Zeichen und unlesbarer Text. Es gibt keine Möglichkeit, dies auf Anwendungsebene zu konfigurieren. Daher müssen wir die MySQL-Konfigurationsdatei so bearbeiten, dass sie einige Definitionen enthält.

Öffnen Sie die Datei "+ / etc / mysql / my.cnf +" mit Ihrem bevorzugten Befehlszeileneditor.

sudo nano /etc/mysql/my.cnf

Suchen Sie nun den Block * [mysqld] *. Fügen Sie die Optionen "+ Kollatierungsserver" und "+ Zeichensatzserver" unter "Grundeinstellungen" hinzu.

/etc/mysql/my.cnf

[mysqld]
#
# * Basic Settings
#


user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock

. . .

Speichern und schließen. Starten Sie MySQL neu, damit die Änderungen wirksam werden.

sudo service mysql restart

Erstellen eines Benutzers und einer Datenbank für die Anwendung

Jetzt müssen wir eine MySQL-Datenbank und einen Benutzer für unsere Anwendung erstellen.

Greifen Sie zunächst mit dem MySQL-Konto * root * auf den MySQL-Client zu.

mysql -u root -p

Sie werden nach einem Passwort gefragt. Dies sollte dasselbe Kennwort sein, das Sie beim Ausführen von "+ mysql_secure_installation +" verwendet haben.

Erstellen Sie nun die Anwendungsdatenbank.

CREATE DATABASE ;
OutputQuery OK, 1 row affected (0.00 sec)

Die Datenbank ist nun erstellt. Der nächste Schritt besteht darin, einen MySQL-Benutzer zu erstellen und ihm Zugriff auf unsere neu erstellte Datenbank zu gewähren.

CREATE USER ''@'localhost' IDENTIFIED BY '';
OutputQuery OK, 0 rows affected (0.00 sec)

Dadurch wird ein Benutzer mit dem Namen * todo-user * mit dem Kennwort * todo-password * erstellt. Es ist wichtig zu beachten, dass dies einfache Beispielwerte sind, die geändert werden sollten. Aus Sicherheitsgründen sollten Sie für Ihren MySQL-Benutzer ein komplexeres Kennwort verwenden.

Wir müssen diesem Benutzer noch die richtigen Berechtigungen für unsere Anwendungsdatenbank erteilen. Dies kann erfolgen mit:

GRANT ALL PRIVILEGES ON .* TO ''@'localhost';
OutputQuery OK, 0 rows affected (0.00 sec)

Dadurch erhält der Benutzer * todo-user * alle Berechtigungen für alle Tabellen in der Datenbank + todo +. Führen Sie zum Übernehmen der Änderungen Folgendes aus:

FLUSH PRIVILEGES;
OutputQuery OK, 0 rows affected (0.00 sec)

Um zu testen, ob alles wie erwartet funktioniert, beenden Sie den MySQL-Client.

quit;

Melden Sie sich jetzt erneut an, diesmal mit dem neuen MySQL-Benutzer und dem neuen Passwort, die Sie gerade erstellt haben. In diesem Beispiel verwenden wir den Benutzernamen * todo-user * mit dem Passwort * todo-password *.

mysql -u  -p

Sie können überprüfen, auf welche Datenbanken dieser Benutzer Zugriff hat:

SHOW DATABASES;

Die Ausgabe sollte folgendermaßen aussehen:

Output+--------------------+
| Database           |
+--------------------+
| information_schema |
|                |
+--------------------+
2 rows in set (0.00 sec)

Dies bedeutet, dass der neue Benutzer erfolgreich mit den richtigen Berechtigungen erstellt wurde. Sie sollten nur zwei Datenbanken sehen: + information_schema + und + todo +.

Sie können den MySQL-Client jetzt beenden.

quit;

Schritt 3 - Auschecken des Anwendungscodes

Die Bereitstellung ist aufgrund der Einzigartigkeit der meisten Anwendungen ein umfangreiches Thema, auch wenn wir nur Symfony-Projekte berücksichtigen. Es ist schwer zu verallgemeinern, da jeder Anwendungsfall sehr spezifische Bereitstellungsschritte erfordern kann, z. B. das Migrieren einer Datenbank oder das Ausführen zusätzlicher Setup-Befehle.

Um den Tutorial-Ablauf zu vereinfachen, verwenden wir eine einfache Demo-Anwendung, die mit Symfony erstellt wurde. Sie können auch Ihre eigene Symfony-Anwendung verwenden. Beachten Sie jedoch, dass Sie je nach den Anforderungen Ihrer Anwendung möglicherweise zusätzliche Schritte ausführen müssen.

Unsere Anwendung ist eine einfache Aufgabenliste, mit der Sie Elemente hinzufügen und entfernen sowie den Status jedes Elements ändern können. Die Aufgaben werden in einer MySQL-Datenbank gespeichert. Der Quellcode ist unter GitHub verfügbar.

Wir werden Git verwenden, um den Anwendungscode zu überprüfen. Der nächste Schritt besteht darin, einen Speicherort auszuwählen, der als Anwendungsstammverzeichnis dient. Später werden wir den Webserver entsprechend konfigurieren. In diesem Tutorial verwenden wir "+ / var / www / todo-symfony +". Erstellen Sie also jetzt dieses Verzeichnis.

sudo mkdir -p /var/www/

Bevor Sie das Repository klonen, ändern Sie den Ordnereigner und die Gruppe, damit wir mit unserem regulären Benutzerkonto mit den Projektdateien arbeiten können. Ersetzen Sie sammy durch Ihren sudo-Benutzernamen ohne Rootberechtigung.

sudo chown  /var/www/

Wechseln Sie nun in das übergeordnete Verzeichnis und klonen Sie die Anwendung.

cd /var/www
git clone
OutputCloning into 'todo-symfony'...
remote: Counting objects: 76, done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 76 (delta 6), reused 76 (delta 6), pack-reused 0
Unpacking objects: 100% (76/76), done.
Checking connectivity... done.

Schritt 4 - Korrigieren der Ordnerberechtigungen

Die Anwendungsdateien befinden sich jetzt unter + / var / www / todo-symfony +, einem Verzeichnis, das unserem system user gehört (in diesem Tutorial verwenden wir * sammy * als Beispiel). Der web server user (normalerweise * www-data *) benötigt jedoch auch Zugriff auf diese Dateien. Andernfalls kann der Webserver die Anwendung nicht bedienen. Abgesehen davon gibt es zwei Verzeichnisse, für die eine spezielle Berechtigungsvereinbarung erforderlich ist: "+ app / cache" und "+ app / logs". Diese Verzeichnisse sollten sowohl vom Systembenutzer als auch vom Webserver-Benutzer beschreibbar sein.

Wir werden ACL (Access Control Lists) zum Konfigurieren dieser speziellen Berechtigungen verwenden. ACLs ermöglichen differenziertere Zugriffsrechte für Dateien und Verzeichnisse. Dies ist erforderlich, um die richtigen Berechtigungen einzurichten und gleichzeitig zu zulässige Vereinbarungen zu vermeiden.

Zunächst müssen wir dem Benutzer * www-data * Zugriff auf die Dateien im Anwendungsordner gewähren. Geben Sie diesem Benutzer die Berechtigung read + execute (rX) für das gesamte Verzeichnis.

sudo setfacl -R -m u:www-data:rX

Als nächstes müssen wir spezielle Berechtigungen für die Ordner "+ cache" und "+ log" einrichten. Geben Sie dem Benutzer * www-data * die Berechtigung read + write + execute (rwX), damit der Webserver nur in diese Verzeichnisse schreiben kann.

sudo setfacl -R -m u:www-data:rwX /app/cache /app/logs

Schließlich definieren wir, dass alle neuen Dateien, die in den Ordnern "+ app / cache " und " app / logs " erstellt werden, demselben Berechtigungsschema folgen, das wir gerade definiert haben, mit Lese-, Schreib- und Ausführungsberechtigungen für den Webserver-Benutzer. Dies geschieht durch Wiederholen des soeben ausgeführten Befehls " setfacl ", diesmal jedoch durch Hinzufügen der Option " -d +".

sudo setfacl -dR -m u:www-data:rwX /app/cache /app/logs

Wenn Sie überprüfen möchten, welche Berechtigungen derzeit in einem bestimmten Verzeichnis vorhanden sind, können Sie "+ getfacl +" verwenden.

getfacl /app/cache

Sie sollten eine Ausgabe ähnlich der folgenden erhalten:

Output# file: todo-symfony/app/cache
# owner: sammy
# group: sammy
user::rwx
user:www-data:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

Anhand dieser Ausgabe können Sie erkennen, dass das Verzeichnis "+ app / cache +" zwar dem Benutzer "* sammy " gehört, jedoch zusätzliche Berechtigungen für den Benutzer " www-data *" vorhanden sind. Die Standardanweisungen geben an, welche Berechtigungen neue Dateien haben, die in diesem Verzeichnis erstellt wurden.

Schritt 5 - Einrichten der Anwendung

Wir haben jetzt die Anwendungsdateien vorhanden, müssen aber noch die Projektabhängigkeiten installieren und die Anwendungsparameter konfigurieren.

Symfony ist so konzipiert, dass es in verschiedenen Umgebungen gut funktioniert. Standardmäßig werden Entwicklungseinstellungen verwendet, die den Umgang mit Cache und Fehlern beeinflussen. Entwicklungsumgebungen verfügen über umfangreichere und detailliertere Protokolle, weniger zwischengespeicherten Inhalt, und Fehler werden in herausragender Weise angezeigt, um das Debuggen zu vereinfachen. Dies ist nützlich für die Entwicklung der Anwendung, für Produktionsumgebungen jedoch keine gute Vorgehensweise.

Um die Anwendung für die Produktion zu optimieren, müssen Sie eine Umgebungsvariable definieren, die Symfony mitteilt, dass die Anwendung in einer Produktionsumgebung ausgeführt wird.

export SYMFONY_ENV=prod

Als nächstes müssen wir die Projektabhängigkeiten installieren. Greifen Sie auf den Anwendungsordner zu und führen Sie "+ composer install" aus.

cd
composer install --no-dev --optimize-autoloader

Am Ende des Installationsvorgangs sollten Sie aufgefordert werden, einige Informationen anzugeben, die die Datei + parameters.yml + füllen. Diese Datei enthält wichtige Informationen für die Anwendung, z. B. die Einstellungen für die Datenbankverbindung. Sie können + ENTER + drücken, um die Standardwerte für all diese Werte zu akzeptieren, mit Ausnahme des Datenbanknamens, des Benutzernamens und des Kennworts. Verwenden Sie für diese die in link erstellten Werte: # step-2-% E2% 80% 94-configure-mysql [step 2].

OutputCreating the "app/config/parameters.yml" file
Some parameters are missing. Please provide them.
database_host (127.0.0.1):
database_port (null):
database_name (symfony):
database_user (root):
database_password (null):
. . .

Nach Abschluss der Installation können wir die Datenbankverbindung mit dem Konsolenbefehl + doctrine: schema: validate + überprüfen.

php app/console doctrine:schema:validate
Output[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

Die OK-Zeile bedeutet, dass die Datenbankverbindung funktioniert. Die FAIL-Zeile wird erwartet, da wir das Datenbankschema noch nicht erstellt haben. Gehen wir also wie folgt vor:

php app/console doctrine:schema:create
OutputATTENTION: This operation should not be executed in a production environment.

Creating database schema...
Database schema created successfully!

Dadurch werden alle Anwendungstabellen in der konfigurierten Datenbank gemäß den von den Anwendungsentitäten erhaltenen Metadateninformationen erstellt.

Jetzt sollten Sie den Cache leeren.

php app/console cache:clear --env=prod --no-debug
OutputClearing the cache for the prod environment with debug false

Und schließlich generieren Sie die Anwendungsressourcen.

php app/console assetic:dump --env=prod --no-debug
OutputDumping all prod assets.
Debug mode is off.

14:02:39 [file+] /var/www/todo-symfony/app/../web/css/app.css
14:02:39 [dir+] /var/www/todo-symfony/app/../web/js
14:02:39 [file+] /var/www/todo-symfony/app/../web/js/app.js

Schritt 6 - Einrichten des Webservers

Sie müssen nur noch den Webserver konfigurieren. Dies umfasst zwei Schritte: Setzen der Direktive "+ date.timezone" in "+ php.ini" und Aktualisieren der Standard-Website-Konfigurationsdatei (entweder auf Apache oder Nginx) für die Bereitstellung unserer Anwendung.

Wir werden sehen, wie diese Schritte sowohl in LEMP- als auch in LAMP-Umgebungen ausgeführt werden.

Konfigurationsschritte für Nginx + PHP-FPM

Beginnen wir mit der Bearbeitung der Standarddatei "+ php.ini", um die Zeitzone des Servers zu definieren. Dies ist eine Voraussetzung für die Ausführung von Symfony-Anwendungen. In der Regel werden neue Serverinstallationen auskommentiert.

Öffnen Sie die Datei "+ / etc / php5 / fpm / php.ini".

sudo nano /etc/php5/fpm/php.ini

Suchen Sie nach der Zeile, die "+ date.timezone " enthält. Kommentieren Sie die Direktive aus, indem Sie das "; " - Zeichen am Zeilenanfang entfernen und die entsprechende Zeitzone für Ihre Anwendung hinzufügen. In diesem Beispiel wird " Europe / Amsterdam +" verwendet, Sie können jedoch eine beliebige supported timezone auswählen.

/etc/php5/fpm/php.ini geändert

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =

Speichern Sie die Datei und beenden Sie sie. Starten Sie PHP neu, um die Änderungen zu übernehmen.

sudo service php5-fpm restart

Als Nächstes müssen wir die Standardkonfigurationsdatei der Website durch eine Datei ersetzen, die für die Bereitstellung einer Symfony-Anwendung angepasst ist. Erstellen Sie zuerst ein Backup der aktuellen Standard-Website-Konfiguration.

cd /etc/nginx/sites-available
sudo mv default default-bkp

Erstellen Sie eine neue Datei, um die alte zu ersetzen.

sudo nano /etc/nginx/sites-available/default

Fügen Sie den folgenden Inhalt in die Datei ein. Vergessen Sie nicht, die Werte für "+ Servername +" zu ersetzen, um Ihren Serverdomänennamen oder Ihre IP-Adresse wiederzugeben.

/ etc / nginx / sites-available / default

server {
   server_name ;
   root /var/www//web;

   location / {
       # try to serve file directly, fallback to app.php
       try_files $uri /app.php$is_args$args;
   }

   location ~ ^/app\.php(/|$) {
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       # Prevents URIs that include the front controller. This will 404:
       # http://domain.tld/app.php/some-path
       # Remove the internal directive to allow URIs like this
       internal;
   }

   error_log /var/log/nginx/symfony_error.log;
   access_log /var/log/nginx/symfony_access.log;
}

Speichern Sie die Datei und beenden Sie sie. Starten Sie Nginx neu, um die Änderungen zu übernehmen.

sudo service nginx restart

Konfigurationsschritte für Apache + PHP5 Web Server

Beginnen wir mit der Bearbeitung der Standarddatei "+ php.ini", um die Zeitzone des Servers zu definieren. Dies ist eine Voraussetzung für die Ausführung von Symfony-Anwendungen. In der Regel werden neue Serverinstallationen auskommentiert.

Öffnen Sie die Datei "+ / etc / php5 / apache2 / php.ini":

sudo nano /etc/php5/apache2/php.ini

Suchen Sie nach der Zeile, die "+ date.timezone " enthält. Kommentieren Sie die Direktive aus, indem Sie das "; " - Zeichen am Zeilenanfang entfernen und die entsprechende Zeitzone für Ihre Anwendung hinzufügen. In diesem Beispiel wird " Europe / Amsterdam +" verwendet, Sie können jedoch eine beliebige supported timezone auswählen.

/etc/php5/fpm/php.ini geändert

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =

Speichern Sie die Datei und beenden Sie sie. Jetzt müssen wir die Standardkonfigurationsdatei der Website durch eine benutzerdefinierte ersetzen, die für die Bereitstellung einer Symfony-Anwendung geeignet ist. Erstellen Sie eine Sicherungskopie der aktuellen Standard-Website-Konfiguration.

cd /etc/apache2/sites-available
sudo mv 000-default.conf default-bkp.conf

Erstellen Sie eine neue Datei, um die alte zu ersetzen.

sudo nano /etc/apache2/sites-available/000-default.conf

Fügen Sie den folgenden Inhalt in die Datei ein.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>

   DocumentRoot /var/www//web
   <Directory /var/www//web>
       AllowOverride None
       Order Allow,Deny
       Allow from All

       <IfModule mod_rewrite.c>
           Options -MultiViews
           RewriteEngine On
           RewriteCond %{REQUEST_FILENAME} !-f
           RewriteRule ^(.*)$ app.php [QSA,L]
       </IfModule>
   </Directory>

   # uncomment the following lines if you install assets as symlinks
   # or run into problems when compiling LESS/Sass/CoffeScript assets
   # <Directory /var/www/project>
   #     Options FollowSymlinks
   # </Directory>

   ErrorLog /var/log/apache2/symfony_error.log
   CustomLog /var/log/apache2/symfony_access.log combined
</VirtualHost>

Wenn Sie einen Domainnamen verwenden, um auf Ihren Server zuzugreifen, anstatt nur auf die IP-Adresse zuzugreifen, können Sie optional die Werte "+ ServerName " und " ServerAlias ​​+" wie unten gezeigt definieren. Wenn nicht, können Sie sie weglassen.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>



   DocumentRoot /var/www/todo-symfony/web
. . .

Speichern Sie die Datei und beenden Sie sie. Wir müssen auch + mod_rewrite + für Apache aktivieren.

sudo a2enmod rewrite

Starten Sie Apache neu, um alle Änderungen zu übernehmen.

sudo service apache2 restart

Schritt 7 - Zugriff auf die Anwendung

Ihr Server sollte für die Bereitstellung der Demo-Symfony-Anwendung bereit sein. Besuchen Sie + http: // + in Ihrem Browser und Sie sollten eine Seite wie diese sehen:

Sie können das Formular verwenden, um neue Aufgaben zu erstellen und die Funktionalität der Anwendung zu testen.

Fazit

Das Bereitstellen einer Anwendung für die Produktion erfordert ein besonderes Augenmerk auf Details, z. B. das Erstellen eines dedizierten Datenbankbenutzers mit eingeschränktem Zugriff und das Festlegen der richtigen Verzeichnisberechtigungen für den Anwendungsordner. Diese Schritte sind erforderlich, um die Server- und Anwendungssicherheit in Produktionsumgebungen zu erhöhen. In diesem Tutorial haben wir die spezifischen Schritte gesehen, die unternommen werden müssen, um eine grundlegende Symfony-Anwendung manuell für die Produktion auf einem Ubuntu 14.04-Server bereitzustellen.