Webseiten konfigurieren mit nginx

Fast 50% der Top 10.000 Webseiten (Stand 2017) laufen mittlerweile mit nginx als Webserver. Apache2 dankt nach ca. 20 Jahren nach und nach ab. Das liegt daran, dass nginx mit weniger Ressourcen eine bessere Performance erreicht. Leider ist es aber auch bei weitem nicht so Benutzerfreundlich. Ich muss aber dazu sagen, dass 2-3 Stunden Einarbeitung genügen sollten, um die grundlegende Funktion des Multihosting und die ersten Eindrücke in nginx, zu meistern. Zum Einstieg möchte ich euch durch ein Tutorial führen, womit Ihr jederzeit Webseiten zum laufen bekommt. Was ich persönlich super interessant finde, nginx verwendet keine .htaccess, alle Kofigurationen werden direkt in der nginx config geschrieben. Die default findet ihr unter /etc/nginx/sites-available/.

Doch bevor ihr euch dran wagt, versichert euch nochmal ob alle module von apache2 deinstalliert sind. Das ist dringend nötig, da sich sonst nginx nicht installieren lässt.

apt-get purge apache2 "weitere Module"
apt-get install nginx

In den nächsten zwei Beispielen zeige ich einmal die unterschiede zu der default config und einer von mir erstellten config für eine Webseite, wo ein WordPress darauf läuft. Im Anschluss erkläre ich noch kurz, was und wieso ich es geändert habe. Doch bevor ihr sie editiert, macht euch zuerst einmal eine Kopie der Datei, welche ihr unter /etc/nginx/sites-available/ findet.

cp default example

default config

server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass PHP scripts to FastCGI server
#
#location ~ \.php$ {
# include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
# fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

example config

server {

listen 80;

root /var/www/example;

# Add index.php to the list if you are using PHP
index index.php;

server_name example.de www.example.de;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

#location /wp-admin {
#auth_basic "WordPress Login sichern";
#auth_basic_user_file /etc/nginx/.htpasswd;
#}

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

#Unterverzeichnisse verlinken (permalinks)
if (!-e $request_filename){
rewrite ^(.*)$ /index.php break;
}
}

Die rot markierten Stellen, zeigen an, wo ihr eure config auf euch speziell einrichten müsst.

Die blaue Stelle, wenn sie nicht auskommentiert ist, lässt euer Log-in mit Benutzername und Passwort verschlüsseln, sodass euer WordPress gegenüber Brute Force Attacken sicherer ist. Dafür müsst ihr eine Datei mit Benutzername und verschlüsseltem Password in dem angegebenen Verzeichnis erstellen, einen Generator dafür findet ihr hier.

Der grün markierte Teil ist noch eine Einstellung, welche nicht standardmäßig gegeben ist. Ihr müsst dafür unter /etc/nginx/ die Datei fastcgi_params editieren, es muss aber lediglich eine Zeile ergänzt werden.

$ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Das Ganze sollte dann so aussehen:


nginx fastcgi include

Nun habt ihr den nginx so weit konfiguriert, in der nginx.conf (findet ihr unter /etc/nginx/) steht (standardmäßig in Linie 62/86) aber nun noch ein include /etc/nginx/sites-enabled/*, d.h. bisher weiß euer nginx noch gar nicht, dass etwas geändert wurde und was es damit machen soll. Deshalb wechselt ihr in das Verseichnis /etc/nginx/sites-enabled/ und erstellt einen symbolischen Link, mit Hilfe folgendem Befehl:

ln -s ../sites-available/example example

Nun nicht vergessen das der nginx service, nach jeder neuen Einstellung, neugestartet werden muss!

service nginx reload

Wenn eure Webseite ein SSL Zertifikat hat und ihr sie nur unter https ereichbar machen wollt

Falls ihr nicht wisst, wie ihr ein kostenloses Zertifikat für eure Webseite bekommt, schaut doch mal hier vorbei.

Dafür müsst ihr eure config ein bisschen anpassen. Ihr könnt den oberen teil bis " root /var/www/*" durch folgenen Teil ersetzten:

server {

listen 80;
server_name englert.one www.englert.one;

#location ^~ /.well-known/acme-challenge/ {
#Wird bei autorenew von Let's Encrypt benötigt, dafür auskommentieren
#root /var/www/html/englert/;
#}

location / {
# enforce https
return 301 https://$server_name$request_uri;
}
}

server {

listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.de/privkey.pem;
ssl_session_timeout 5m;

ssl_protocols TLSv1.2 TLSv1.2 TSLv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;