Tabla de Contenidos

FreeBSD-12, PHP-7.4,FPM en Nginx

FreeBSD-12.1

¿Cómo instalo instalar PHP 7.4 con FPM para el servidor web Nginx que se ejecuta en el sistema operativo FreeBSD?

Introducción

PHP es un acrónimo de “PHP: preprocesador de hipertexto”. Es un lenguaje de script de código abierto para propósitos generales. PHP es útil para el desarrollo web y para ejecutar software popular como MediaWiki, WordPress y más. PHP es fácil de aprender y le permite escribir páginas web generadas dinámicamente sobre la marcha. Esta página muestra cómo instalar PHP 7.4 en un cuadro FreeBSD v12.x Unix junto con el servidor web Nginx.

FreeBSD instala PHP 7.4 con FPM para Nginx

El procedimiento para instalar PHP 7.4 en FreeBSD es el siguiente:

  1. Actualizar el árbol de ports de FreeBSD
  2. Instale el paquete binario PHP 7.4: pkg install php74
  3. Instalar paquete binario Nginx
  4. Configurar Nginx y PHP 7.4
  5. Active el servicio PHP-fpm en FreeBSD
  6. Probar la configuración

Veamos todos los pasos en detalles.

1. Actualizando el arbol de los ports

Puede utilizar el comando `portsnap` de la siguiente manera:

# portsnap fetch update

1.1.-Una vez actualizado podemos instalar los paquetes desde los ports

PHP-7.4

# cd /usr/ports/lang/php74
# make install clean

La otra alternativa es utilizar los PKG para instalar sin compilar en la maquina local, aunque si puede es mejor compilar en la misma maquina, para instalar desde los `pkg` debemos ejecutar en un terminal:

# pkg install php74

1.2.-Instalando las extensiones de PHP 7.4

Para instalar el port, ejecute el siguiente comando y elija las extensiones requeridas:

# cd /usr/ports/lang/php74-extensions/
# make install clean

La otra alternativa es usar los `PKG`:

# pkg install php74-extensions

Otra opción es instalar extensiones PHP individuales según las necesidades de su aplicación web o proyecto de software. Se pueden buscar extensiones PHP 7.4 utilizando el comando pkg y el comando grep/egrep

pkg search php74 | egrep -i --color 'gd|mysqli|openssl|composer|json'
  
icingaweb2-module-fileshipper-php74-1.1.0_3 Import CSV, JSON, XML and YAML files for the Icinga Director
php74-composer-1.10.8          Dependency Manager for PHP
php74-gd-7.4.8                 The gd shared extension for php
php74-json-7.4.8               The json shared extension for php
php74-mysqli-7.4.8             The mysqli shared extension for php
php74-openssl-7.4.8            The openssl shared extension for php
php74-pear-MDB2_Driver_mysqli-1.5.0.b4 PEAR MySQL MDB2 driver
php74-pear-Services_JSON-1.0.3 PHP implementation of json_encode/decode
php74-pecl-crypto-0.3.1_2      Objective wrapper for OpenSSL Crypto Library
php74-pecl-json_post-1.0.2     JSON POST handler in PHP
php74-pecl-jsond-1.4.0         JavaScript Object Notation in PHP

Ahora podemos seleccionar los paquetes individuales, como ejemplo usaremos 3 de la lista:

# pkg install php74-gd php74-json php74-composer

De esta forma podemos seleccionar los paquetes individuales.

1.3.-Instalamos Nginx

Nginx

Para instalar el PKG de nginx en una terminal con privilegios de root debemos ejecutar:

# pkg install nginx

Una vez terminado tendremos instalado el servidor web con las configuraciones por defecto.

2.Configurando PHP-FPM

Edite el archivo `/usr/local/etc/php-fpm.d/www.conf` y busque la linea:

listen = 127.0.0.1:9000

Y reemplacela por:

listen = /var/run/php74-fpm.sock

Y descomente en el mismo archivo las lineas siguientes:

listen.owner = www
listen.group = www
listen.mode = 0660

Guarde y cierre el archivo. Habilitar el servicio php-fpm:

# sysrc php_fpm_enable="YES"

Puede reiniciar, arrancar, detener el servicio con los comandos:

# service php-fpm start
# service php-fpm restart
# service php-fpm stop
# service php-fpm status

3.Una nota de la Configuración de PHP-7.4

Necesita instalar el archivo php.ini usando el comando php:

# cp -v /usr/local/etc/php.ini-production  /usr/local/etc/php.ini

A continuación, vamos a asegurar PHP y personalizarlo, para ello debemos crear un archivo `99-custon.ini` de la siguiente forma:

# vim /usr/local/etc/php/99-custom.ini

display_errors=Off
safe_mode=Off
safe_mode_exec_dir=
safe_mode_allowed_env_vars=PHP_
expose_php=Off
log_errors=On
error_log=/var/log/nginx/php.scripts.log
register_globals=Off
cgi.force_redirect=0
file_uploads=On
allow_url_fopen=Off
sql.safe_mode=Off
disable_functions=show_source, system, shell_exec, passthru,   proc_open, proc_nice, exec
max_execution_time=60
memory_limit=60M
upload_max_filesize=2M
post_max_size=2M
cgi.fix_pathinfo=0
sendmail_path=/usr/sbin/sendmail -f user@domain -t

Guarde y cierre el archivo. Reinicie PHP en FreeBSD:

# service php-fpm restart

Performing sanity check on php-fpm configuration:
[19-Jul-2020 14:01:17] NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful

Stopping php_fpm.
Waiting for PIDS: 57262.
Performing sanity check on php-fpm configuration:
[19-Jul-2020 14:01:17] NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful

Starting php_fpm.

4.Configurando Nginx para usar PHP 7.4 (PHP-FPM)

El último paso es conectar Nginx al servicio PHP-FPM a través del protocolo FCGI. Edite su dominio virtual o el archivo nginx.conf de la siguiente manera:

# vim /usr/local/etc/nginx/nginx.conf

O si tiene dominios virtuales:

# vim /usr/local/etc/nginx/vdomains/http.192.168.1.112.conf

Debemos agregar en la definición y dentro del bloque del server, lo siguiente:

# php config let nginx talk to php socket
  location ~ [^/]\.php(/|$) {
      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
      if (!-f $document_root$fastcgi_script_name) {
              return 404;
      }
 
      # Mitigate https://httpoxy.org/ vulnerabilities
       fastcgi_param HTTP_PROXY "";
 
      fastcgi_pass unix:/var/run/php74-fpm.sock;
      fastcgi_index index.php;
 
      # include the fastcgi_param setting
      include fastcgi_params;
 
      # SCRIPT_FILENAME parameter is used for PHP FPM determining
      # the script name.
      fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
  }

Aquí hay un archivo de configuración de muestra actualizado:

server{
  server_name  192.168.1.112;
  access_log   /var/log/nginx/192.168.1.112.access.log;
  error_log    /var/log/nginx/192.168.1.112.error.log;
  root	 /usr/local/www;
  
  # php config let nginx talk to php socket
  location ~ [^/]\.php(/|$) {
      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
      if (!-f $document_root$fastcgi_script_name) {
          return 404;
      }
   
      # Mitigate https://httpoxy.org/ vulnerabilities
      fastcgi_param HTTP_PROXY "";
   
      fastcgi_pass unix:/var/run/php74-fpm.sock;
      fastcgi_index index.php;
   
      # include the fastcgi_param setting
      include fastcgi_params;
   
      # SCRIPT_FILENAME parameter is used for PHP FPM determining
      # the script name.
     	fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
  }

Ahora debe recargar el servicio:

5.Prueba de Configuración

Creemos un archivo que llameremos info.php con el siguiente contenido:

<?php
	phpinfo();
	phpinfo(INFO_MODULES);
?>

Guarde y cierre el archivo. Establezca permisos de archivo ajustados en DocumentRoot (raíz del servidor web):

# chown -R www:www  /usr/local/www
# chmod -R 0550     /usr/local/www

Abra su browser y compruebe que está funcionando:

http://192.168.1.112/info.php

FreeBSD-12.1

Y allí tienes PHP funcionando como se esperaba y Nginx está hablando con PHP-FPM a través del socket Unix.

6.Cómo verificar que PHP-fpm se esté ejecutando

Use el comando sockstat en FreeBSD para enumerar los servicios en ejecución, los puertos abiertos y los sockets de Unix:

# sockstat -46lu | egrep --color 'www|nginx|php'

sockstat -4lu | egrep --color 'www|nginx|php'
www      nginx      87242 8  tcp4   *:80                  *:*
www      php-fpm    82668 6  stream /var/run/php74-fpm.sock
www      php-fpm    82660 6  stream /var/run/php74-fpm.sock
root     php-fpm    82503 8  stream /var/run/php74-fpm.sock
root     nginx      32802 8  tcp4   *:80                  *:*

También revise los archivos de registro si tiene algún problema al ejecutar PHP:

# ls -l /var/log/nginx
# tail -f /var/log/nginx/192.168.1.112.access.log
# tail -f /var/log/nginx/192.168.1.112.error.log

7.Conclusión

Esta guía demostró cómo instalar PHP FPM de forma segura y configurarlo con un socket de Unix. Ahora tiene un servidor Nginx totalmente funcional junto con PHP 7.4 para crear páginas web dinámicas a pedido.