Problema
Cuando trato de subir un archivo un poco “pesado” a mi servidor (por ejemplo un tema de WordPress) estoy recibiendo el error 413 Request Entity Too Large
Explicación del error
Este error sucede porque en la configuración de tu servidor web nginx hay una limitante en cuanto al tamaño del archivo que se puede subir; este tamaño usualmente se especifica en megabytes y normalmente está acotado a sólo 2 MB, lo cual es muy poco para un tema de WordPress por ejemplo.
Solución
Lo que debemos hacer son dos cosas:
Paso 1. Modifica la configuración de nginx
Modificar nuestra configuración de nginx para que tenga un parámetro con menos limitante en cuanto al tamaño en megabytes que podemos subir a nuestro servidor usando un navegador web.
Para ello, procedamos con lo siguiente:
Ingresa en modo terminal en tu servidor y abre el siguiente archivo (previo respaldo del mismo):
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup sudo nano /etc/nginx/nginx.conf
Localiza el bloque referente a la configuración http y agrega la siguientes líneas:
# To avoid error when uploading files added Alex Arriaga client_max_body_size 32M;
Como notarás ahora estamos indicando un tamaño de cuerpo de las peticiones de 32 MB (es decir, podrías subir por ejemplo un archivo ZIP de aproximadamente ese tamaño).
Después de la modificación de tu archivo más o menos se contendrá algo como esto:
http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; # To avoid error when uploading files added Alex Arriaga client_max_body_size 32M; # Aquí habrá más líneas de configuración... # ... }
Paso 2. Verifica sintaxis y recarga la configuración
Primero verifiquemos que NO tenemos errores de sintaxis en nuestro archivo de configuración. Eso se hace fácilmente con el siguiente comando.
sudo service nginx configtest
En caso de tener algún error, puedes ver qué pasa usando este comando:
sudo nginx -t
Si no ves algún error, entonces es momento de recargar la configuración de nginx usando:
sudo service nginx reload
Paso 3. Modifiquemos nuestro archivo php.ini para que coincida con el parámetro de nginx
El archivo php.ini es un archivo de configuración de PHP (el lenguaje de servidor con el que están hechos muchos CMS -como WordPress y Drupal- y frameworks -como Laravel y CakePHP-.
La localización de este archivo puede variar, la forma más fácil de saber dónde está este archivo, es creando un archivo info.php en tu servidor y accederlo desde tu portal de internet (ya sea en local o en un dominio real).
Veamos cómo hacer esto:
# Esta sería la ruta donde está tu proyecto cd /path/to/your/project/or/app sudo nano info.php
Coloca en este archivo la siguiente línea de código PHP:
<?php phpinfo(); ?>
Ahora si tu sitio de internet o aplicación está en http://example.com, entonces podríamos visitar http://example.com/info.php y veríamos una tabla de color morado con datos como estos:
Busca ahí la parte donde diga “Configuration File (php.ini) Path” y con eso sabrás dónde está tu archivo php.ini. En nuestro caso está en la ruta:
nano /etc/php/7.0/fpm/php.ini
Perfecto, ahora abramos este archivo y modifiquemos esta línea:
upload_max_filesize = 2M
Para abrir tu archivo simplemente usa algún editor como nano:
sudo nano /etc/php/7.0/fpm/php.ini
Después de modificar tu archivo, éste se vería con algunas líneas como estas:
; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize ; upload_max_filesize = 2M ; Esta es nuestra configuración cambiada a 32M upload_max_filesize = 32M
Guarda tu archivo y continuemos.
Paso 4. Reiniciemos PHP-FPM
Este paso podría NO aplicar a tu servidor, ya que depende si uses PHP-FPM en caso de que no, con el simple reinicio de Nginx debería ser suficiente.
# Restart Nginx sudo service nginx restart # Restart PHP-PFM sudo /etc/init.d/php7.0-fpm restart
Y listo, ahora si intentas subir tu archivo, ya deberías tener permitidos archivos con un tamaño mayor (32 M).
Saludos cordiales y nos vemos en otro momento.
Hola Alex! Muchas gracias por tu articulo, muy completo. Lamentablemente no funciono en mi caso (lo seguí al pie de la letra), estoy utilizando Vagrant/Homestead como entorno, Nginx y WordPress. Quiero subir un .zip de 290MB, tengo la config: upload_max_filesize = 300M y en mi nginx.conf igual client_max_body_size 300M pero aun me sigue dando este error.
Saludos!
Que tal Lucas,
Se me ocurre que Vagrant/Homestead además de usar el archivo por defecto de configuración de Nginx también esté usando algún otro archivo “custom” donde está re-escribiendo ese parámetro.
Algo rápido que puedes hacer es un “grep” para encontrar aquellos archivos que pudieran estar sobre-escribiéndolos:
grep -r “client_max_*” /path/to/your/project
Saludos.