Wie man Nginx mit PHP und MySQL (LEMP Stack) auf CentOS 7 installiert

5 Installation von PHP

Wir können PHP 5 mit Nginx durch 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, insbesondere für geschäftigere Websites, nützlich sind. 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 wollen:

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 zur Optimierung von PHP-Zwischencode. Es ähnelt anderen PHP-Opode-Cachern, wie eAccelerator und Xcache. Es wird dringend empfohlen, eine davon zu installieren, um Ihre PHP-Seite zu beschleunigen.

Ich werde APC aus dem PHP pecl Repository installieren. PECL setzt voraus, dass die Centos Development Tools installiert sind, um das APC-Paket zu erstellen.

yum -y install php-devel
yum -y groupinstall 'Development Tools'

und installieren Sie den 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 werden zur Vermeidung von Zeitzonenfehlern wie z.B.

[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 es ausführen:

Katze /etc/sysconfig/clock

[[email protected] nginx]# cat /etc/sysconfig/clock
ZONE=“Europe/Berlin“
[[email protected] nginx]#

Als nächstes erstellen Sie die Systemstartup-Links für php-fpm und starten sie:

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

PHP-FPM ist ein Daemon-Prozess (mit dem Initskript /etc/init.d/php-fpm), der einen FastCGI-Server auf Port 9000 betreibt.

6 Nginx konfigurieren

Die nginx-Konfiguration befindet sich in /etc/nginx/nginx/nginx.conf, die wir jetzt öffnen:

nano /etc/nginx/nginx.conf

Zuerst (dies ist optional) können Sie die Anzahl der Arbeitsprozesse erhöhen und den 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;
    }
}

server_name _; macht dies zu einem Standard-Catchall-Vhost (natürlich kannst du hier auch einen Hostnamen wie www.example.com angeben).

Im Ort / Teil habe ich index.php zur Indexzeile hinzugefügt. root /usr/share/nginx/html; bedeutet, dass die Dokumentenwurzel das Verzeichnis /usr/share/nginx/html ist.

Der wichtige Teil für PHP ist der Standort ~ \.php$ {} stanza. Entkommentiere es, um es zu aktivieren. Ändern Sie die Root-Zeile in die Dokumenten-Root 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 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 übersetzt in /usr/share/nginx/html, weil wir das als Dokumentenstamm eingestellt haben).

PHP-FPM lauscht standardmäßig auf Port 9000 auf 127.0.0.0.1, deshalb sagen wir Nginx, dass sie sich mit 127.0.0.0.1:9000 mit der Zeile fastcgi_pass 127.0.0.0.1:9000; verbinden soll. Es ist auch möglich, PHP-FPM einen Unix-Socket verwenden zu lassen – 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 Dokumentenstamm /usr/share/nginx/html…..

nano /usr/share/nginx/html/info.php
<?php
phpinfo();
?>

Nun rufen wir diese Datei in einem Browser (z.B. http://192.168.1.100/info.php) auf:

Die PHP-Info von unserem nginx-Server.

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

Der MySQL-Treiber wurde in PHP aktiviert.

7 PHP-FPM dazu bringen, einen Unix-Socket zu verwenden.

Standardmäßig lauscht PHP-FPM auf Port 9000 auf 127.0.0.0.0.1. Es ist auch möglich, PHP-FPM einen Unix-Socket verwenden zu lassen, der den TCP-Overhead vermeidet. Öffnen Sie dazu /etc/php-fpm.d/www.conf…

nano /etc/php-fpm.d/www.conf

…. und lassen Sie die Hörleitung 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

Als nächstes durchsuchst du deine Nginx-Konfiguration und alle deine Vhosts und änderst die Zeile fastcgi_pass 127.0.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;
    }
[...]

Schließlich laden Sie Nginx neu:

systemctl restart nginx.service

Das könnte dich auch interessieren …