Apache, PHP, Composer, MySQL
In diesem Kapitel werden wir eine Webapplikation auf Basis von PHP mit dem Laravel Framework einrichten.
Als Serverdienst könnten wir den bereits eingerichteten nginx Server (Reverse Proxy) nutzen, besser ist es jedoch, Apache als einen separaten internen Dienst dazwischen zuschalten. So lässt sich später das System einfacher umstellen oder skalieren. Außerdem behalten wir eine saubere Aufgabenverteilung bei. Wie zum Beispiel die Implementation von TLS Zertifikaten, was ja die Aufgabe des Reverse Proxy ist.
PHP gehörte eine lange Zeit zu den beliebtesten Skriptsprachen und hat besonders in den letzten Jahren drastisch an Unterstützung verloren. Obwohl PHP in Umfragen nicht gut wegkommt, ist es trotzdem noch die am häufigsten eingesetzte serverseitige Sprache für Webseiten. Das liegt vor allem daran, dass populäre CMS wie zum Beispiel Wordpress oder Typo3 in PHP geschrieben sind. Die Paketverwaltungssoftware für PHP heißt Composer, womit PHP Module von der Plattform Packagist bezogen werden.
Das Framework Laravel verwenden wir mit der relationalen Datenbank MySQL.
Die Webapplikation werde ich in dem Ordner /var/www/com.linuxserversetup.dev
anlegen. Das hatten wir bereits in Subdomain Server Block (dev) vorbereitet. Achte darauf, das an gegebener Stelle entsprechend für Dich anzupassen.
Apache installieren und zurücksetzen
Wie üblich installieren wir mit apt
Apache:
__$ sudo apt install -y apache2
Es ist wahrscheinlich, dass Fehlermeldungen aufkommen, weil der Port 80 schon von Nginx genutzt wird (Failed to start The Apache HTTP Server.
). Da wir Apache ohnehin nicht an den Port 80 binden wollen, können wir den Fehler ignorieren.
Apache legt automatisch eine Standard Seite an. Die HTML Dateien befinden sich in /var/www/html
. Wir brauchen sie eigentlich nicht, daher könnten sie auch gelöscht werden.
Ähnlich wie nginx mit Server Blöcken, arbeitet Apache mit virtuellen Hosts.
Einen virtuellen Host, auch VHOST genannt, hat Apache bereits angelegt. Dieser ist in der Konfigurationsdatei /etc/apache2/sites-available/000-default.conf
definiert und reagiert auf den Port 80
.
__$ less /etc/apache2/sites-available/000-default.conf
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Das wollen wir natürlich nicht, da wir bereits Nginx als Reverse Proxy mit dem Port 80 verbunden haben. Wir deaktivieren den virtuellen Host, indem wir mit dem Apache Befehl a2dissite
die symbolische Verknüpfung von /etc/apache2/sites-enabled/000-default.conf
zur Konfigurationsdatei aufheben.
Um den Befehl an richtiger Stelle ausführen zu können, wechseln wir in das Verzeichnis /etc/apache2/sites-enabled
:
__$ cd /etc/apache2/sites-enabled/
Dann deaktivieren wir die Seite bzw. den virtuellen Host:
__$ sudo a2dissite 000-default.conf
Wir fügen einen Port 3600
in der /etc/apache2/ports.conf
hinzu. Dieser wird später für unsere Laravel Applikation verantwortlich sein. Den Standard Port 80
müssen wir deaktivieren, also kommentieren wir den einfach aus:
__$ sudo nano /etc/apache2/ports.conf
Die Datei /etc/apache2/ports.conf
sollte dann so aussehen:
Auszug aus /etc/apache2/ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
#Listen 80
Listen 3600
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Speichern und schließen (STRG+s
, STRG+x
).
Wir starten Apache neu, damit die Änderungen übernommen werden:
__$ sudo systemctl restart apache2
Falls Apache wegen vorherigem Fehler noch gar nicht lief, starten wir Apache regulär:
__$ sudo systemctl start apache2
Zur kontrolle können wir den Status von Apache abfragen. Es sollte active (running)
angezeigt werden:
__$ sudo systemctl status apache2
Ob Apache an den Port 3600
gebunden ist, können wir mit folgendem Befehl herausfinden:
__$ sudo lsof -i -P | grep LISTEN
Die Ausgabe ist eine Liste aller Netzwerkdienste (-i
) und deren Port Bindung (-P
). Apache mit dem Port 3600
sollte hier bei sein:
...
apache2 13045 root 6u IPv6 125158 0t0 TCP *:3600 (LISTEN)
apache2 27619 www-data 6u IPv6 125158 0t0 TCP *:3600 (LISTEN)
...
www-data Rechte vergeben
Es wird später zu einem Zugriffsproblem kommen, da Apache und tom
Zugriff auf das Webverzeichnis benötigen. Mit der Apache wurde eine neue Gruppe www-data
erzeugt, die wir uns zu Nutze machen.
Als erstes nehmen wir tom
mit usermod
in die Gruppe www-data
auf. Anstelle des Benutzernamens, verwenden wir einfach die Variable $USER
, die für den aktuellen Benutzer steht.
__$ sudo usermod -a -G www-data $USER
Damit das Verzeichnis /var/www/com.linuxserversetup.dev
für Apache zugänglich ist, ändern wir dessen Gruppenzugehörigkeit mit chgrp
auf www-data
.
__$ sudo chgrp -R www-data /var/www/com.linuxserversetup.dev
Durch die gemeinsame Gruppe www-data
können beide an dem Webdateien arbeiten.
Virtuellen Host anlegen
Für unser Webprojekt legen wir einen neuen virtuellen Host an. Diesem werden wir den internen Port 3600
zuordnen und auch das Wurzelverzeichnis zum Webprojekt hinterlegen. In meinem Fall ist das /var/www/com.linuxserversetup.dev/public
.
Den public
Ordner gibt es noch nicht, ist aber mit mkdir
schnell erstellt:
__$ mkdir /var/www/com.linuxserversetup.dev/public
Das Apache Modul mod_rewrite
aktivieren wir mit a2enmod
:
__$ sudo a2enmod rewrite
Für den VHOST legen wir als erstes eine Konfigurationsdatei an. Der Name soll entsprechend der Konvention in "umgekehrter Schreibweise" (com.linuxserversetup.dev.conf
) sein:
__$ sudo nano /etc/apache2/sites-available/com.linuxserversetup.dev.conf
In dieser Datei definieren wir den virtuellen Host wie folgt:
/etc/apache2/sites-available/com.linuxserversetup.conf
<VirtualHost *:3600>
ServerName dev.linuxserversetup.com
DocumentRoot /var/www/com.linuxserversetup.dev/public
<Directory /var/www/com.linuxserversetup.dev/public>
Options -Indexes +FollowSymLinks
AllowOverride all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Aktivieren lässt sich das, indem wir im Verzeichnis /etc/apache2/sites-available
eine symbolische Verknüpfung anlegen. Dazu wechseln wir erst dort hin:
__$ cd /etc/apache2/sites-available/
Die Seite aktivieren wir mit dem Befehl a2ensite
:
__$ sudo a2ensite com.linuxserversetup.dev.conf
Damit die Änderungen wirksam werden muss Apache die Konfiguration neu einlesen:
__$ sudo systemctl reload apache2
Apache2 Log Dateien
Die beiden Log Dateien, deren Pfad per Variable im virtuellen Host definert sind, liegen in der Regel unter /var/log/apache2/
.
Das Zugriffsprotokoll:
__$ sudo tail -f /var/log/apache2/access.log
Das Fehlerprotokoll:
__$ sudo tail -f /var/log/apache2/error.log
PHP installieren
Zusätzlich zum php
Modul, installieren wir noch weitere Hilfspakete:
libapache2-mod-php
ist für die Zusammenarbeit mit Apache wichtig.
php-mysql
brauchen wir für das Zusammenspiel mit MySQL.
- Mit
php-cli
(PHP Command Line Interface) lässt sich PHP über die Kommandozeile ausführen.
- Composer Pakete entpacken sich durch
unzip
.
phpunit
ist ein Werkzeug zur Überprüfung von PHP Skripten.
__$ sudo apt install -y php libapache2-mod-php php-mysql php-cli phpunit unzip
Composer 2 installieren
Composer ist der Paketmanager für PHP Module. Darüber werden wir auch später Laravel beziehen.
Es macht Sinn Composer nur für den aktuellen Benutzer zu installieren. Als Installationsort bietet sich ~/.local/bin
unter Home dafür an. Erstellen wir den Pfad zur Sicherheit, falls dieser nicht existieren sollte:
__$ mkdir -p ~/.local/bin
Und wechseln dort hin:
__$ cd ~/.local/bin
Anschließend laden wir Composer über eine Installationsdatei herunter:
__$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
__$ php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
__$ php composer-setup.php
__$ php -r "unlink('composer-setup.php');"
Damit sich composer
als Befehl von einem beliebigen Ort ausführen lässt, setzen wir einen Alias in die Datei ~/.bash_aliases
:
__$ echo 'alias composer="php ~/.local/bin/composer.phar"' >> ~/.bash_aliases
Und lassen die Bash Konfigurationsdatei vom System neu einlesen:
__$ source ~/.bashrc
Mit Composer können Module global installiert werden, die dann Systemweit genutzt werden können. Da wir Composer nur für tom
eingerichtet haben, sollten wir mit global show
überprüfen, wie der Ablageort für globale Pakete eingestellt ist:
__$ composer global show
Der Pfad /home/tom/.config/composer
sollte in der Ausgabe erwähnt sein:
Composer could not find a composer.json file in /home/tom/.config/composer
Datenbank in MySQL erstellen
Die Datenbank MySQL haben wir bereits in dem Kapitel MySQL installieren eingerichtet.
Daher können wir jetzt einfach die MySQL Konsole aufrufen:
__$ sudo mysql
Einen neuen Datenbank Benutzer tom
erzeugen, der nur lokal und nicht remote agieren kann. Das Passwort soll Beispielhaft tom123
lauten, was mit IDENTIFIED BY
gesetzt wird:
__gt CREATE USER 'tom'@'localhost' IDENTIFIED BY 'tom123';
Eine neue Datenbank laraveldb
anlegen:
__gt CREATE DATABASE laraveldb;
Dem Benutzer tom
Zugriffsrechte auf die zuvor angelegte Datenbank einräumen:
__gt GRANT ALL PRIVILEGES ON laraveldb.* TO 'tom'@'localhost';
Um sicher zu gehen, dass Änderungen übernommen werden, lassen wir die neuen Privilegien mit FLUSH PRIVILEGES
neu einlesen:
__gt FLUSH PRIVILEGES;
Die MySQL Konsole können wir mit exit
wieder verlassen:
__gt exit