CentOS 7 – NGINX und php-fpm

Diese Tutorial bezieht sich auf CentOS 7. Voraussetzung ist ein aktiviertes Epel Repository. Die Einrichtung unterscheidet sich nicht großartig von denen anderer Distributionen und kann auch dort als Beispiel dienen.

Die Einrichtung wird am Beispiel der Domain tutorial.der-linux-admin.de erklärt. Diese muss dann natürlich durch die passende Domain ersetze werden.

Installation von NGINX

Zuerst installieren wir den Webserver NGINX. Falls wir den aktuellen NGINX aus den NGINX-Repository installieren wollen gibt es eine passende Anleitung im meinem Artikel NGINX aus dem NGINX-Repository installieren.

yum install nginx

Nun aktivieren wir NGINX für den automatischen Start und Starten den Dienst.

systemctl enable nginx
systemctl start nginx

Falls firewalld auf unserem System läuft können wir mit folgenden Befehlen die Ports 80 und 443 in der Firewall freischalten.

firewall-cmd --add-service=http
firewall-cmd --permanent --add-service=http

firewall-cmd --add-service=https
firewall-cmd --permanent --add-service=http

NGINX sollte nun von extern erreichbar sein und eine Default-Webseite ausliefern.

Pool-User für php-fpm anlegen

Prozessübersicht mit Usern von php-fpm
Prozessübersicht mit Usern von php-fpm

Dann erstellen wir einen User unterdem die PHP-Prozesse bzw der php-fpm-Pool ausgeführt wird. Dazu erstellen wir eine Verzeichnis für das Documentroot und stecken den User auch gleich in die Gruppe nginx.

mkdir -p /var/www/tutorial.der-linux-admin.de/
useradd -d /var/www/tutorial.der-linux-admin.de -g nginx tutorial.der-linux-admin.de

Anschliessend passen wir die Berechtigungen des Verzeichnisses an.

chown tutorial.der-linux-admin.de:nginx /var/www/tutorial.der-linux-admin.de
chmod 775 /var/www/tutorial.der-linux-admin.de

Php-fpm installieren und konfigurieren

Nun installieren wir php-fpm und CLI für PHP mit yum.

yum install php-fpm php-cli

Dann kopieren wie die Konfiguration für den default Pool in unsere Konfiguration. Diese werden wir dann späte anpassen.

cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/tutorial.der-linux-admin.de.conf

Um zu verhindern, dass der default Pool nach einem Update wieder angelegt wird fügen wir in jeder Zeile ein „;“ ein. Damit bleibt die Datei erhalten ist aber komplett wirkungslos da nun alle Zeilen Kommentare sind. Wenn wir diese Datei einfach löschen kann es passieren das ein Update wieder die default Konfiguration für den [www] – Pool aktiviert.

sed -i -e 's/^/;/' /etc/php-fpm.d/www.conf

Nun können wie unsere fpm-Pool Konfiguration anpassen.

vi /etc/php-fpm.d/tutorial.der-linux-admin.de.conf

Als erstes setzen wir den Namen des Pools.

; Start a new pool named 'www'.
[tutorial.der-linux-admin.de]

Anschliessend definieren wie ob der Pool per Port oder per Socket abgesprochen werden soll. In diese Konfiguration geschieht dies über den Socket unter /var/run/php-fpm/tutorial.der-linux-admin.de.sock.

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/tutorial.der-linux-admin.de.sock

Als User wählen wir unsere dafür angelegten Benutzer und die passende Gruppe. So laufen alle php-Prozesse dieses Pools unter diesem User.  Alle von PHP erzeugten Dateien werden dann auch mit dieser Berechtigung angelegt.

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
;user = apache
user = tutorial.der-linux-admin.de
; RPM: Keep a group allowed to write in log dir.
;group = apache
group = nginx

Anschliessend editieren wie noch die php.ini.

vi /etc/php.ini

Dort setzen wir cgi.fix_pathinfo = 0.

; 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://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0

Zum Schluss starten wir php-fpm neu um unsere Einstellungen zu aktivieren. Php-fpm fügen wir dabei noch dem automatischen Systemstart hinzu.

systemctl restart php-fpm
systemctl enable php-fpm

NGINX vHost für php-fpm erstellen

Nun müssen wir noch den passende vHost in der Konfiguration von NGINX anlegen. Dazu erstellen wir eine Datei.

vi /etc/nginx/conf.d/zz-tutorial.der-linux-admin.de.conf

In diesem vHost weisen wir NGINX an alle .php Dateien per fastcgi an den php-fpm Pool weiterzugeben.

server {
    listen       80;
    server_name  tutorial.der-linux-admin.de;

    root   /var/www/tutorial.der-linux-admin.de;

    index index.php index.html index.htm;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
        }

        location ~ \.php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                fastcgi_intercept_errors on;
                fastcgi_pass unix:/var/run/php-fpm/tutorial.der-linux-admin.de.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }


}

Nachdem wir die Datei gespeichert haben führen wir einen Konfigurationstest durch,

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Wenn dabei keine Fehler gemeldet wurden können wir NGINX neu starten.

systemctl restart nginx

Nun legen wir im Documentroot eine kleine Testdatei an.

vi /var/www/tutorial.der-linux-admin.de/index.php

Wir rufen die Infoseite zu php auf.

<?php
        phpinfo();

Anpassen der Rechte nicht vergessen.

chown tutorial.der-linux-admin.de:nginx /var/www/tutorial.der-linux-admin.de/index.php
Testseite für php-fpm mit nginx
Testseite für php-fpm mit NGINX

Wenn alles richtig konfiguriert ist sollte eine solche Ausgabe beim Aufruf der URL erfolgen.

Nach diesem Muster kann man für weitere Domains verfahren. Es ist sicher, auch aus Sicherheitsgründen, sinnvoll für jede Domain einen extra Pool mit einem extra User zu definieren. So können die verschiedenen Pools getrennt konfiguriert werden. Dazu lassen wir die einfach auf verschiednen Sockets laufen und weisen diese im vHost zu. Auch verschiedene php-Versionen sind so möglich. Eventuell behandle ich dies in einen nachfolgenden Tutorial.

Wie immer lohnt ein Blich in die Dokumentation von php-fpm und NGINX.

Ein Kommentar

  1. Hi dear colleague!!
    Thanks a lot for your your post, it have been for me very useful!!
    I am trying to follow it but I have a question. After I create the config for php-fpm and when I want to start php-fpm (systemctl restart php-fpm), I get:
    May 29 09:28:56 cmps-jr.flx.bn systemd[1]: Starting The PHP FastCGI Process Manager…
    May 29 09:28:56 cmps-jr.flx.bn php-fpm[9802]: [29-May-2019 09:28:56] ALERT: [pool cmps-jr.flx.bn] user has not been defined
    May 29 09:28:56 cmps-jr.flx.bn php-fpm[9802]: [29-May-2019 09:28:56] ERROR: failed to post process the configuration
    May 29 09:28:56 cmps-jr.flx.bn php-fpm[9802]: [29-May-2019 09:28:56] ERROR: FPM initialization failed
    May 29 09:28:56 cmps-jr.flx.bn systemd[1]: php-fpm.service: main process exited, code=exited, status=78/n/a
    May 29 09:28:56 cmps-jr.flx.bn systemd[1]: Failed to start The PHP FastCGI Process Manager.
    May 29 09:28:56 cmps-jr.flx.bn systemd[1]: Unit php-fpm.service entered failed state.
    May 29 09:28:56 cmps-jr.flx.bn systemd[1]: php-fpm.service failed.

    This is part of the config file:
    ; The address on which to accept FastCGI requests.
    ; Valid syntaxes are:
    ; ‚ip.add.re.ss:port‘ – to listen on a TCP socket to a specific IPv4 address on
    ; a specific port;
    ; ‚[ip:6:addr:ess]:port‘ – to listen on a TCP socket to a specific IPv6 address on
    ; a specific port;
    ; ‚port‘ – to listen on a TCP socket to all addresses
    ; (IPv6 and IPv4-mapped) on a specific port;
    ; ‚/path/to/unix/socket‘ – to listen on a unix socket.
    ; Note: This value is mandatory.
    ;listen = 127.0.0.1:9000
    listen = /var/run/php-fpm/cmpowersite.socket

    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user’s group
    ; will be used.
    ; RPM: apache user chosen to provide access to the same directories as httpd
    ;;user = apache
    user = tcdeveloper
    ; RPM: Keep a group allowed to write in log dir.
    ;group = apache
    group = tcdeveloper

    Thanks a lot for your support!!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.