Nginx PHP und MySQL unter Ubuntu installieren und einen Vhost aufsetzen

Zum Entwickeln von PHP-Anwendungen braucht man auch unter Linux einen Webserver. Ich habe jahrelang Apache genutzt, aber ich bin mittlerweile ein Fan von Nginx geworden, den ich tatsächlich schön einfach finde. Hier also mal eine Installation von Nginx, PHP-FPM und Mysql / MariaDB.

Installation der Software

Grundsätzlich brauchst du erstmal alle benötigten Programme, aktualisiere also erstmal dein System. Unter Ubuntu (20.04) funktioniert das so.

sudo apt update && sudo apt upgrade

Installiere nun nginx, php und mariadb

sudo apt install nginx php-fpm mariadb-server

Konfiguration der Software

MySQL / MariaDB

MariaDB ist ein Fork von MySQL vom original MySQL-Team. Es ist in der Syntax komplett kompatibel und wird auch aktiv und schnell weiterentwickelt.

sudo mysql_secure_installation

Das Shellskript löscht Demodaten, man kann ein Root-Passwort festlegen und einstellen, dass der Server von aussen zum Beispiel nicht unbedingt erreichbar ist, sondern lediglich Daten an den Webserver übergibt. Die Ausgabe sieht so aus.


Example:
localhost:# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Anlegen eines Benutzers für Webprojekte

Hier lege ich einen Benutzer an, der zwar nicht root ist, aber dennoch alle Rechte hat. Für die Entwicklung ist das super. In Livesystemen würde ich diese Rechte aber nicht so hinterlegen!!!

Wir starten MySQL als root

sudo mysql

Nachdem wir nun in der MySQL-Shell sind, legen wir uns einen Benutzer an. Die einfachen Anführungszeichen sind Pflicht und diese darfst du nicht vergessen.

Dem User geben wir nun alle möglichen Rechte. (Ja, keine gute Praxis in Livesystemen. Aber wir wollen ja nur lokal Zeugs entwickeln). Im Grunde genommen erstellst du hier einen neuen Root-Benutzer.

Anschließend laden wir die Benutzerrechte neu:

Nginx konfigurieren

Virtual Host anlegen (Konfiguration nginx)

Moderne Webanwendungen laufen geiler in einer Vhost-Umgebung. Für jedes Projekt kann man so einen eigenen virtuellen Server festlegen. Wir nennen unser Projekt mal terminkalender und legen uns eben diesen Host an. Dazu wechseln wir in das Verzeichnis unserer Websites.

cd /etc/nginx/sites-available/

Wir erstellen eine Konfiguration in diesem Verzeichnis

sudo nano terminkalender.conf

In diese Datei schreiben wir folgendes rein.


server {
    listen 80;
    server_name terminkalender;
    root /var/www/terminkalender/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Unter server_name haben wir festgelegt, dass nginx den Server terminkalender nennen soll. Die Dateien für unseren Terminkalender befinden sich unter /var/www/terminkalender/public. Die add_header-Direktiven legen fest, dass unsere Seite nicht in einem Frame eingebunden werden kann und in location haben wir bestimmt, dass jeder Request durch einen Front-Controller namens index.php durchgeschleift wird. Die hier angelegte Konfiguration funktioniert also für Laravel ziemlich gut.

Unter location ~ .php haben wir definiert, dass alles durch unsere PHP-Version (hier PHP7.4) verarbeitet werden soll. Alles, was außerhalb des root des Webprojekts aufgerufen wird, wird verweigert (deny all)

VHOST eintragen

Unser Ubuntu muss nun noch wissen, dass terminkalender unter der IP 127.0.0.1 zu finden ist.

sudo nano /etc/hosts

in die letzte Zeile schreiben wir

127.0.0.1   terminkalender

Seite erstellen

Zuerst erstellen wir die Seite index.php im entsprechenden Verzeichnis

sudo mkdir /var/www/terminkalender/
sudo mkdir /var/www/terminkalender/public
sudo touch /var/www/terminkalender/public/index.php

Spaßeshalber können wir in die index.php auch einen PHP-Befehl reischreiben.

Seite liveschalten

Wir setzen einen symbolischen Link von sites-available nach sites-enabled. So haben wir die Möglichkeit, Projekte auch schnell mal abzuschalten, indem wir die Datei aus sites-enabled wieder rausnehmen

sudo ln -s /etc/nginx/sites-available/terminkalender.conf /etc/nginx/sites-enabled/terminkalender.conf

Anschließend starten wir den nginx-Server neu

sudo systemctl restart nginx.service

Rechte setzen

Die Installation ist ziemlich einfach und man hat mit wenigen Schritten einen lauffähigen Webserver. Falls man hier mit Laravel-Projekten arbeiten möchte und gleichzeitig noch am Code herumschrauben muss, sollte man dem Ordner /var/www/terminkalender mit Lese/Schreibrechten auf die Nerven gehen und den Benutzer ändern:

sudo chown -R www-data:www-data /var/www/terminkalender/

Jetzt kann der Webserver lustig in den Dateien schreiben. Du selbst aber nicht. Also lege deinen User noch in die Gruppe www-data

sudo usermod -a -G www-data $USER

Anschließend legst du noch Schreib-/Leserechte fest. Für Dateien:

sudo find /var/www/terminkalender -type f -exec chmod 644 {} \;

Für Ordner

sudo find /var/www/terminkalender -type d -exec chmod 755 {} \;

Fazit

Die Installation ist relativ simpel, wenn man die Befehle weiß. Klar - ein Setup.exe eines Xampp scheint erstmal einfacher zu sein, aber wer will denn schon einfach, wenn man auch was dabei lernen kann?!

Photo by Marc PEZIN on Unsplash


Dir gefällt, was du liest? Dann lass mir doch eine Spende da :) Paypal