Hace algunos meses expliqué detalladamente cómo instalar y configurar Nginx con PHP-FPM en Debian. En este artículo voy a explicar cómo llevar a cabo al misma tarea, pero esta vez sobre un servidor FreeBSD. A pesar de que las configuraciones son casi idénticas, la instalación de paquetes desde la colección de ports de FreeBSD es algo diferente a Debian y derivados, y a su vez se utiliza un sistema de archivos ZFS como base para el directorio de trabajo del servidor HTTP (donde se alojarán los archivos de los diferentes sitios Web).

Creación y configuración de un dataset ZFS

Suponiendo que se ha creado previamente un pool ZFS llamado "zdata":

# zpool create zdata /dev/da1

Se procede con la creación de un dataset exclusivo para los archivos de los sitios Web llamado "www":

# zfs create zdata/www

Debido a que muchos de los archivos de los sitios Web suelen ser de tamaño pequeño (la mayoría de ellos por debajo de los 4KB), es conveniente utilizar un tamaño de bloque pequeño: 4 KB. Por otro lado (tal como expliqué en el artículo Optimizar un dataset ZFS para bases de datos PostgreSQL) se recomienda activar compresión y deshabilitar el registro de tiempo de acceso para mejorar el rendimiento.

# zfs set recordsize=4K zdata/www
# zfs set compression=lz4 zdata/www
# zfs set secondarycache=none zdata/www
# zfs set atime=off zdata/www
# zfs set primarycache=all zdata/www

Respecto a la caché de ZFS, se recomienda activar la caché primaria ("all", tanto para datos como para metadatos) y desactivar la caché secundaria (si no se cuenta con un medio de almacenamiento secundario de alta velocidad, por ejemplo un disco SSD).

Por último, cambiar el propietario y grupo del dataset a "www" (usuario con el que correrá tanto Nginx como PHP-FPM):

# chown www:www /zdata/www

Instalar PHP y configurar el servidor FastCGI PHP-FPM

Luego de haber configurado el dataset ZFS donde alojar el contenido de los sitios Web, instalar PHP:

# pkg install php56

Si es necesario acceder a bases de datos Postgres desde PHP, instalar el módulo correspondiente:

# pkg install php5-pgsql

Si, en cambio, se utilizasen bases de datos MySQL, instalar el módulo php5-mysql.

Finalmente, configurar se servidor FastCGI:

# nano /usr/local/etc/php-fpm.conf
user = www
group = www
listen = /var/run/php5-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 75
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 10

Las diferentes opciones de configuración del gestor de procesos de PHP-FPM se encuentran detalladas en el artículo Nginx VS. Apache ¿Cuál consume menos recursos? (mi experiencia). Recordar que es posible optar entre tres modos de gestión de procesos diferentes: static, dynamic y ondemand. De acuerdo a cada escenario, se debe elegir cuidadosamente tanto el modo como sus opciones. Recordar que esta configuración puede afectar notablemente al rendimiento y estabilidad del servidor, tal como explica el artículo anteriormente mencionado.

Finalmente, se debe habilitar el servicio php-fpm agregando la siguiente línea en el archivo /etc/rc.conf:

php_fpm_enable="YES"

E iniciar por primera vez ejecutando:

# service php-fpm start

Instalar y configurar el servidor HTTP Nginx

La instalación de Nginx es trivial:

# pkg install nginx

Habilitar Nginx para que corra automáticamente al iniciar el sistema editando el archivo /etc/rc.conf:

# nano /etc/rc.conf

Agregar la siguiente línea:

nginx_enable="YES"

Luego, configurar el sitio Web por defecto:

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

Archivo de configuración de ejemplo:

user www www;
worker_processes auto;
worker_rlimit_nofile 2048;

pid /var/run/nginx.pid;

events {
  worker_connections 1024;
}

http {
  include mime.types;
  default_type application/octet-stream;

  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';

  sendfile on;
 
  keepalive_timeout 30;

  gzip on;

  upstream php5-fpm-sock {
    server unix:/var/run/php5-fpm.sock;
  }

  server {
    listen 80;
    server_name localhost;
    server_tokens off;
    root /zdata/www;

    location / {
      root /usr/local/www/nginx;
      index index.html index.htm;
    }

    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/local/www/nginx-dist;
    }

    location ~ \..*/.*\.php$ {
      return 403;
    }

    location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
    }

    include sites-enabled/*.conf;

  }
}

La última línea de configuración se agrega para crear una jerarquía de sitios Web disponibles y habilitados, similar a la que utiliza Apache en Debian y derivados. Para ello es necesario crear los directorios "sites-availables" y "sites-enabled" dentro del directorio /usr/local/etc/nginx/ y reiniciar Nginx:

# mkdir /usr/local/etc/nginx/sites-enabled
# mkdir /usr/local/etc/nginx/sites-available
# service nginx restart

La idea es que cada archivo de configuración de un sitio Web sea creado dentro del directorio /usr/local/etc/nginx/sites-available/, para luego ser habilitado utilizando un link simbólico dentro de /usr/local/etc/nginx/sites-enabled/ (tal como lo hace el comando a2ensite). Por ejemplo, si se crea el archivo "linuxito.conf" para configurar el sitio Web linuxito.com:

# cd /usr/local/etc/nginx/sites-available
# vi linuxito.conf

Luego se habilita creando un link simbólico y recargando la configuración de Nginx:

# ln -s /usr/local/etc/nginx/sites-available/linuxito.conf /usr/local/etc/nginx/sites-enabled/linuxito.conf
# service nginx reload

Si en algún momento se desea deshabiltiar el sitio, simplemente se debe borrar el enlace:

# rm /usr/local/etc/nginx/sites-enabled/linuxito.conf
# service nginx reload


Tal vez pueda interesarte


Compartí este artículo