Neuralpin Logo

Linux + Nginx + PHP - Servidor web con Debian

Preparar una maquina Linux con Nginx para tener un servidor web y ejecutar software PHP

Preparar una maquina Linux con Nginx para tener un servidor web y ejecutar software PHPP

Nginx es el software mas popular para montar servidores web ya que es un programa muy liviano en cuanto a uso de recursos computacionales pero muy potente a la hora de servir multiples peticiones concurrentes.

Se pronuncia Engine-X y lo veremos en conjunto con linux LEMP (Linux-eNginx-MySQL-PHP) ó LEPP (Linux-eNginx-Postgres-PHP).

Instalación de Nginx

Actualiza la lista de paquetes disponibles

sudo apt update

Instalar Nginx

sudo apt install nginx -y

Corroborar estado del servicio Nginx en la maquina

sudo service nginx status

Si Nginx esta correctamente instalado y activo en el sistema al ejecutar el comando anterior en la consola debemos ver un mensaje como el siguiente:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-10-10 16:35:23 UTC; 3 weeks 6 days ago
       Docs: man:nginx(8)
   Main PID: 497 (nginx)
      Tasks: 3 (limit: 1107)
     Memory: 11.1M
        CPU: 1min 11.122s
     CGroup: /system.slice/nginx.service
             ├─497 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─502 "nginx: worker process"
             └─503 "nginx: worker process"

Oct 10 16:35:22 ip-172-31-46-146 systemd[1]: Starting nginx.service - A high performance web server and a reverse proxy server...

Corroborar el funcionamiento de nuestro servidor web

Al visitar la Ip publica de nuestro servidor web deberíamos poder ver la página por defecto de Nginx.

En caso de no conocer nuestra Ip publica podríamos intentar averiguarla haciendo una petición web al sitio: https://icanhazip.com

curl -4 icanhazip.com

Visitando la Ip publica de nuestro servidor deberíamos ver una página como la siguiente:

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

En caso de problemas

En caso de que no podamos ver el mensaje de bienvenida de Nginx puede que el software no este activado o que el Firewall nos este bloqueando. De ser así hay que volver y verificar que el programa este correctamente instalado y habilitado en el servidor y que el acceso web no este bloqueado por el Firewall.

También puede ser el caso de que al visitar la Ip del servidor esta halla sido cacheada y se muestre un mensaje de error aunque ya todo este funcionando correctamente.

Trabajar con Nginx

Tras haber configurado Nginx correctamente ya podemos trabajar con el, incluso sin configurar mas cosas, ya que por defecto el software permite acceso web a los documentos y archivos dentro del directorio /var/www/html de nuestra maquina Linux, por lo que podemos empezar a subir cosas aquí, pero lo recomendable será proceder por otro lado.

Lo normal tras instalar Nginx será configurar otras cosas antes de empezar a montar archivos web, entre esas otras acciones estarían:

  • Agregar un nombre de dominio
  • Configurar un firewall para mejorar la seguridad del servidor
  • Añadir un certificado SSL para proteger los datos que entren y salgan del sitio web
  • Instalar y configurar PHP
  • Crear mas archivos de configuración para gestionar mas de un sitio web en la misma maquina (Virtual hosts)
  • Realizar otras configuraciones de Nginx para casos en particular (Balanceo de carga, proxy inverso, redirección de trafico, etc)

Añadir mas sitios a Nginx

En una misma maquina de Linux podemos procesar peticiones de multiples dominios o subdominios, para ello debemos crear archivos de configuración de Nginx para indicarle que hacer cuando le lleguen peticiones para dichos sitios web, a continuación veremos paso por paso sobre este proceso.

Preparar la ubicación física del nuevo sitio

Para poder añadir un sitio a Nginx primero deberíamos preparar los archivos dentro de la maquina, lo normal es añadir un nuevo directorio para cada proyecto diferente dentro del directorio /var/www, cada nuevo directorio debe contar con los permisos adecuados para poder ser servido por Nginx a internet de forma publica, y en el directorio del proyecto debemos montar los archivos de nuestro sitio web, para poder hacerlo podríamos subirlos por Git, por FTP o por SSH.

Crear directorio para el sitio web

sudo mkdir -p /var/www/newproyect/public

Crear un archivo index (Opcional)

Si aún no vas a subir los archivos finales del sitio web te aconsejo crear un archivo index.html con algún mensaje de sitio en construcción, para ello usaremos el comando nano, luego escribiremos algo de HTML básico y guardaremos el archivo con CTRL+X

sudo nano /var/www/newproyect/public/index.html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sitio en construcción</title>
</head>
<body>
    <h1>Nuevo sitio web en construcción, vuelva pronto</h1>
</body>
</html>

Asignar www-data como propietario del directorio web

sudo chown -R www-data:www-data /var/www/newproyect/public

Asignar los permisos de lectura, escritura y ejecución correspondientes

sudo chmod -R 755 /var/www/newproyect/public

En Linux debemos configurar siempre los permisos adecuados para nuestros programas y archivos, para poder servir públicamente archivos en nuestro servidor web Nginx debemos configurar dichos archivos para que el usuario www-data tenga acceso a ellos ya que es el usuario que usara Nginx.

Crear archivo de configuración Nginx

Nginx cuenta con la carpeta /etc/nginx/sites-available para indicarle que sitios web están disponibles, con el siguiente comando vamos a crear un archivo nuevo para nuestro sitio de prueba:

sudo nano /etc/nginx/sites-available/newproyect

A continuación el contenido que deberemos poner en el archivo y para salir debemos pulsar CTRL+x y luego debemos ingresar "y" para que Linux guarde nuestro archivo.

server {
    # Log files for Debugging
    access_log /var/log/nginx/newproyect-access.log;
    error_log /var/log/nginx/newproyect-error.log;

    # Root Directory for web
    root /var/www/web/newproyect/public;

    # Default index extension
    index index.php index.html index.htm;

    # Your Domain Name
    server_name newproyect.test;

    location / {
        try_files $uri $uri/ =404;
    }
}

Habilitar el nuevo sitio en Nginx

Finalmente debemos habilitar nuestro archivo de configuración de Nginx para que el nuevo sitio pueda funcionar, para ello Nginx cuenta con el directorio /etc/nginx/sites-available y en el demos crear un enlace al archivo creado en el paso anterior, para crear el enlace se usa el comando de Linux ln y lo haremos de la siguiente forma:

sudo ln -s /etc/nginx/sites-available/newproyect /etc/nginx/sites-enabled/newproyect

Verificar validez de los archivos de configuración

sudo nginx -t

Reiniciar Nginx para aplicar cambios

sudo service nginx restart

En cualquier momento podemos corroborar que el servicio de Nginx este corriendo en el servidor, cuando los archivos de configuración son inválidos el proceso no podrá iniciar.

sudo service nginx status

Con todo esto ya tendríamos listo nuestro nuevo sitio web en Nginx, si queremos añadir mas nombres de dominio o subdominios solo debemos repetir el proceso.

Tras completar el proceso ya podemos acceder a nuestros sitios usando cualquier navegador web y dirigiéndonos a nuestro nombre de dominio.

Habilitar PHP en nuestro sitio web

Para habilitar PHP debemos primero instalar y configurar PHP FPM en la versión que requiera nuestra aplicación y luego debemos añadir unas líneas extra al archivo de configuración en nuestro archivo de NGINX para el sitio que necesitamos.

A continuación veremos las líneas de configuración que debemos agregar para habilitar PHP, que para este ejemplo será la version PHP 8.3, y estas líneas deben agregarse dentro del bloque location{...}.

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_read_timeout 500;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Procedemos a abrir el archivo /etc/nginx/sites-available/newproyect con nano, agregamos las líneas y luego salimos guardando el archivo, para a continuación reiniciar Nginx:

sudo nano /etc/nginx/sites-available/newproyect

Nuestro archivo debe quedar de la siguiente forma:

server {

    # Log files for Debugging
    access_log /var/log/nginx/newproyect-access.log;
    error_log /var/log/nginx/newproyect-error.log;

    # Root Directory for web
    root /var/www/web/newproyect/public;

    # Default index extension
    index index.php index.html index.htm;

    # Your Domain Name
    server_name newproyect.test;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # PHP-FPM Configuration Nginx
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_read_timeout 500;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Verificar validez del archivo de configuración Nginx

sudo nginx -t

Reiniciar proceso de Nginx para aplicar cambios

sudo service nginx restart

Ulises Rendón

Desarrollador de Software

Es un programador apasionado por la ciencia y la tecnología, vive en la ciudad de México y fundó Neuralpin con el objetivo de divulgar conocimiento sobre tecnología y desarrollo.