Cuando se despliega un proyecto Drupal 11 en el entorno de producción, deberíamos realizar varios ajustes, que garanticen su correcto funcionamiento.
Antes de configurar Nginx, asegúrate de:
- Ubuntu 22.04+ o 24.04
- Nginx ≥ 1.18
- PHP ≥ 8.3 (Drupal 11 lo requiere)
- Base de datos: MySQL 8 / MariaDB 10.6+ / PostgreSQL
- Composer instalado
Extensiones PHP necesarias:
Nos aseguramos de instalar php8.4 en nuestro servidor Linux, ejecutando el siguiente comando.
sudo apt install php8.4-fpm php8.4-cli php8.4-mysql php8.4-gd php8.4-curl php8.4-xml php8.4-mbstring php8.4-zip php8.4-opcache php8.4-intl
Configuración Nginx recomendada
Generamos o copiamos el archivo en el que guardaremos la configuración para nuestro Drupal, actualizando el nombre de dominio y la carpeta según nuestra instalación.
Archivo típico:
/etc/nginx/sites-available/drupal
server {
listen 80;
server_name tudominio.com www.tudominio.com;
root /var/www/drupal/web;
index index.php index.html;
# Seguridad básica
server_tokens off;
# Tamaño de subida
client_max_body_size 64M;
# Archivos estáticos (cache)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp)$ {
try_files $uri =404;
expires max;
log_not_found off;
}
# Drupal clean URLs
location / {
try_files $uri /index.php?$query_string;
}
# PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Bloquear acceso a archivos sensibles
location ~* \.(htaccess|env|git|ini|log|sh|sql)$ {
deny all;
}
location ~* /sites/.*/private/ {
deny all;
}
location ~* /vendor/ {
deny all;
}
# Cache control Drupal
location ~ ^/sites/.*/files/styles/ {
try_files $uri @rewrite;
}
location @rewrite {
rewrite ^ /index.php;
}
# Robots y favicon
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { allow all; log_not_found off; access_log off; }
}
HTTPS (muy recomendado)
Nos aseguraremos de instalar un certificado de seguridad (HTTPS), con el que el usuario accederá a nuestro sitio web sin temores.
Instalamos Certbot, que es una herramienta gratuita:
sudo apt install certbot python3-certbot-nginx
Luego:
Generamos el archivo con el dominio de nuestro sitio web:
sudo certbot --nginx -d tudominio.com -d www.tudominio.com
Optimización PHP (clave para Drupal)
Para evitar fallos en la ejecución de Drupal, es necesario realizar algunos ajustes correspondientes a PHP. Abriremso el archivo utilizando nano o el editor de texto que tengamos disponible en nuestro servidor de producción.
Edita:
/etc/php/8.3/fpm/php.ini
Con nuestro archivo abierto en consla, buscaremos las siguientes líneas y modificaremos sus valores:
memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
OPcache (muy importante)
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
Ajustes recomendados de Nginx (global)
Para asegurarnos de que NGINX funcione para todos nuestros proyectos Drupal, realizaremos algunos cambios en el archivo general de NGINX.
Archivo:
Valores recomendados:
/etc/nginx/nginx.conf
Añade o ajusta:
worker_processes auto;
worker_connections 2048;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
keepalive_timeout 65;
Permisos Drupal
Es importante configurar los permisos de las carpetas y archivos correspondientes a nuestra instalación, ya que, una vez instalado Drupal, los usuarios con permisos podrán subir o cargar todo tipo de archivos desde la interfaz de usuario.
sudo chown -R www-data:www-data /var/www/drupal
sudo find /var/www/drupal -type d -exec chmod 755 {} \;
sudo find /var/www/drupal -type f -exec chmod 644 {} \;
Carpeta de archivos:
chmod -R 775 /var/www/drupal/web/sites/default/files
Activar sitio
El último paso será añadir un enlace simbólito que apunte a nuestro domimio recién configurado y confirmar que todo funciona correctamente en el Nginx. Posteriormente reiniciaremos el servidor.
sudo ln -s /etc/nginx/sites-available/drupal /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Consejos avanzados (muy recomendados)
- Usa Redis para caché (mejora brutal en Drupal)
- Activa CDN (Cloudflare o similar)
- Usa HTTP/2 o HTTP/3
- Configura fail2ban
- Activa headers de seguridad:
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";