Vollständigen Webserver installieren (nginx, mysql, php7, HTTP2, phpmyadmin, SSL) – Ubuntu 16.04

Diese Anleitung bezieht sich auf Ubuntu 16.04, die anderen Versionen werde ich später erstellen.
1. Nginx Installation Zuerst aktualisieren wir die Repos:
sudo apt-get update
Dann installieren wir nginx:
sudo apt-get install nginx
Danach überprüfen wir die nginx-Version mit dem folgenden Befehl:
nginx -v
Wenn wir mindestens Version 1.10.0 erhalten, ist alles in Ordnung.
2. MySQL Installation Der erste Schritt ist die Installation des MySQL-Servers:
sudo apt-get install mysql-server
Natürlich muss das Passwort für den Root-Benutzer eingegeben werden, mit dem ihr künftig auf MySQL zugreifen möchtet. Damit die PHP-Seiten ausgeführt werden können, müsst ihr PHP Version 5 und den dazugehörigen MySQL-Befehlssatz installieren:
sudo apt-get install php-fpm php-mysql
Um die Sicherheit zu erhöhen, sollte man die Funktion deaktivieren, bei der PHP, wenn es die referenzierte Datei nicht findet, die ähnlichste Datei ausführt:
sudo nano /etc/php/7.0/fpm/php.ini
Man muss den Teil suchen, wo cgi.fix_pathinfo steht, das Semikolon (;) davor entfernen, den Wert auf 0 setzen und alles speichern.
cgi.fix_pathinfo=0
Um das Upload-Limit festzulegen, muss die Zeile upload_max_filesize gesucht und der Wert auf den gewünschten Wert geändert werden (Megabyte=M, Gigabyte:G)
upload_max_filesize = 1G
Um das Download-Limit festzulegen, muss die folgende Zeile gesucht und geändert werden:
post_max_size = 1G
Wenn wir damit fertig sind, speichern wir die Datei und starten php-fpm neu:
sudo systemctl restart php7.0-fpm
3. Nginx konfigurieren Die Standard-Konfigurationsdatei können wir so bearbeiten:
sudo nano /etc/nginx/sites-available/default
Die Datei sollte standardmäßig in etwa so aussehen:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
}Bei normalem HTTP ändern wir die Datei wie folgt:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/webseite;
index index.php index.htm index.nginx-debian.html;
server_name webseiten_adresse;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ /\.ht {
deny all;
}
}Bei HTTPS (SSL) und HTTP2 ändern wir die Datei wie folgt (wenn ihr kein SSL-Zertifikat habt, findet ihr weiter unten eine Anleitung, wie ihr kostenlos eines für ein Jahr erhalten könnt):
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /var/www/webseite;
index index.php index.html index.htm;
server_name webseiten_adresse;
location / {
try_files $uri $uri/ /index.php?$args;
}
# Angabe des Speicherorts der SSL-Dateien, wenn sie mit letsencrypt erstellt wurden
ssl on;
ssl_certificate /etc/letsencrypt/live/webseiten_adresse/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/webseiten_adresse/privkey.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
# Angabe der dh-Parameter wie unten beschrieben
ssl_dhparam {Pfad zur dhparams.pem-Datei};
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
server {
listen 80;
listen [::]:80;
server_name webseiten_adresse;
return 301 https://$server_name$request_uri;
}Die Datei muss gespeichert werden und dann nginx neu gestartet werden:
sudo service nginx restart
4. PHPMyAdmin Installation Das Paket kann so installiert werden:
sudo apt-get install phpmyadmin
Bei der Installation wird nach dem Passwort des MySQL-Root-Benutzers gefragt, gebt es ein. Die nächste Frage ist das Passwort für das phpmyadmin-Root-Konto. Gebt es ein und bestätigt es, wenn es danach verlangt wird. Danach muss, um phpmyadmin auch von eurer Webseite aus erreichbar zu machen, ein symbolischer Link erstellt werden:
sudo ln -s /usr/share/phpmyadmin /var/www/webseite/phpmyadmin
Danach könnt ihr phpmyadmin auf eurer Webseite erreichen:
http://meinewebsite.hu/phpmyadmin
5. SSL-Zertifikat beantragen
Falls ihr noch kein SSL-Zertifikat besitzt, ist eine gute Lösung dafür der Dienst von StartSSL, bei dem ihr für 1 Jahr auf 5 Domains beantragen könnt. (danach könnt ihr es erneut beantragen) – AKTUALISIERUNG: StartSSL hat im Januar 2018 den Betrieb eingestellt, stattdessen empfehle ich Let’s Encrypt.
5.1 Let’s Encrypt SSL beantragen
Let’s Encrypt SSL können wir mit Certbot beantragen, den wir wie folgt installieren und verwenden können:
sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install python-certbot-nginx
Wenn wir damit fertig sind, führen wir Certbot im manuellen Zertifikatserstellungsmodus aus (wir möchten nicht, dass er unsere schön erstellte nginx-Konfigurationsdatei verändert)
sudo certbot --nginx certonly
Der Prozess ist ziemlich selbsterklärend, wir müssen unsere E-Mail-Adresse sowie die Domain-Adresse angeben, für die wir das SSL-Zertifikat beantragen möchten. Wenn wir damit fertig sind, zeigt er das Ablaufdatum und den Speicherort der Zertifikatsdatei an:
/etc/letsencrypt/live/webseiten_adresse/
Die nginx-Konfiguration erstellen wir gemäß Punkt 3 unter Einfügen der bereits vorhandenen Dateinamen.
5.2 Überprüfung der SSL-Verbindung
Es ist ratsam zu überprüfen, ob die SSL-Nutzung auf dem Webserver ordnungsgemäß eingerichtet wurde, was wir auf der Webseite https://www.ssllabs.com/ssltest/analyze.html tun können.
Wenn ihr damit fertig seid, sollte alles hervorragend funktionieren 🙂