Cómo instalar Nextcloud con Nginx y PHP 7.3 en CentOS 8
Nextcloud es un software gratuito (de código abierto) similar a Dropbox, una bifurcación del proyecto ownCloud. Nextcloud está escrito en PHP y JavaScript, y es compatible con muchos sistemas de bases de datos como MySQL/MariaDB, PostgreSQL, la base de datos Oracle y SQLite.
Para mantener tus archivos sincronizados entre el escritorio y el servidor, Nextcloud ofrece aplicaciones para escritorios de Windows, Linux y Mac y una aplicación móvil para Android e iOS.
En este tutorial, te mostramos cómo instalar Nextcloud 17 con el servidor web Nginx, PHP 7.3 y la base de datos MariaDB en un servidor CentOS 8. Instalaremos Nextcloud y lo aseguraremos con un certificado SSL gratuito de Let’s Encrypt.
Requisitos previos
Para esta guía, instalaremos Nextcloud en el servidor CentOS 8 con 2GB de RAM, 25GB de espacio libre y 2CPUs.
Qué vamos a hacer
- Instalar el servidor web Nginx
- Instalar PHP-FPM 7.3
- Configurar PHP-FPM 7.3
- Instalar y configurar la base de datos MariaDB
- Generar SSL Letsencrypt
- Descargar Nextcloud 17
- Configurar Nginx Virtualhost para Nextcloud
- Configurar SELinux para Nextcloud
- Post-Instalación de Nextcloud
Paso 1 – Instalar Nginx
En primer lugar, instalaremos el servidor web Nginx en el servidor CentOS 8 y abriremos el puerto HTTP y HTTPS en el firewalld.
Instala Nginx desde el repositorio de AppStream utilizando el comando dnf que aparece a continuación.
sudo dnf install nginx
Una vez completada la instalación, inicia el servicio nginx y añádelo al arranque del sistema.
systemctl start nginx
systemctl enable nginx
Ahora comprueba el estado del servicio nginx utilizando el siguiente comando.
systemctl status nginx
Obtendrás que el servicio nginx está en funcionamiento en el servidor CentOS 8.
A continuación, añadiremos los servicios HTTP y HTTPS al firewalld.
Añade los servicios HTTP y HTTPS al firewalld utilizando el comando firewall-cmd que aparece a continuación.
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
Después, recarga los servicios del firewalld.
firewall-cmd --reload
Como resultado, has instalado con éxito el servidor web Nginx y has abierto los puertos HTTP y HTTPS en el servidor CentOS 8.
Paso 2 – Instalar PHP-FPM
De acuerdo con los requisitos del sistema Nextcloud, se recomienda utilizar PHP 7.2 o PHP 7.3 para su instalación.
Para esta guía, utilizaremos el PHP 7.3 que se puede instalar desde el repositorio REMI.
Antes de continuar, habilitaremos el repositorio ‘PowerTools’ y añadiremos los repositorios EPEL y REMI para el servidor CentOS 8.
Ejecuta el siguiente comando dnf.
sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Ahora comprueba todos los repositorios disponibles en el sistema.
dnf repolist
Y obtendrás el resultado que se indica a continuación.
Has habilitado el repositorio ‘PowerTools’ y has añadido los repositorios EPEL y REMI para CentOS 8.
A continuación, habilitaremos el repositorio REMI de PHP 7.3.
Comprueba todos los módulos disponibles para los paquetes de PHP.
dnf module list php
Ahora habilita el módulo del repositorio PHP 7.3 REMI.
dnf module enable php:remi-7.3
Después, instala los paquetes PHP y PHP-FPM 7.3 para Nextcloud utilizando el comando dnf que aparece a continuación.
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
Y ya has instalado PHP y PHP-FPM 7.3 en el sistema CentOS 8.
Paso 3 – Configurar PHP-FPM 7.3
En este paso, configuraremos el despliegue de PHP-FPM para Nextcloud.
Edita la configuración ‘php.ini’ con el siguiente comando.
vim /etc/php.ini
Descomenta y cambia la configuración como se indica a continuación.
memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0
Guarda y cierra.
Ahora edita la configuración de PHP opcache ‘/etc/php.d/10-opcache.ini’.
vim /etc/php.d/10-opcache.ini
Cambia la configuración como se indica a continuación.
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
Guarda y cierra.
A continuación, edita la configuración de PHP-FPM ‘/etc/php-fpm.d/www.conf’.
vim /etc/php-fpm.d/www.conf
Cambia el ‘usuario’ y el ‘grupo’ por ‘nginx’.
user = nginx
group = nginx
Cambia la configuración de ‘listen’ al archivo sock como se indica a continuación.
listen = /run/php-fpm/www.sock
Descomenta la variable de entorno PHP de abajo.
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Descomenta la configuración de opcache en la última línea.
php_value[opcache.file_cache] = /var/lib/php/opcache
Guarda y cierra.
Ahora crea un nuevo directorio para la sesión PHP y el opcache, y cambia el propietario de esos directorios al usuario y grupo ‘nginx’.
mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}
Y ya has completado la configuración de PHP-FPM para la instalación de Nextcloud.
Inicia el servicio PHP-FPM y añádelo al arranque del sistema.
systemctl enable php-fpm
systemctl start php-fpm
Ahora comprueba el archivo sock de PHP-FPM y el estado del servicio.
netstat -pl | grep php
systemctl status php-fpm
Y obtendrás el resultado que se muestra a continuación.
Como resultado, el PHP-FPM está funcionando bajo el archivo sock ‘/run/php-fpm/www.sock’.
Paso 4 – Instalar y configurar MariaDB
En este paso, instalaremos el servidor de base de datos MariaDB, configuraremos la autenticación de la contraseña de root y crearemos una nueva base de datos y un usuario para Nextcloud.
Instala la base de datos MariaDB utilizando el comando dnf que aparece a continuación.
sudo dnf install mariadb mariadb-server
Una vez completada la instalación, inicia el servicio MariaDB y añádelo al arranque del sistema.
systemctl start mariadb
systemctl enable mariadb
Y el servicio MariaDB ya está en marcha.
A continuación, configuraremos la autenticación de la contraseña de root utilizando el comando ‘mysql_secure_installation’ que aparece a continuación.
mysql_secure_installation
Escribe tu contraseña de root y teclea ‘Y’ para el resto de la configuración.
Set a root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Y la contraseña de root de MariaDB ha sido configurada.
Ahora entra en el shell de MySQL utilizando el comando mysql que aparece a continuación.
mysql -u root -p
TYPE YOUR ROOT PASSWORD
Ahora crea una nueva base de datos ‘nextcloud_db’ y crea un nuevo usuario ‘nextclouduser’ con la contraseña ‘nextcloudpassdb’ utilizando las consultas de abajo.
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;
Y ya has creado la base de datos y el usuario para la instalación de Nextcloud.
Paso 4 – Generar SSL Letsencrypt
En este paso, generaremos el SSL letsencrypt utilizando el ‘certbot’. Los certificados SSL se utilizarán para asegurar el acceso a Nextcloud.
Instala certbot desde el repositorio de EPEL utilizando el comando dnf que aparece a continuación.
sudo dnf install certbot
Una vez completada la instalación, genera los certificados SSL para el nombre de dominio de Nextcloud utilizando el comando de abajo y asegúrate de cambiar el nombre de dominio y la dirección de correo electrónico por los tuyos.
certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io
Una vez completado, todos los certificados SSL generados se encuentran en el directorio ‘/etc/letsencrypt/live/cloud.hakase-labs.io’.
Compruébalo con el siguiente comando.
ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/
Y ya has generado el letsencrypt SSL con la herramienta certbot.
Paso 5 – Descargar e instalar Nextcloud
En este paso, descargaremos la última versión de Nextcloud 17.
Antes de descargar el código fuente de Nextcloud, instala el paquete zip en el sistema.
sudo dnf install unzip
Ahora ve al directorio ‘/var/www/’ y descarga el código fuente de Nextcloud utilizando el comando wget como se indica a continuación.
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
Extrae el código fuente de Nextcloud utilizando el siguiente comando.
unzip nextcloud-17.0.2.zip
Y obtendrás un nuevo directorio llamado ‘nextcloud’.
Ahora crea un nuevo directorio ‘data’ para Nextcloud. El directorio ‘data’ se utilizará para almacenar los datos de los usuarios.
mkdir -p /var/www/nextcloud/data/
Después, cambia el propietario del directorio ‘nextcloud’ al usuario y grupo ‘nginx’.
sudo chown -R nginx:nginx /var/www/nextcloud
Y has descargado el último Nextcloud 17 en el directorio ‘/var/www’.
Paso 6 – Configurar el host virtual Nginx para Nextcloud
Después de descargar el código fuente de Nextcloud, vamos a configurar el host virtual Nginx para Nextcloud.
Ve al directorio ‘/etc/nginx/conf.d’ y crea una nueva configuración ‘nextcloud.conf’.
cd /etc/nginx/conf.d/
vim nextcloud.conf
Ahora cambia el nombre de dominio y la ruta del certificado SSL por los tuyos y pega la siguiente configuración en él.
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
# Before enabling Strict-Transport-Security headers please read into this
# topic first.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
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;
# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;
# Path to the root of your installation
root /var/www/nextcloud;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
# The following rule is only needed for the Social app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/webfinger /public.php?service=webfinger last;
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;
}
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Enable gzip but do not remove ETag headers
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;
# Uncomment if your server is built with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
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;
# Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
# Enable pretty urls
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;
}
# Adding the cache control header for js, css and map files
# Make sure it is BELOW the PHP block
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
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;
# Optional: Don't log access to assets
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
try_files $uri /index.php$request_uri;
# Optional: Don't log access to other assets
access_log off;
}
}
Guarda y cierra.
Después, prueba la configuración de nginx y reinicia el servicio Nginx. Y asegúrate de que no hay ningún error.
nginx -t
systemctl restart nginx
Ahora el servicio Nginx abrirá un nuevo puerto HTTPS en el sistema, compruébalo con el siguiente comando.
netstat -plntu
Y obtendrás el resultado que se muestra a continuación.
Como resultado, has añadido la configuración del host virtual Nginx para Nextcloud y has habilitado el HTTPS seguro sobre él.
Paso 7 – Configurar SELinux para Nextcloud
Para este tutorial, vamos a utilizar SELinux en el modo de «refuerzo». Y vamos a configurar el SELinux para la instalación de Nextcloud.
Instala la herramienta de gestión de SELinux utilizando el comando dnf que aparece a continuación.
sudo dnf install policycoreutils-python-utils
Ahora ejecuta el siguiente comando como root en tu servidor.
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/'
Y la configuración de SELinux para Nextcloud se ha completado.
Paso 8 – Asistente de instalación de Nextcloud
Ahora abre tu navegador web y escribe el nombre de tu dominio Nextcloud en la barra de direcciones.
https://cloud.hakase-labs.io/
Ahora obtendrás la página de instalación de Nextcloud como se muestra a continuación.
Escribe tu usuario y contraseña de administrador, luego elige ‘MySQL/MariaDB’ como base de datos y escribe los detalles de la base de datos que has creado en la parte superior.
Ahora haz clic en el botón «Finalizar la instalación» y comenzará la instalación.
Una vez que la instalación se haya completado, obtendrás el panel de control de Nextcloud como se muestra a continuación.
Como resultado, has instalado con éxito la última versión de Nextcloud 17 con el servidor web Nginx, PHP-FPM 7.3 y la base de datos MariaDB en el servidor CentOS 8.