Guía de tecnologías

Instalar Nextcloud 17 en CentOS 8 con Nginx, PHP 7.3 y MariaDB

8 min read Guía técnica Actualizado 21 Oct 2025
Instalar Nextcloud 17 en CentOS 8 con Nginx y PHP 7.3
Instalar Nextcloud 17 en CentOS 8 con Nginx y PHP 7.3

Instala Nextcloud 17 en un servidor CentOS 8 con Nginx, PHP 7.3 y MariaDB. Esta guía paso a paso cubre la instalación de paquetes, configuración de PHP-FPM, SELinux, certificados Let’s Encrypt y comprobaciones posteriores para dejar Nextcloud operativo y seguro.

Vista general de Nextcloud

Introducción

Nextcloud es una alternativa de código abierto a servicios de sincronización y compartición de archivos (similar a Dropbox). Está escrito en PHP y JavaScript y soporta varios sistemas de bases de datos como MySQL/MariaDB, PostgreSQL, Oracle y SQLite.

En esta guía detallada instalarás Nextcloud 17 en CentOS 8 usando Nginx como servidor web, PHP-FPM 7.3 y MariaDB como base de datos. También configuraremos SSL con Let’s Encrypt y aplicaremos ajustes de SELinux y permisos.

Criterios previos

  • Servidor CentOS 8 con 2 GB de RAM, 25 GB de espacio libre y 2 CPUs (mínimos recomendados para prueba/uso ligero).
  • Acceso root o sudo.
  • Un nombre de dominio apuntando al servidor (ej. cloud.tudominio.tld).
  • Puertos 80 y 443 abiertos en el firewall.

Qué haremos (resumen de pasos)

  • Instalar Nginx.
  • Instalar PHP-FPM 7.3 y extensiones necesarias.
  • Ajustar configuración de PHP-FPM y opcache.
  • Instalar MariaDB y crear la base de datos de Nextcloud.
  • Generar certificado SSL con Certbot (Let’s Encrypt).
  • Descargar Nextcloud 17 y preparar permisos.
  • Crear la configuración de virtualhost en Nginx.
  • Ajustar SELinux para permitir escritura en los directorios necesarios.
  • Ejecutar el instalador web y comprobaciones finales.

Nota importante

Esta guía asume CentOS 8 y PHP 7.3. Si usas una distribución diferente (Rocky Linux, AlmaLinux o RHEL) o versiones más recientes de PHP/Nextcloud, ajusta los repositorios y paquetes de acuerdo con tu entorno.

Paso 1 - Instalar Nginx

Instala Nginx desde AppStream y abre los puertos HTTP/HTTPS en firewalld.

sudo dnf install nginx

Inicia y habilita el servicio para el arranque:

systemctl start nginx
systemctl enable nginx

Verifica el estado del servicio:

systemctl status nginx

Deberías ver que Nginx está activo en el servidor CentOS 8.

Inicio de Nginx con systemd

Añade los servicios HTTP y HTTPS al firewall:

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

Resultado esperado: Nginx instalado y puertos 80/443 abiertos.

Configuración del firewall

Paso 2 - Instalar PHP-FPM 7.3

Nextcloud recomienda PHP 7.2 o 7.3 para la versión 17. Usaremos PHP 7.3 desde el repositorio REMI.

Habilita PowerTools, EPEL y añade REMI:

sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Lista de repositorios activos:

dnf repolist

Habilita el módulo PHP 7.3 de REMI:

dnf module list php
dnf module enable php:remi-7.3

Añadir repositorio Remi en CentOS 8

Instala PHP y extensiones requeridas por Nextcloud:

sudo dnf install php-fpm php-cli php-devel php-gd php-mysqlnd php-pear php-xml php-mbstring php-pdo php-json php-pecl-apcu php-pecl-apcu-devel php-pecl-imagick-devel php-intl php-opcache php-zip

Con esto tendrás PHP-FPM 7.3 y las librerías comunes necesarias.

Paso 3 - Configurar PHP-FPM 7.3

Ajusta php.ini para Nextcloud. Edita /etc/php.ini:

vim /etc/php.ini

Descomenta y adapta:

memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0

Ajustes de opcache: edita /etc/php.d/10-opcache.ini

vim /etc/php.d/10-opcache.ini

Configura:

opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Edita el pool de PHP-FPM /etc/php-fpm.d/www.conf y cambia usuario/grupo a nginx:

vim /etc/php-fpm.d/www.conf

Modifica:

user = nginx
group = nginx

Usa socket unix:

listen = /run/php-fpm/www.sock

Descomenta variables de entorno y la línea de opcache file cache:

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_value[opcache.file_cache] = /var/lib/php/opcache

Crea directorios de sesión y opcache y ajusta permisos:

mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}

Habilita e inicia php-fpm:

systemctl enable php-fpm
systemctl start php-fpm

Configurar PHP 7.3

Verifica el socket y el servicio:

netstat -pl | grep php
systemctl status php-fpm

Estado de PHP-FPM

Resultado: PHP-FPM escuchando en /run/php-fpm/www.sock.

Paso 4 - Instalar y configurar MariaDB

Instala MariaDB y habilita el servicio:

sudo dnf install mariadb mariadb-server
systemctl start mariadb
systemctl enable mariadb

Configurar MariaDB

Asegura la instalación con mysql_secure_installation:

mysql_secure_installation

Responde según tu política (se recomienda establecer contraseña root, eliminar usuarios anónimos, eliminar base de datos de prueba y recargar privilegios).

Entra en el shell de MySQL y crea la base de datos y usuario para Nextcloud:

mysql -u root -p
-- en el prompt de mysql:
create database nextcloud_db;
create user nextclouduser@localhost identified by 'nextcloudpassdb';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextcloudpassdb';
flush privileges;

Ajusta la contraseña y el nombre de base de datos en producción; evita usar credenciales de ejemplo.

Configurar base de datos Nextcloud

Paso 5 - Generar SSL con Let’s Encrypt

Instala certbot desde EPEL:

sudo dnf install certbot

Genera certificados usando el modo webroot (ajusta dominio y correo):

certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io

Los certificados estarán en /etc/letsencrypt/live/cloud.hakase-labs.io/. Comprueba:

ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/

Nota: Para renovación automática puedes usar systemd timer o un cron que ejecute “certbot renew” y recargue nginx cuando sea necesario.

Paso 6 - Descargar e instalar Nextcloud

Instala unzip si hace falta y descarga Nextcloud 17 al directorio web:

sudo dnf install unzip
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
unzip nextcloud-17.0.2.zip

Crea directorio de datos y ajusta permisos a nginx:

mkdir -p /var/www/nextcloud/data/
sudo chown -R nginx:nginx /var/www/nextcloud

Descargar Nextcloud

Paso 7 - Configurar virtualhost Nginx para Nextcloud

Crea /etc/nginx/conf.d/nextcloud.conf y pega la configuración (reemplaza server_name y rutas de SSL por las tuyas):

upstream php-handler {
 #server 127.0.0.1:9000;
 server unix:/run/php-fpm/www.sock;
}

server {
 listen 80;
 listen [::]:80;
 server_name cloud.hakase-labs.io;
 # enforce https
 return 301 https://$server_name:443$request_uri;
}

server {
 listen 443 ssl http2;
 listen [::]:443 ssl http2;
 server_name cloud.hakase-labs.io;

 # Use Mozilla's guidelines for SSL/TLS settings
 # https://mozilla.github.io/server-side-tls/ssl-config-generator/
 # NOTE: some settings below might be redundant
 ssl_certificate /etc/ssl/nginx/fullchain.pem;
 ssl_certificate_key /etc/ssl/nginx/privkey.pem;

 # Add headers to serve security related headers
 add_header Referrer-Policy "no-referrer" always;
 add_header X-Content-Type-Options "nosniff" always;
 add_header X-Download-Options "noopen" always;
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-Permitted-Cross-Domain-Policies "none" always;
 add_header X-Robots-Tag "none" always;
 add_header X-XSS-Protection "1; mode=block" always;

 fastcgi_hide_header X-Powered-By;

 root /var/www/nextcloud;

 location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }

 location = /.well-known/carddav {
 return 301 $scheme://$host:$server_port/remote.php/dav;
 }
 location = /.well-known/caldav {
 return 301 $scheme://$host:$server_port/remote.php/dav;
 }

 client_max_body_size 512M;
 fastcgi_buffers 64 4K;

 gzip on;
 gzip_vary on;
 gzip_comp_level 4;
 gzip_min_length 256;
 gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
 gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

 location / {
 rewrite ^ /index.php;
 }

 location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
 deny all;
 }
 location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
 deny all;
 }

 location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
 fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
 set $path_info $fastcgi_path_info;
 try_files $fastcgi_script_name =404;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param PATH_INFO $path_info;
 fastcgi_param HTTPS on;
 fastcgi_param modHeadersAvailable true;
 fastcgi_param front_controller_active true;
 fastcgi_pass php-handler;
 fastcgi_intercept_errors on;
 fastcgi_request_buffering off;
 }

 location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
 try_files $uri/ =404;
 index index.php;
 }

 location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
 try_files $uri /index.php$request_uri;
 add_header Cache-Control "public, max-age=15778463";
 add_header Referrer-Policy "no-referrer" always;
 add_header X-Content-Type-Options "nosniff" always;
 add_header X-Download-Options "noopen" always;
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-Permitted-Cross-Domain-Policies "none" always;
 add_header X-Robots-Tag "none" always;
 add_header X-XSS-Protection "1; mode=block" always;
 access_log off;
 }

 location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
 try_files $uri /index.php$request_uri;
 access_log off;
 }
}

Prueba la configuración y reinicia Nginx:

nginx -t
systemctl restart nginx

Comprueba puertos y escucha:

netstat -plntu

Configurar Nginx para Nextcloud

Paso 8 - Configurar SELinux para Nextcloud

Si tu sistema ejecuta SELinux en modo enforcing, marca las rutas necesarias con httpd_sys_rw_content_t y aplica restorecon.

Instala la herramienta de gestión:

sudo dnf install policycoreutils-python-utils

Aplica los contextos SELinux:

semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/assets(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'

restorecon -Rv '/var/www/nextcloud/'

Con esto SELinux permitirá a Nginx/PHP escribir en los directorios necesarios.

Paso 9 - Asistente de instalación web de Nextcloud

Abre en el navegador:

https://cloud.hakase-labs.io/

Verás la página de instalación web. Rellena el usuario administrador y la contraseña, selecciona MySQL/MariaDB y suministra los datos de la base de datos creados anteriormente (nextcloud_db, nextclouduser).

Instalador web de Nextcloud

Haz clic en “Finish Setup” y espera a que termine. Al finalizar verás el panel de control de Nextcloud.

Nextcloud en CentOS 8

¡Enhorabuena! Has instalado Nextcloud 17 con Nginx, PHP-FPM 7.3 y MariaDB en CentOS 8.


Sección de mejoras, comprobaciones y seguridad (valor añadido)

Fact box (datos clave)

  • Requisitos mínimos recomendados: 2 GB RAM, 2 CPUs, 25 GB disco.
  • PHP recomendado para Nextcloud 17: 7.2 o 7.3.
  • Directorio de instalación por defecto en esta guía: /var/www/nextcloud.
  • Socket PHP-FPM usado: /run/php-fpm/www.sock.

Comprobaciones post-instalación (mini-checklist)

  • Acceso HTTPS válido al dominio.
  • Instalador web completado sin errores.
  • Permisos de /var/www/nextcloud asignados a nginx:nginx.
  • SELinux tiene contextos correctos para data, config y apps.
  • Certificado Let’s Encrypt generado y válido.
  • Copia de seguridad de la base de datos y de config.php realizada.

Backups recomendados (breve SOP)

  1. Hacer dump de la base de datos:
mysqldump -u root -p nextcloud_db > /root/backup_nextcloud_db_$(date +%F).sql
  1. Archivar config y datos (si los datos no están en un almacenamiento separado):
tar czf /root/backup_nextcloud_www_$(date +%F).tar.gz /var/www/nextcloud
  1. Verificar integridad del backup y almacenarlo fuera del servidor.

Renovación del certificado Let’s Encrypt (nota)

  • Para renovar manualmente:
certbot renew --quiet --deploy-hook "systemctl reload nginx"
  • Configura una tarea programada o timer systemd para renovaciones automáticas.

Seguridad y endurecimiento (resumen)

  • Forzar HTTPS y redirigir todo tráfico HTTP a HTTPS.
  • Habilitar cabeceras de seguridad recomendadas (HSTS con precaución, X-Frame-Options, Referrer-Policy).
  • Restringir acceso al panel de administración por IP si procede.
  • Mantener paquetes y parches al día (kernel, PHP, Nginx, MariaDB).
  • Hacer escaneos periódicos de integridad (integrity checks de Nextcloud y backups).

Problemas comunes y soluciones rápidas

  • Error “Can’t write into config directory”: revisa propietario/permiso del directorio /var/www/nextcloud/config y SELinux.
  • 502 Bad Gateway al acceder a PHP: verifica que php-fpm está activo y que Nginx apunta al socket correcto (/run/php-fpm/www.sock).
  • Problemas con subida de archivos grandes: revisa client_max_body_size en Nginx y post_max_size/upload_max_filesize en php.ini.

Criterios de aceptación

  • La página de login de Nextcloud carga sobre HTTPS sin errores de certificado.
  • El usuario admin puede crear una cuenta de prueba y subir un archivo de 100 MB.
  • Las aplicaciones básicas (Calendar, Contacts) se instalan y funcionan.
  • Las tareas de copia de seguridad y restauración se verifican exitosamente.

Guía rápida de resolución (decision tree)

flowchart TD
 A[Iniciar: Nextcloud inaccesible] --> B{¿Página HTTPS responde?}
 B -- No --> C{¿Nginx activo?}
 C -- No --> D[Reiniciar nginx y revisar logs]
 C -- Sí --> E{¿502/504?}
 E -- Sí --> F[Revisar php-fpm: systemctl status php-fpm y socket]
 E -- No --> G[Revisar firewall y DNS]
 B -- Sí --> H{¿Errores de aplicación?}
 H -- Sí --> I[Revisar logs de Nextcloud: data/nextcloud.log]
 H -- No --> J[Servicio OK]

Role-based checklist (breve)

  • Administrador de sistemas: instalar paquetes, configurar firewall, automatizar renovación Certbot, aplicar SELinux.
  • DBA: crear base de datos, asegurar credenciales, planificar backups y restauraciones.
  • Soporte/Helpdesk: probar subida/descarga de archivos, sincronización cliente de escritorio y móvil, restablecimiento de contraseñas.

Casos límite y cuándo esta guía puede fallar

  • Si usas PHP 8.x o Nextcloud más reciente, algunos paquetes o configuraciones pueden diferir.
  • En entornos con almacenamiento externo (NFS, SMB) conviene ajustar permisos y opciones de cache/locking (Redis, memcache).
  • Si el servidor está detrás de un proxy inverso o balanceador, hay que adaptar las directivas de proxy y headers.

Notas de compatibilidad y migración

  • CentOS 8 ha seguido distintas vías tras su ciclo de vida; en entornos nuevos considera alternativas compatibles (Rocky Linux, AlmaLinux, RHEL).
  • Para migrar Nextcloud entre servidores, realiza backup de la base de datos, copia de /var/www/nextcloud y del directorio de datos, y restaura en el destino con las rutas y permisos ajustados.

Mini glosario (1 línea cada término)

  • PHP-FPM: gestor de procesos FastCGI para ejecutar código PHP de forma eficiente.
  • Opcache: caché de bytecode de PHP que acelera la ejecución.
  • webroot: directorio público que sirve archivos estáticos (ej. /usr/share/nginx/html).
  • Certbot: cliente para obtener/renovar certificados de Let’s Encrypt.

Preguntas frecuentes (FAQ)

¿Puedo usar PostgreSQL en lugar de MariaDB?

Sí, Nextcloud soporta PostgreSQL. Cambia la sección de base de datos durante la instalación y crea la base de datos y usuario correspondiente en PostgreSQL.

¿Cómo habilito Redis como cache para mejorar el rendimiento?

Instala Redis y la extensión PHP correspondiente; configura Redis como memcache en config.php de Nextcloud y asegúrate de que Redis está protegido y configurado correctamente.

Resumen final

Has completado la instalación de Nextcloud 17 en CentOS 8 con Nginx y PHP-FPM 7.3, configurado MariaDB, SELinux y certificado SSL. Antes de ponerlo en producción, revisa backups, monitorización y políticas de parcheo.

Referencias

Autor
Edición

Materiales similares

Desactivar búsqueda en línea de Unity Dash
Linux

Desactivar búsqueda en línea de Unity Dash

Aria en Opera: IA integrada y cómo probarla
Navegadores

Aria en Opera: IA integrada y cómo probarla

Compartir juegos en Steam: guía rápida
Guías

Compartir juegos en Steam: guía rápida

Botones para compartir en Blogger con AddThis
Blogging

Botones para compartir en Blogger con AddThis

Probar apps de pago en Mac gratis
Mac

Probar apps de pago en Mac gratis

Arreglar Instagram que no carga en Chrome
Soporte técnico

Arreglar Instagram que no carga en Chrome