Linux Server setup

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