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
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
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.
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!!