Umstieg von Apache auf Nginx

Bereits in der letzten Woche habe ich Nginx vorgestellt. Auch ich bin vor Kurzem mit meinem vServer umgezogen. Nachdem ich zuvor Apache genutzt hatte, ist jetzt Ngnix („Engine X“ gesprochen) das laufende System.

In diesem Artikel möchte ich Dir erklären, wie Du reibungslos auf Nginx umsteigen kannst.

Hinweis: Dieser Artikel setzt Linux-Grundkenntnisse und eine bestehende SSH-Verbindung zu deinem Server voraus. Außerdem empfiehlt es sich in jedem Fall ein Backup anzulegen!

Pakete installieren

Vorab ein kurzer Hinweis. Je nachdem ob Du bei deinem Server per SSH als root oder einfacher Benutzer angemeldet bist, kann es notwendig sein den nachfolgenden Befehlen ein „sudo“ voranzustellen.

Zunächst aktualisieren wir die Paket-Quellen:

apt-get update

Anschließend installieren wir die Pakete Nginx und PHP-FPM:

apt-get install nginx php5-fpm

Solltest Du die Meldung zu Gesicht bekommen, dass eines der Pakete nicht gefunden werden kann, dann mache folgendes, wenn Du Debian verwendest.

Öffne die Datei /etc/apt/sources.list (z.B. durch vim /etc/apt/sources.list) und fügende folgende Zeilen hinzu (Debian Wheezy 7):

deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all

Für Debian Squeeze:

deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all

Anschließend wird die Datei durch den entsprechenden Befehl (bei vim: :wq) gespeichert.

Nun können die beiden obersten Befehle erneut nacheinander ausgeführt werden.

Virtuelle Hosts einrichten

Nun kommen wir zu dem wichtigsten Teil. Du musst Nginx mitteilen, welche Websites er wie bedienen soll.

Dafür spielt der Ordner /etc/nginx/sites-enabled/ eine wichtige Rolle. Alle Dateien, die sich in diesem Ordner befinden, können sogenannte virtuelle Host-Einträge beinhalten.

Du wirst, wenn Du nun einmal nachschaust, in dem Ordner bereits eine Datei finden, die den Namen default trägt. Dort enthalten sind bereits einige auskommentierte (# vor der Zeile) Beispiele, die dir zeigen sollen, wie die virtuellen Hosts funktionieren.

Hier nun mal ein Beispiel für eine solche vHost-Datei:

server {
        listen [::]:80; # IPv4/IPv6 für den Standard-Port 80 (http)

        server_name  *.domain.com;

        root /home/www/domain; # Verzeichnis, in dem die Dateien lagern
        index index.php; # Index-Datei

        access_log  /home/www/nginx/domain.access.log; # Pfad zum Zugriffslog (bitte beachten: so werden alle IPs mitgespeichert)

        error_page 404 /404.html; # 404-Fehler-Seite festlegen

        client_max_body_size 100M; # Maximale Größe, die ein Request haben darf (M=MegaByte), für einen Datei-Upload hoch einstellen

        # Entfernt ::ffff: (Problem, da sowohl IPv4/IPv6 beachtet wird)
        set $remote_addr_new $remote_addr;
        if ($remote_addr ~* ^::ffff:(.*)) {
                set $remote_addr_new $1;
        }

        # trifft in jedem Fall zu, durch "/"
        location / {
                # Prüft, ob Datei/Ordner existiert, sonst wird zum Beispiel /umstieg-von-apache-auf-nginx/ intern nach index.php?url=/umstieg-von-apache-auf-nginx/ umgeleitet, sehr praktisch, auch als "virtuelle Ordner" bekannt
                try_files $uri $uri/ /index.php?url=$uri&$args;
        }

        # "geheimen" Ordner vor Außen-Zugriff verstecken
        location /images/geheim {
                deny all;
        }

        # Leitet PHP-Abfrage auf einen Socket um, passt IP-Adresse an, siehe oben, und gibt einen Fehler aus, wenn die Datei nicht existiert (!-f ...)
        location ~ \.php$ {
                if (!-f $document_root$fastcgi_script_name){
                        return 404;
                }

                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;

                include fastcgi_params;
                fastcgi_param  REMOTE_ADDR  $remote_addr_new;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }

        # sperrt eventuell noch vorhandene htaccess-Dateien
        location ~ /\.ht {
                deny  all;
        }
}

Dieses Beispiel zeigt, denke ich, recht anschaulich die Möglichkeiten von Nginx. Du kannst natürlich auch noch eigene Statements innerhalb des server-Blocks (pro server-Block ein virtueller Host) definieren.

Außerdem solltest Du alle Code-Teile überprüfen und deinen Bedürfnissen anpassen (z.B. domain.com ersetzen). Möchtest Du mehr über Nginx und die vHost-Konfiguration lesen, so schau einmal hier vorbei.

Bitte beachte auch, dass Nginx keine .htaccess-Dateien kennt. Alle Regeln müssen innerhalb dieses Blocks definiert werden. Du kannst einen .htaccess-Converter verwenden, um den Code von Apache zu Nginx zu übersetzen. Im Idealfall machst Du das jedoch selbst.

PHP-FPM konfigurieren

PHP-FPM arbeitet gut mit Nginx zusammen. Zunächst muss es dafür allerdings korrekt konfiguriert werden.

Folgendes Statement sollte entweder in der allgemeinen php.ini (/etc/php5/fpm/php.ini) oder zum Beispiel in der user.ini (/etc/php5/fpm/conf.d/user.ini) zu finden sein:

cgi.fix_pathinfo=0

Wenn das der Fall ist, und zwar nicht auskommentiert (also kein Zeichen zu Beginn der Zeile vor dem Statement), kann es weiter gehen.

Wir richten nun den Socket ein, mit dem PHP-FPM und Nginx arbeiten sollen. Das haben wir bei Nginx bereits über die Server-Konfiguration (siehe oben) getan. Öffne nun die Datei /etc/php5/fpm/pool.d/www.conf. Und sorge dafür, dass folgendes listen-Statement (vorhandene ggf. überschreiben) in der Datei steht:

listen = /var/run/php5-fpm.sock

Starten & Altlasten aufräumen

Sobald Du alle obrigen Schritte durchgeführt hast, kannst Du nun zunächst überprüfen, ob Deine Nginx-Konfiguration korrekt ist:

service nginx configtest

Eventuelle Fehler sollten behoben werden. Anschließend kann der Apache-Dienst beendet werden:

service apache2 stop

In diesem Moment ist deine Website nicht mehr erreichbar. Wir fahren also schnell fort und starten Nginx und PHP-FPM neu:

service nginx restart
service php5-fpm restart

Für den Fall, dass bei dem Nginx-Neustart Fehler angezeigt werden, solltest Du deine vHost-Dateien schleunigst bearbeiten (Websites nicht erreichbar), die Fehler beheben und anschließend zum Beispiel über

service nginx force-reload

die Nginx-Konfiguration neu laden.

Klappt alles wie es soll? Dann kannst Du jetzt Apache entfernen. Finde zunächst die entsprechenden Pakete:

dpkg --get-selections | grep apache

Anschließend kannst Du sie entfernen lassen, indem Du die Namen der Pakete durch ein Leerzeichen getrennt an den folgenden Befehl hängst:

apt-get remove paket1 paket2 paket3 ...

Nicht mehr benötigte Pakete können mit dem folgenden Konsolen-Befehl gelöscht werden:

apt-get autoremove

Du könntest nun theoretisch auch noch die PHP-Pakete überprüfen, die meisten von ihnen wirst Du aber weiterhin benötigen (z.B. php-gd & Co. funktionieren auch mit FPM). In meinem Fall konnte ich libapache2-mod-php5 php5-cgi php5-cli ohne Probleme deinstallieren.

Wenn Dir bei der Sicherheitsabfrage plötzlich alle Pakete zum Deinstallieren angeboten werden, obwohl Du dennoch nur einige ausgewählt hast, ist ein Paket – wie php5-common – darunter, welches Du weiterhin benötigst, also: abbrechen!

Sicherheit erhöhen

Wenn Du nicht möchtest, dass jeder deine Nginx-Version einsehen kann und damit über eventuelle Sicherheitslücken informiert wird, kannst Du die Versionsanzeige (läuft über einen HTTP-Header) ausblenden:

server_tokens off;

in der Datei /etc/nginx/nginx.conf und das Problem ist gelöst, nachdem Nginx neu gestartet wurde.

Fazit zum Nginx-Umzug

Wer sich nur ein wenig mit den Nginx-Grundlagen befasst, kann damit einiges umsetzen. Der Konkurrent ist nicht nur schneller als Apache, sondern auch leicht zu bedienen. Gerade mit den mächtigen server-Statements kann viel gemacht werden.

Besonders interessant ist zum Beispiel try_files, was es bei Apache so nicht gibt. Viel Spaß mit deiner Nginx-Installation und mehr Performance wünsche ich.