Server Installation · 10 min read · Oct 04, 2025
Wie man Nginx mit PHP und MySQL (LEMP-Stack) auf CentOS 7.6 installiert

Dieses Tutorial zeigt, wie Sie Nginx auf einem CentOS 7-Server mit PHP-Unterstützung (über PHP-FPM) und MySQL (MariaDB) installieren können.
Was ist LEMP?
Nginx (ausgesprochen “engine x”) ist ein kostenloser, Open-Source, leistungsstarker HTTP-Server. Nginx ist bekannt für seine Stabilität, umfangreiche Funktionen, einfache Konfiguration und geringen Ressourcenverbrauch.
LEMP-Voraussetzungen
In diesem Tutorial werde ich den Hostnamen server1.example.com mit der IP-Adresse 192.168.1.100 verwenden. Diese Einstellungen können bei Ihnen abweichen, daher müssen Sie sie gegebenenfalls anpassen.
Ich werde den Nano-Editor in diesem Tutorial verwenden, um Konfigurationsdateien zu bearbeiten. Nano kann wie folgt installiert werden.
yum -y install nanoIch empfehle, eine Firewall installiert zu haben. Wenn Sie firewalld noch nicht installiert haben und eine Firewall verwenden möchten, installieren Sie sie mit diesen Befehlen:
yum -y install firewalldStarten Sie die Firewall und aktivieren Sie sie, damit sie beim Booten gestartet wird.
systemctl start firewalld.service
systemctl enable firewalld.serviceÖffnen Sie als Nächstes Ihren SSH-Port, um sicherzustellen, dass Sie sich per SSH mit dem Server verbinden können.
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --reloadAktivieren zusätzlicher CentOS-Repositories
Die neueste Nginx-Version ist nicht in den offiziellen CentOS-Repositories verfügbar, daher fügen wir das Repository des Nginx-Projekts hinzu, um es zu installieren:
nano /etc/yum.repos.d/nginx.repo[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1MySQL (MariaDB) installieren
Zuerst installieren wir MariaDB als MySQL-Ersatz. MariaDB ist ein kostenloser Fork von MySQL. Führen Sie diesen Befehl in der Shell aus, um den MariaDB-Datenbankserver zu installieren:
yum -y install mariadb mariadb-server net-toolsDann erstellen wir die Systemstartlinks für MariaDB (damit es automatisch startet, wenn das System bootet) und starten den MariaDB-Server:
systemctl enable mariadb.service
systemctl start mariadb.serviceÜberprüfen Sie nun, ob das Netzwerk aktiviert ist. Bitte beachten Sie, dass der MraiDB-Dienst als mysql benannt ist, da es sich um einen kompatiblen Datenbankserver handelt. Führen Sie aus:
netstat -tap | grep mysqlEs sollte etwas wie folgt angezeigt werden:
[root@server1 ~]# netstat -tap | grep mysql
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 19842/mysqld Führen Sie aus:
mysql_secure_installationum ein Passwort für den Benutzer root festzulegen (ansonsten kann jeder auf Ihre MySQL-Datenbank zugreifen!):
[root@example ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not foundHINWEIS: DAS AUSFÜHREN ALLER TEILE DIESER SCRIPTES WIRD FÜR ALLE MariaDB
SERVER IM PRODUKTIONSEINSATZ EMPFOHLEN! BITTE JEDEN SCHRITT SORGFÄLTIG LESEN!Um sich bei MariaDB anzumelden, um es zu sichern, benötigen wir das aktuelle
Passwort für den Benutzer root. Wenn Sie MariaDB gerade installiert haben und
Sie das root-Passwort noch nicht festgelegt haben, ist das Passwort leer,
Sie sollten hier einfach die Eingabetaste drücken.Geben Sie das aktuelle Passwort für root ein (für keines eingeben):
OK, Passwort erfolgreich verwendet, weiter...Das Festlegen des root-Passworts stellt sicher, dass niemand ohne die richtige
Autorisierung auf den MariaDB-root-Benutzer zugreifen kann.Root-Passwort festlegen? [Y/n] <-- ENTER
Neues Passwort: <-- yourrootsqlpassword
Neues Passwort erneut eingeben: <-- yourrootsqlpassword
Passwort erfolgreich aktualisiert!
Lade Berechtigungstabellen neu..
... Erfolg!Standardmäßig hat eine MariaDB-Installation einen anonymen Benutzer, der es jedem
ermöglicht, sich bei MariaDB anzumelden, ohne dass ein Benutzerkonto für
ihn erstellt werden muss. Dies ist nur für Tests gedacht und um die
Installation etwas reibungsloser zu gestalten. Sie sollten sie entfernen, bevor
Sie in eine Produktionsumgebung wechseln.Anonyme Benutzer entfernen? [Y/n] <-- ENTER
... Erfolg!Normalerweise sollte root nur von 'localhost' aus verbinden dürfen. Dies
stellt sicher, dass jemand das root-Passwort nicht über das Netzwerk erraten
kann.Fernzugriff auf root verbieten? [Y/n] <-- ENTER
... Erfolg!Standardmäßig kommt MariaDB mit einer Datenbank namens 'test', auf die jeder
zugreifen kann. Dies ist ebenfalls nur für Tests gedacht und sollte
entfernt werden, bevor Sie in eine Produktionsumgebung wechseln.Testdatenbank und Zugriff darauf entfernen? [Y/n] <-- ENTER
- Löschen der Testdatenbank...
... Erfolg!
- Entfernen der Berechtigungen für die Testdatenbank...
... Erfolg!Das Neuladen der Berechtigungstabellen stellt sicher, dass alle bisher
getätigten Änderungen sofort wirksam werden.Berechtigungstabellen jetzt neu laden? [Y/n] <-- ENTER
... Erfolg!Aufräumen...Alles erledigt! Wenn Sie alle oben genannten Schritte abgeschlossen haben, sollte
Ihre MariaDB-Installation jetzt sicher sein.Danke, dass Sie MariaDB verwenden!
[root@example ~]#[root@server1 ~]# mysql_secure_installation
Nginx installieren
Nginx ist als Paket von nginx.org verfügbar, das wir wie folgt installieren können:
yum -y install nginxDann erstellen wir die Systemstartlinks für nginx und starten es:
systemctl enable nginx.service
systemctl start nginx.serviceEs besteht die Möglichkeit, dass Sie eine Fehlermeldung erhalten, dass Port 80 bereits verwendet wird, die Fehlermeldung wird wie folgt aussehen:
[root@server1 ~]# service nginx start
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
ginx: [emerg] still could not bind()
[FAILED]
[root@server1 ~]#Das bedeutet, dass ein anderer Webserver (wahrscheinlich Apache) bereits auf diesem Server läuft. Stoppen Sie den Apache-Dienst und starten Sie dann den Dienst für NGINX:
systemctl stop httpd.service
yum remove httpd
systemctl disable httpd.serviceVersuchen Sie dann erneut, Nginx zu starten.
systemctl start nginx.serviceÖffnen Sie die HTTP- und HTTPS-Ports in der Firewall
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reloadDie resultierende Ausgabe in der Shell sieht wie folgt aus:
[root@example ~]# firewall-cmd --permanent --zone=public --add-service=http
erfolg
[root@example ~]# firewall-cmd --permanent --zone=public --add-service=https
erfolg
[root@example ~]# firewall-cmd --reload
erfolg
[root@example ~]#Geben Sie die IP-Adresse oder den Hostnamen Ihres Webservers in einen Browser ein (z. B. http://192.168.1.100), und Sie sollten die Nginx-Startseite sehen:

PHP installieren
Wir können PHP 5 mit Nginx über PHP-FPM (FastCGI Process Manager) zum Laufen bringen. PHP-FPM ist eine alternative PHP-FastCGI-Implementierung mit einigen zusätzlichen Funktionen, die für Websites jeder Größe nützlich sind, insbesondere für beschäftigte Websites. Wir können php-fpm zusammen mit php-cli und einigen PHP5-Modulen wie php-mysql installieren, die Sie benötigen, wenn Sie MySQL aus Ihren PHP-Skripten verwenden möchten:
yum -y install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-mbstring php-xml php-xmlrpc php-mbstring php-snmp php-soapAPC ist ein kostenloser und offener PHP-Opcode-Cache zum Cachen und Optimieren von PHP-Zwischencode. Es ist ähnlich wie andere PHP-Opcode-Caches wie eAccelerator und Xcache. Es wird dringend empfohlen, einen dieser Caches zu installieren, um Ihre PHP-Seite zu beschleunigen.
Ich werde APC aus dem PHP-pecl-Repository installieren. PECL erfordert, dass die CentOS-Entwicklungstools installiert sind, um das APC-Paket zu kompilieren.
yum -y install php-devel
yum -y groupinstall 'Development Tools'und installieren Sie APC:
pecl install apc[root@example ~]# pecl install apc
downloading APC-3.1.13.tgz ...
Starting to download APC-3.1.13.tgz (171,591 bytes)
.................done: 171,591 bytes
55 source files, building
running: phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
Enable internal debugging in APC [no] : <-- ENTER
Enable per request file info about files used from the APC cache [no] : <-- ENTER
Enable spin locks (EXPERIMENTAL) [no] : <-- ENTER
Enable memory protection (EXPERIMENTAL) [no] : <-- ENTER
Enable pthread mutexes (default) [no] : <-- ENTER
Enable pthread read/write locks (EXPERIMENTAL) [yes] : <-- ENTER
building in /var/tmp/pear-build-rootVrjsuq/APC-3.1.13
......Öffnen Sie dann /etc/php.ini und setzen Sie cgi.fix_pathinfo=0:
nano /etc/php.ini[...]
; cgi.fix_pathinfo bietet *echte* PATH_INFO/PATH_TRANSLATED-Unterstützung für CGI. PHP's
; vorheriges Verhalten war es, PATH_TRANSLATED auf SCRIPT_FILENAME zu setzen und nicht zu verstehen,
; was PATH_INFO ist. Für weitere Informationen zu PATH_INFO siehe die cgi-Spezifikationen. Das Setzen
; dieses Wertes auf 1 bewirkt, dass PHP CGI seine Pfade an die Spezifikation anpasst. Ein Wert
; von null bewirkt, dass PHP sich wie zuvor verhält. Standard ist 1. Sie sollten Ihre Skripte
; so ändern, dass sie SCRIPT_FILENAME anstelle von PATH_TRANSLATED verwenden.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...](Bitte lesen Sie http://wiki.nginx.org/Pitfalls, um herauszufinden, warum Sie dies tun sollten.)
und fügen Sie die Zeile hinzu:
[...]
extension=apc.soam Ende der Datei /etc/php.ini.
Zusätzlich sollten Sie, um Zeitzonenfehler wie
[28-Juni-2016 14:21:01] PHP Warning: phpinfo(): Es ist nicht sicher, sich auf die Zeitzoneneinstellungen des Systems zu verlassen. Sie sind *verpflichtet*, die date.timezone-Einstellung oder die date_default_timezone_set()-Funktion zu verwenden. Falls Sie eine dieser Methoden verwendet haben und immer noch diese Warnung erhalten, haben Sie wahrscheinlich den Zeitzonenbezeichner falsch geschrieben. Wir haben 'Europe/Berlin' für 'CEST/2.0/DST' ausgewählt in /usr/share/nginx/html/info.php in Zeile 2… in /var/log/php-fpm/www-error.log, wenn Sie ein PHP-Skript in Ihrem Browser aufrufen, die date.timezone in /etc/php.ini setzen:
[...]
[Date]
; Definiert die Standardzeitzone, die von den Datumsfunktionen verwendet wird
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]Sie können die richtige Zeitzone für Ihr System herausfinden, indem Sie ausführen:
cat /etc/sysconfig/clock
[root@server1 nginx]# cat /etc/sysconfig/clock
ZONE=”Europe/Berlin”
[root@server1 nginx]#
Erstellen Sie als Nächstes die Systemstartlinks für php-fpm und starten Sie es:
systemctl enable php-fpm.service
systemctl start php-fpm.servicePHP-FPM ist ein Daemon-Prozess (mit dem Init-Skript /etc/init.d/php-fpm), der einen FastCGI-Server auf Port 9000 ausführt.
Nginx konfigurieren
Die Nginx-Konfiguration befindet sich in /etc/nginx/nginx.conf, die wir jetzt öffnen:
nano /etc/nginx/nginx.confZuerst (dies ist optional) können Sie die Anzahl der Worker-Prozesse erhöhen und den keepalive_timeout auf einen angemessenen Wert setzen:
[...]
worker_processes 4;
[...]
keepalive_timeout 2;
[...]Die virtuellen Hosts sind in server {}-Containern im Verzeichnis /etc/nginx/conf.d definiert. Lassen Sie uns den Standard-vhost (in /etc/nginx/conf.d/default.conf) wie folgt ändern:
nano /etc/nginx/conf.d/default.conf[...]
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
#error_page 404 /404.html;
# Umleitungsserverfehlerseiten zur statischen Seite /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# Proxy die PHP-Skripte an Apache, der auf 127.0.0.1:80 hört
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# Übergeben Sie die PHP-Skripte an den FastCGI-Server, der auf 127.0.0.1:9000 hört
#
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Zugriff auf .htaccess-Dateien verweigern, falls das Dokumentenverzeichnis von Apache
# mit dem von nginx übereinstimmt
#
location ~ /\.ht {
deny all;
}
}servername ; macht dies zu einem Standard-Catchall-vhost (natürlich können Sie hier auch einen Hostnamen wie www.example.com angeben).
Im location /-Teil habe ich index.php zur Indexzeile hinzugefügt. root /usr/share/nginx/html; bedeutet, dass das Dokumentenverzeichnis das Verzeichnis /usr/share/nginx/html ist.
Der wichtige Teil für PHP ist die location ~ .php$ {}-Stanza. Kommentieren Sie es aus, um es zu aktivieren. Ändern Sie die root-Zeile in das Dokumentenverzeichnis der Website (z. B. root /usr/share/nginx/html;). Bitte beachten Sie, dass ich die Zeile try_files $uri =404; hinzugefügt habe, um Zero-Day-Exploits zu verhindern (siehe http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP und http://forum.nginx.org/read.php?2,88845,page=3). Bitte stellen Sie sicher, dass Sie die fastcgi_param-Zeile in fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ändern, da der PHP-Interpreter sonst das PHP-Skript, das Sie in Ihrem Browser aufrufen, nicht finden kann ( $document_root wird in /usr/share/nginx/html übersetzt, da wir das als unser Dokumentenverzeichnis festgelegt haben).
PHP-FPM hört standardmäßig auf Port 9000 auf 127.0.0.1, daher sagen wir Nginx, dass es sich mit 127.0.0.1:9000 verbindet, mit der Zeile fastcgi_pass 127.0.0.1:9000;. Es ist auch möglich, PHP-FPM einen Unix-Socket verwenden zu lassen - ich werde dies in Kapitel 7 beschreiben.
Jetzt speichern Sie die Datei und laden Nginx neu:
systemctl restart nginx.serviceErstellen Sie nun die folgende PHP-Datei im Dokumentenverzeichnis /usr/share/nginx/html…
nano /usr/share/nginx/html/info.phpJetzt rufen wir diese Datei in einem Browser auf (z. B. http://192.168.1.100/info.php):

Wie Sie sehen, funktioniert PHP 5, und es funktioniert über FPM/FastCGI, wie in der Server-API-Zeile angezeigt. Wenn Sie weiter nach unten scrollen, sehen Sie alle Module, die bereits in PHP5 aktiviert sind, einschließlich des MySQL-Moduls:

PHP-FPM dazu bringen, einen Unix-Socket zu verwenden
Standardmäßig hört PHP-FPM auf Port 9000 auf 127.0.0.1. Es ist auch möglich, PHP-FPM einen Unix-Socket verwenden zu lassen, um den TCP-Overhead zu vermeiden. Um dies zu tun, öffnen Sie /etc/php-fpm.d/www.conf…
nano /etc/php-fpm.d/www.conf… und lassen Sie die Listenzeile wie folgt aussehen:
[...]
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sock
[...]Laden Sie dann PHP-FPM neu:
systemctl restart php-fpm.serviceGehen Sie als Nächstes durch Ihre Nginx-Konfiguration und alle Ihre vhosts und ändern Sie die Zeile fastcgi_pass 127.0.0.1:9000; in fastcgi_pass unix:/tmp/php5-fpm.sock;, z. B. so:
vi /etc/nginx/conf.d/default.conf[...]
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[...]Laden Sie schließlich Nginx neu:
systemctl restart nginx.serviceLaden Sie diesen CentOS 7-Server als virtuelle Maschine herunter
Dieses Setup ist als Download einer virtuellen Maschine im OVA/OVF-Format (kompatibel mit VMWare und Virtualbox) für Howtoforge-Abonnenten verfügbar.
Anmeldedaten für die VM
- Das Root-Passwort lautet: howtoforge
- Das Passwort des “Administrator”-Benutzers lautet: howtoforge
Bitte ändern Sie beide Passwörter beim ersten Login.
- Die IP-Adresse der VM ist 192.168.1.100
Links
- nginx: http://nginx.org/
- nginx Wiki: http://wiki.nginx.org/
- PHP: http://www.php.net/
- PHP-FPM: http://php-fpm.org/
- MySQL: http://www.mysql.com/
- CentOS: http://www.centos.org/
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.