Dieses Tutorial zeigt, wie Sie Nginx auf einem CentOS 7-Server mit PHP-Unterstützung (über PHP-FPM) und MySQL (MariaDB)-Unterstützung installieren können.
Was ist LEMP?
Nginx (ausgesprochen „Engine x“) ist ein kostenloser, hochleistungsfähiger Open-Source-HTTP-Server. Nginx ist bekannt für seine Stabilität, seinen umfangreichen Funktionsumfang, seine einfache Konfiguration und seinen geringen Ressourcenverbrauch.
LEMP-Voraussetzungen
In diesem Tutorial verwende ich den Hostnamen server1.example.com mit der IP-Adresse 192.168.1.100. Diese Einstellungen können für Sie abweichen, daher müssen Sie sie gegebenenfalls ersetzen.
Ich werde den Nano-Editor in diesem Tutorial verwenden, um Konfigurationsdateien zu bearbeiten. Nano kann so installiert werden.
yum -y install nano
Ich empfehle die Installation einer Firewall. Wenn Sie noch keine Firewall installiert haben und eine Firewall verwenden möchten, installieren Sie sie mit diesen Befehlen:
yum -y install firewalld
Starten Sie die Firewall und aktivieren Sie sie so, dass 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 --reload
Zusätzliche CentOS-Repositories aktivieren
Das neueste Nginx ist nicht in den offiziellen CentOS-Repositories verfügbar, daher schließen wir das Repository des Nginx-Projekts ein, 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=1
Installieren von MySQL (MariaDB)
Zuerst installieren wir MariaDB als MySQL-Ersatz. MariaDB ist ein kostenloser Fork von MySQL. Führen Sie diesen Befehl auf der Shell aus, um den MariaDB-Datenbankserver zu installieren:
yum -y install mariadb mariadb-server net-tools
Dann erstellen wir die Systemstart-Links für MariaDB (so dass es automatisch startet, wenn das System hochfährt) 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 mysql heißt, da es sich um einen kompatiblen Datenbankserver handelt. Ausführen
netstat -tap | grep mysql
Es sollte etwa so aussehen:
[[email protected] ~]# netstat -tap | grep mysql
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 19842/mysqld
Ausführen:
mysql_secure_installation
um ein Passwort für den Benutzer root festzulegen (ansonsten kann jeder auf Ihre MySQL-Datenbank zugreifen!):
[[email protected] ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] <-- ENTER
New password: <-- yourrootsqlpassword
Re-enter new password: <-- yourrootsqlpassword
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] <-- ENTER
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] <-- ENTER
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] <-- ENTER
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] <-- ENTER
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
[[email protected] ~]#
[[email protected] ~]# mysql_secure_installation
Installation von Nginx
Nginx ist als Paket von nginx.org erhältlich, das wir wie folgt installieren können:
yum -y install nginx
Dann erstellen wir die Systemstartlinks für nginx und starten es:
systemctl enable nginx.service
systemctl start nginx.service
Es besteht die Möglichkeit, dass Sie eine Fehlermeldung erhalten, dass Port 80 bereits verwendet wird. Die Fehlermeldung lautet wie folgt:
[[email protected] ~]# service nginx start
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[FAILED]
[[email protected] ~]#
Das bedeutet, dass auf diesem Server bereits ein anderer Webserver (wahrscheinlich Apache) 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.service
Versuchen Sie dann, Nginx erneut 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 --reload
Die resultierende Ausgabe auf der Shell sieht folgendermaßen aus:
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[[email protected] ~]# firewall-cmd --reload
success
[[email protected] ~]#
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 Willkommensseite von Nginx sehen:
Installation von PHP
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 stark frequentierte 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 wie folgt 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-soap
APC ist ein kostenloser und offener PHP-Opcode-Cacher zum Caching und Optimieren von PHP-Zwischencode. Es ähnelt anderen PHP-Opcode-Cachern wie eAccelerator und Xcache. Es wird dringend empfohlen, eines davon zu installieren, um Ihre PHP-Seite zu beschleunigen.
Ich werde APC aus dem PHP-Pecl-Repository installieren. PECL erfordert die Installation der Centos Development Tools, um das APC-Paket zu kompilieren.
yum -y install php-devel
yum -y groupinstall 'Development Tools'
und installieren Sie APC:
pecl install apc
[[email protected] ~]# 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 provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; 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.so
am Ende der Datei /etc/php.ini.
Darüber hinaus, um Zeitzonenfehler wie
zu vermeiden[28-June-2016 14:21:01] PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in /usr/share/nginx/html/info.php on line 2
... in /var/log/php-fpm/www-error.log wenn Sie ein PHP-Skript in Ihrem Browser aufrufen, sollten Sie date.timezone in /etc/php.ini:
setzen[...] [Date] ; Defines the default timezone used by the date functions ; 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 Folgendes ausführen:
cat /etc/sysconfig/clock
[[email protected] nginx]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"
[[email protected] 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.service
PHP-FPM ist ein Daemon-Prozess (mit dem Init-Skript /etc/init.d/php-fpm), der einen FastCGI-Server auf Port 9000 ausführt.
Konfigurieren von Nginx
Die nginx-Konfiguration befindet sich in /etc/nginx/nginx.conf, die wir jetzt öffnen:
nano /etc/nginx/nginx.conf
Zuerst (dies ist optional) können Sie die Anzahl der Worker-Prozesse erhöhen und das keepalive_timeout auf einen vernünftigen Wert setzen:
[...] worker_processes 4; [...] keepalive_timeout 2; [...]
Die virtuellen Hosts sind in Server-{}-Containern im Verzeichnis /etc/nginx/conf.d definiert. Ändern wir den Standard-vhost (in /etc/nginx/conf.d/default.conf) wie folgt:
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; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # 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; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # 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).
In der Position / Teil habe ich index.php zur Indexzeile hinzugefügt. root /usr/share/nginx/html; bedeutet, dass der Dokumentenstamm das Verzeichnis /usr/share/nginx/html ist.
Der wichtige Teil für PHP ist die Zeile location ~ \.php$ {}. Kommentieren Sie es aus, um es zu aktivieren. Ändern Sie die Root-Zeile in das Document Root der Website (z. B. root /usr/share/nginx/html;). Bitte beachten Sie, dass ich die Zeile try_files $uri =404; um Zero-Day-Exploits zu verhindern (siehe http://wiki.nginx.org/Pitfalls#Passing_Unkontrollierte_Requests_to_PHP und http://forum.nginx.org/read.php?2,88845,page=3). Bitte stellen Sie sicher, dass Sie die Zeile fastcgi_param in fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name ändern; denn sonst findet der PHP-Interpreter das PHP-Skript, das Sie in Ihrem Browser aufrufen, nicht ($document_root bedeutet übersetzt /usr/share/nginx/html, weil wir das als unser Dokument-Root festgelegt haben).
PHP-FPM lauscht standardmäßig auf Port 9000 auf 127.0.0.1, daher weisen wir Nginx an, sich mit 127.0.0.1:9000 mit der Zeile fastcgi_pass 127.0.0.1:9000; zu verbinden. Es ist auch möglich, PHP-FPM dazu zu bringen, einen Unix-Socket zu verwenden - ich werde dies in Kapitel 7 beschreiben.
Speichern Sie nun die Datei und laden Sie Nginx neu:
systemctl restart nginx.service
Erstellen Sie nun die folgende PHP-Datei im Dokumentenstammverzeichnis /usr/share/nginx/html...
nano /usr/share/nginx/html/info.php
<?php phpinfo(); ?>
Nun nennen wir diese Datei in einem Browser (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 gezeigt. 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 lauscht PHP-FPM auf Port 9000 auf 127.0.0.1. Es ist auch möglich, PHP-FPM dazu zu bringen, einen Unix-Socket zu verwenden, wodurch der TCP-Overhead vermieden wird. Öffnen Sie dazu /etc/php-fpm.d/www.conf...
nano /etc/php-fpm.d/www.conf
... und lass die Listen-Zeile 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.service
Gehen Sie als Nächstes Ihre Nginx-Konfiguration und alle Ihre vhosts durch und ändern Sie die Zeile fastcgi_pass 127.0.0.1:9000; zu 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 zum Schluss Nginx neu:
systemctl restart nginx.service
Laden 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 bei der ersten Anmeldung.
- Die IP-Adresse der VM lautet 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/