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.