GNU/Linux >> LINUX-Kenntnisse >  >> Cent OS

So installieren Sie Nginx mit PHP und MySQL (LEMP Stack) unter CentOS 7.6

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
  • 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/ 

Cent OS
  1. So installieren Sie LEMP Stack (Nginx, MySQL, PHP v7) unter CentOS 7

  2. So installieren Sie Nextcloud mit Nginx und PHP 7.3 auf CentOS 8

  3. So installieren Sie ownCloud 9.1 mit Nginx und MariaDB auf CentOS 7

  4. So installieren Sie WordPress mit HHVM und Nginx unter CentOS 7

  5. So installieren Sie Linux, Nginx, MariaDB, PHP (LEMP Stack) in CentOS 7 / RHEL 7

So installieren Sie Nginx mit PHP und MariaDB (LEMP Stack) auf Fedora 31

So installieren Sie Nginx mit PHP und MySQL (LEMP Stack) unter Ubuntu 20.04 LTS

So installieren Sie Linux, Nginx, MariaDB, PHP (LEMP Stack) auf CentOS 8 / RHEL 8

So installieren Sie Linux, Nginx, MySQL, PHP (LEMP Stack) in Ubuntu 18.04

So installieren Sie LEMP Stack (Nginx, MariaDB und PHP) auf AlmaLinux 8

So installieren Sie LEMP auf CentOS 7