LEMP Stack unter CentOS 7

Nginx wird auch mal poetisch als der “unsinkbare Webserver” bezeichnet. Dank des ThreadPools kann er viele TCP-Verbindungen (auch sehr langsame wie die von Smartphones) bei geringer Systembelastung gleichzeitig bedienen.
Für den produktiven Einsatz sollten Sie berücksichtigen, dass Apache WAF (Web Application Firewall) besser als Nginx unterstützt. Eine gute Wahl wäre NgInx als Reverse Proxy mit Apache Backend, um High Performance mit Features zu verbinden. Dies stellen wir in einer separeten Anleitung online.
Bei der Erstellung dieses Artikels wurden die einzelnen Schritte auf einem Rackhansa VPS (Virtual Private Server) getestet. Diese Anleitung wurde zuletzt unter CentOS 7.4 mit SELINUX=enforcing getestet.

1. Vorbereitungen

a) Firewall: Ältere Centos-7 Minor Releases hat die Firewall für IPV4 aber nicht für IPV6 standardmäßig aktiviert, aus Sicherheitsgründen sollten dies unbedingt überprüfen.
Für das Centos-Template haben wir in /root zwei Shell-Skripte für Sie vorbereitet. Bitte revidieren Sie unsere Skripte oder verwenden Sie eine Firewall-Software Ihrer Wahl. Bitte stellen Sie sicher, dass Port 80 für diese Anleitung offen ist:

 # IPV4 - Check mit
iptables -n -L -v
# IPV6 - Check mit
ip6tables -n -L -v 

b) Systemupdate:

 yum update 

c) Apache belegt bereits Port 80. Seit CentOS 7.4 wird Apache nicht mehr vorinstalliert. Sie können Apache folgendermaßen deinstallieren:

 # Apache Deinstallieren
yum remove httpd 

Oder Apache wird auf einen anderen Port umkonfiguriert, damit nginx später auf Port 80 seine Dienste anbieten kann. Editieren Sie die Datei /etc/httpd/conf/httpd.conf und ändern Sie die Zeile mit „listen“ wie folgt:

 # SELinux: 8008 ist eine der zulässigen Ports
# Oder mit semange können alles auflisten und andere Port frei schalten
listen 8008; 

Apache neu starten:

 service httpd restart 

2. Installation MySQL Server

Centos hat den Maria-DB im Repos. Dieser Server ist ein Dropin-Ersatz und in vielen Punkten schneller als der MySQL-Server. Die Installation verläuft ganz simpel mit:

 yum install mariadb-server mariadb

systemctl enable mariadb
systemctl start mariadb 

Sichern Sie Ihre SQL-Instanz. Das DB-Root-Passwort ist noch nicht gesetzt, geben Sie das leere Passwort mit „Enter“ ein und setzen Sie ein neues SQL-Root-Passwort. Alle anderen Fragen kann man mit „Yes“ beantworten.

 /usr/bin/mysql_secure_installation 

3. Installation NGINX

Variante 1: EPEL-Release – brauchen wir ohnehin wegen PHPMyAdmin

yum install epel-release
yum install nginx
systemctl enable nginx
service nginx restart

Variante 2: Laden Sie die yum Konfigurationsdatei mit dem PGP Public-key herunter. Sie bekommen eine Warnung, dass diese rpm nicht signiert ist. Die Signatur der Nginx-Pakete werden bei der Installation jedoch überprüft.

 wget nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
rpm -i nginx-release-centos-7-0.el7.ngx.noarch.rpm 

Variant 3: Editeren Sie die neue Datei /etc/yum.repos.d/nginx.repo mit folgendem Inhalt wie von der nginx-Homepage angegeben (die Signatur der Nginx-Pakete wird bei der Installation nicht überprüft):

 [nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1 

Dann die Installation von nginx mit:

 yum install nginx 

Jetzt ist Port 80 nicht mehr belegt und wir können den Nginx-Server starten:

 systemctl enable nginx
service nginx restart 

Test: Mit ifconfig können Sie die Adresse Ihres Servers anzeigen lassen. Mit einem Browser rufen Sie http://meine-ip-adressse/ auf (oder Sie stellen sicher, dass Ihre DNS-Einstellungen korrekt sind und verwenden http://www.meine-domain.de/ anstelle der IP-Adresse) und werden mit der folgenden Nachricht begrüßt:

 # Screen Shot hier einsetzten (Bootstrap formatierte Seite)
Welcome to nginx! 

ngninx für die Zusammenarbeit mit php5-fpm konfigurieren:
Ändern Sie den Block in /etc/nginx/nginx.conf wie folgt, danach muss der nginx neu gestartet werden.

    server {
	listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

	error_page 404 /404.html;
            location = /40x.html {
        }

	error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
	location ~ .php$ {
                try_files $uri =404;
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
    }

Nginx muss neu gestartet werden:

 service nginx restart 

4. PHP

Für php5-fpm müssen nur ganz wenig Pakete angegeben werden, der Rest wird über Abhängigkeiten geregelt:

 yum install php php-mysql php-fpm 

Konfiguration: cgi.fix_pathinfo ist standardmäßig auf 1 gesetzt. Dies kann unter Umständen zu einer Sicherheitslücke führen. Entsprechende Hinweise finden Sie als Kommentar in der Konfigurationsdatei php.ini. Editieren Sie die Datei /etc/php.ini und suchen Sie die Zeile mit cgi.fix_pathinfo heraus und ändern Sie diese wie folgt:

 cgi.fix_pathinfo=0 

php5-fpm sollte bereits mit dem schnellen Unix Socket laufen. Editieren Sie die Datei /etc/php-fpm.d/www.conf wie folgt:

 # listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock 

php5-fpm muss nur noch gestartet werden:

 systemctl enable php-fpm.service
systemctl start php-fpm 

PHP-Info Page
Editieren Sie eine neue Datei:nano /var/www/html/info.php mit folgendem Inhalt:

< ?php phpinfo(); ?> // Bitte Leerzeichen vor ?php löschen!

Test: Mit einem Browser rufen Sie http://meine-ip-adressse/info.php auf. Die Ausgabe von info.php sollte wie folgt aussehen (Die PHP-Version ist vom Installationszeitpunkt abhängig):

5. PHPMyAdmin

Es ist einfach angenehmer mit einer graphischen Oberfläche Ihren Datenbankserver verwalten zu können. Allerdings darf man die Sicherheit nicht außer Acht lassen. Im Folgenden wird PHPMyAdmin so installiert, dass Sie nur noch auf localhost darauf zugreifen können und Ihre Datenbank somit vor Angriffen aus dem Internet geschützt ist. Für einen gelegentlichen Zugriff auf Ihre Datenbank ist der Aufbau eines SSH-Tunnels viel komfortabler als das Hantieren mit SQL-Befehlen.
Zuerst führen wir die Installation mit einer Standard-Konfiguration für apache2 durch, damit PHPMyAdmin für sich selbst die notwendigen MySQL-Tabellen anlegen kann.

 yum install epel-release
yum install phpmyadmin 

Die Installation wird nun abgeschlossen. Die Installation enthält eine Apache-Konfigurationsdatei, die bereits korrekt angeordnet ist. PHPMyAdmin ist nun nur noch lokal zugreifbar, was wir aber auch beabsichtigen. Konfigurationsdetails können Sie in /etc/httpd/conf.d/phpMyAdmin.conf nachprüfen.
Port 9000 ist von SELinux zugelassenen Port (mit semanage kann zugelassene Port auflisten oder frei schalten).
Falls Sie sich für die Deinstallation von Apache entschieden haben, wird noch eine nginx-Konfigurationsdatei benötigt. Editieren Sie die neue Datei /etc/nginx/conf.d/phpmyadmin.conf mit folgenden Inhalt (danach muss nginx neu gestartet werden, siehe oben):

 server {
    listen       localhost:9000;
    server_name  localhost;

    index  index.html index.htm index.php;
    root   /usr/share/phpMyAdmin;
    location / {
           try_files $uri $uri/ =404;
    }


    location ~ .php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
    }
} 

Für den Zugriff brauchen wir noch den SSH-Tunnel:

 # Einen neuen Benutzer anlegen
# Zum Testen reicht ja ein starkes Passwort, in Produktion sollten Sie ssh-login mit Passwort verbieten.
useradd -m test
passwd test

# Falls Sie unter Windows arbeiten, können Sie z.B. putty für den Tunnelaufbau verwenden.

# SSH-Tunnel (ersetzen Sie www.meine-domain.tld mit dem richtigen Hostname oder IP-Adresse)
ssh -fCN test@www.meine-domain.tld  -L 9000:localhost:9000

# Die Option des obigen Befehls:
# -f :  ssh wird als Hintergrundprozess gestartet
# -N : kein remote command wird ausgeführt 
# -C : Datenkompression wird eingeschaltet
# 9000:localhost:9000 : der entfernte TCP-Port 9000 wird mit localhost:9000 verbunden. 

Nginx muss neu gestartet werden:

service nginx restart
service php-fpm restart

URL Ihrer PHPMyAdmin mit NgInx-Server: http://localhost:9000/
Ihr Server ist jetzt für echte Applikationen bereit.