Cómo instalar NextCloud en Ubuntu 22.04 LTS: Guía paso a paso
1. Accede al servidor por SSH
Al utilizar SSH, optas por una vía segura y encriptada.
1 | ssh root@ipservidor |
2. Crea un usuario local
Ahora estamos conectados como “root”, por seguridad vamos a crear un usuario local, si es que no está creado ya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # cambia evzek por el nombre de tu usuario. adduser evzek # Se debería de ver algo así: Adding user `evzek' ... Adding new group `evzek' (1000) ... Adding new user `evzek' (1000) with group `evzek' ... Creating home directory `/home/evzek' ... Copying files from `/etc/skel' ... # Crea tu contraseña. New password: Retype new password: passwd: password updated successfully # Campos opcionales, puedes pasar con enter. Changing the user information for evzek Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: # R → Yes Is the information correct? [Y/n] |
NOTA: Cuándo veas “Y” en mayúscula (en terminal), es el valor predeterminado al presionar la tecla “enter”.
3. Verifica que tenga permisos sudo tu usuario
1 2 3 4 | # cambia evzek por el nombre de tu usuario. usermod -aG sudo evzek # NOTA: Si todo salió bien, no deberías ver ningún mensaje. |
– usermod: Es una utilidad para modificar la configuración de un usuario existente.
– aG: Estas opciones juntas indican que se va a agregar (-a) al usuario a un grupo (-G) sin eliminarlo de otros grupos a los que ya pertenece.
– sudo: Es el nombre del grupo al que queremos agregar al usuario. En sistemas basados en Debian, como Ubuntu, los miembros del grupo sudo tienen permisos para ejecutar cualquier comando como superusuario a través del comando sudo.
– evzek: Es el nombre del usuario al que queremos agregar al grupo mencionado.
4. Ahora puedes desconectar e identificarte con tu usuario
1 2 | # cambia evzek por el nombre de tu usuario. ssh evzek@ipservidor |
¿Por qué es importante crear un usuario local y no solo quedarnos con root?
5. Actualiza tu servidor
1 2 3 4 5 6 7 8 | # 1 sudo apt update # 2 sudo apt dist-upgrade # 3 sudo apt autoremove |
– sudo apt update: Actualiza la lista de paquetes disponibles en los repositorios configurados en tu sistema. En otras palabras, le dice a tu servidor: “Oye, ¿cuáles son las últimas versiones de los programas y herramientas disponibles para instalar o actualizar?”. No instala ni actualiza ningún programa, solo refresca la información.
– sudo apt upgrade: Una vez que has actualizado la lista de paquetes con el comando anterior, este comando se encarga de instalar las últimas versiones de todos los programas que ya tienes en tu sistema. Así que, básicamente, le estás diciendo a tu computadora: “Ahora que ya sabes cuáles son las últimas versiones, ¡vamos a instalarlas!”
– sudo apt dist-upgrade: Es una versión avanzada del típico sudo apt upgrade. Mientras que upgrade solo actualiza paquetes existentes, dist-upgrade gestiona de forma inteligente las dependencias, pudiendo agregar o quitar paquetes según sea necesario para las actualizaciones. Es útil para transiciones a nuevas versiones del sistema, pero es importante usarlo con precaución y estar atentos a los cambios que propone.
– sudo apt autoremove: Ayuda a mantener tu sistema limpio, eliminando paquetes que fueron instalados automáticamente como dependencias y que ya no son necesarios. Es como un asistente que se asegura de que tu sistema no esté lleno de cosas innecesarias, manteniéndolo ordenado y eficiente. ¡Una pequeña limpieza de vez en cuando siempre es buena idea!
6. Personalicemos “localhost”
Actualmente, el indicador de bash muestra localhost, lo cuál esta bien si solo tienes un servidor y solo quieras tener un servidor, pero te recomiendo cambiarlo para identificarlo mejor, por ejemplo con el nombre del dominio y proyecto. Así sabrás en donde estás conectado.
Tendremos que editar 2 archivos “hostname” y “hosts”
1 2 3 4 | # Editamos hostname con nano. sudo nano /etc/hostname # Cambia localhost por el nombre del dominio completo. |
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Editamos hostname con nano. sudo nano /etc/hosts # Dejamos la primera línea. Podemos dejar el dominio completo y una versión corta. # /etc/hosts 127.0.0.1 localhost 127.0.1.1 tudominio.com versioncorta # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
En el editor nano recuerda:
– Pegar con clic derecho (normalmente).
– ctrl + o Para guardar.
– ctrl + x Para salir.
1 | sudo reboot |
7. Configurar la Base de Datos (MariaDB)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Instalar MariaDB server sudo apt install mariadb-server # Revisar status del servicio MariaDB sudo systemctl status mariadb # Si todo esta ok aparecerá Active: active (running) # Si no esta iniciado sudo systemctl start mariadb # Si no esta habilitado sudo systemctl enable mariadb |
8. MySQL Secure Installation
1 | sudo mysql_secure_installation |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # Paso 1 NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and haven't set the root password yet, you should just press enter here. Enter current password for root (enter for none): # R: Enter → NO tenemos establecida una contraseña le damos enter. # Paso 2 Switch to unix_socket authentication [Y/n] # R: N → Opción de autenticación de socket Unix, diremos que no, usaremos la autenticación estandar. # Paso 3 Change the root password? [Y/n] # R: Y → Establece una contraseña para el usuario root. By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. # Paso 4 Remove anonymous users? [Y/n] # R: Yes → Eliminar cuentas de usuario anónimas: Estas cuentas pueden ser utilizadas por cualquier usuario, incluso desde hosts remotos, por lo que es recomendable eliminarlas. # Paso 5 Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] # R: Yes → Deshabilitar el inicio de sesión root de forma remota. # Paso 6 By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] # R: Yes → Eliminar la base de datos 'test': Esta es una base de datos que se crea por defecto y que cualquier usuario puede acceder. Eliminarla reduce el riesgo de exposición a pruebas maliciosas. # Paso 7 Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] # Yes → Recargar las tablas de privilegios: Esto asegura que todos los cambios hechos anteriormente tengan efecto inmediato. |
9. Crea la Base de Datos
1 | sudo mariadb |
1 2 3 4 5 6 7 8 9 10 11 12 | # Puedes sustituir la palabra nextcloud por el nombre que quieras para tu Base de Datos. CREATE DATABASE nextcloud; # Verificamos mostrando las Bases de Datos existentes. SHOW DATABASES; # NO COPIES igual, crea tu usuario y contraseña. # Este comando da al usuario "EligeTuUsuario" todos los permisos sobre la base de datos "nextcloud" y también establece/verifica que su contraseña es "CreaTuContraseña", todo mientras se conecta desde el mismo servidor donde está la base de datos. GRANT ALL PRIVILEGES ON nextcloud.* TO 'EligeTuUsuario'@'localhost' IDENTIFIED BY 'CreaTuContraseña'; #ecarga los privilegios en MySQL o MariaDB, aplicando de inmediato los cambios realizados en permisos de usuarios. FLUSH PRIVILEGES; |
10. Instala Apache
1 | sudo apt install apache2 |
11. Instala PHP y otras dependencias
1 | sudo apt install php php-apcu php-bcmath php-cli php-common php-curl php-gd php-gmp php-imagick php-intl php-mbstring php-mysql php-zip php-xml libapache2-mod-php php-bz2 php-ctype php-dom php-json php-posix zip unzip wget |
12. Habilita los módulos necesarios de Apache
1 | sudo a2enmod rewrite dir mime env headers |
13. Reinicia el servicio de apache2
1 2 3 4 5 6 7 8 | # Reiniciar el servicio de apache2 sudo systemctl restart apache2 # Verificar el servicio de apache2 sudo systemctl status apache2 # Siempre es buena idea revisar si todos los módulos se habilitaron correctamente. sudo apache2ctl -M |
14. En PHP habilita:
1 | sudo phpenmod bcmath gmp imagick intl |
15. Descargamos última versión de Nextcloud
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # Verifica que tengas instalado wget which wget # Si no lo tienes usa para instalar sudo apt install wget # Descargamos Nextcloud wget https://download.nextcloud.com/server/releases/latest.zip # Descomprimimos. unzip latest.zip # Removemos el .zip rm latest.zip # Recomiendo cambiar el nombre de la carpeta (por ejemplo el del dominio). mv nextcloud NuevoNombreDelDirectorio.com # Cambiamos permisos de la carpeta. sudo chown -R www-data:www-data NuevoNombreDelDirectorio.com # Movemos nuestra carpeta a /var/www/ sudo mv NuevoNombreDelDirectorio.com /var/www/ # Podemos verificar que se movió exitosamente. ls -l /var/www/ |
16. Deshabilitemos el sitio predeterminado de apache
1 2 3 4 | sudo a2dissite 000-default.conf # Nos pedira recargar apache. sudo systemctl reload apache2 |
17. Crear un archivo de configuración de host para Nextcloud
Asegúrate de ajustar los nombres para que coincidan con los tuyos.
1 | sudo nano /etc/apache2/sites-available/NuevoNombreDelDirectorio.com.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <VirtualHost *:80> # Definimos el directorio raíz del dominio DocumentRoot "/var/www/NuevoNombreDelDirectorio.com" # Nombre del servidor ServerName NuevoNombreDelDirectorio.com # Registro de errores y accesos ErrorLog /var/log/apache2/NuevoNombreDelDirectorio.com_error.log CustomLog /var/log/apache2/NuevoNombreDelDirectorio.com_access.log combined <Directory "/var/www/NuevoNombreDelDirectorio.com/"> # Opciones para el directorio Options -Indexes +FollowSymlinks AllowOverride All # Configuración de acceso Require all granted </Directory> </VirtualHost> |
He actualizado un poco este archivo:
– Orden de las directivas: En la configuración mejorada, he movido ErrorLog
y CustomLog
fuera del bloque Directory
. Es más estándar tener estas directivas al nivel del VirtualHost en lugar de dentro del bloque del directorio.
– Registro (Logging): Cambié TransferLog
por CustomLog ... combined
. Este último añade más información al registro, como el referente y el agente de usuario, lo que puede ser útil para analizar el tráfico.
– Opciones de directorio: En la configuración mejorada, desactivé el listado de directorios con Indexes
. Esto evita que, si no hay un archivo index en un directorio, se muestre un listado completo del contenido del directorio, lo cual es una buena práctica de seguridad.
– Control de acceso: Reemplacé las directivas Order
, Allow
y Deny
por Require all granted
. Esto se debe a que las primeras tres están obsoletas desde Apache 2.4 en adelante y Require
es la forma moderna de controlar el acceso.
.conf para Apache 2.3.* o inferior:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <VirtualHost *:80> DocumentRoot "/var/www/NuevoNombreDelDirectorio.com" ServerName NuevoNombreDelDirectorio.com <Directory "/var/www/NuevoNombreDelDirectorio.com/"> Options MultiViews FollowSymlinks AllowOverride All Order allow,deny Allow from all </Directory> TransferLog /var/log/apache2/NuevoNombreDelDirectorio.com_access.log ErrorLog /var/log/apache2/NuevoNombreDelDirectorio.com_error.log </VirtualHost> |
18. Edita el archivo de configuración principal de Apache
El archivo de configuración principal de Apache depende de cómo y dónde se haya instalado Apache, así como de la distribución de Linux que estés utilizando. Aquí te dejo una guía general:
httpd.conf: Este archivo es el archivo de configuración principal en muchas instalaciones de Apache, especialmente en las que se instalan a partir del código fuente y en algunas distribuciones de Linux.
apache2.conf: Es típico de las instalaciones de Apache en distribuciones de Linux basadas en Debian, como Ubuntu.
Para determinar cuál de estos archivos debes editar, puedes hacer lo siguiente:
Si estás en una distribución basada en Debian (como Ubuntu), probablemente tu archivo principal sea apache2.conf
. Puedes verificar su existencia con:
1 2 3 4 5 6 7 | # Si estás en una distribución basada en Debian (como Ubuntu), probablemente tu archivo principal sea apache2.conf ls /etc/apache2/apache2.conf # Si estás en otras distribuciones, puedes buscar el archivo httpd.conf con: ls /etc/httpd/conf/httpd.conf # o en otra posible ubicación: ls /etc/apache2/httpd.conf |
apache2.conf
si estás en una distribución basada en Debian, o httpd.conf
en otras distribuciones.1 2 | # Identificado el archivo procedemos a editarlo sudo nano /etc/apache2/apache2.conf |
Casi al final del archivo .conf para Apache 2.4.* o superior:
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Include the virtual host configurations: IncludeOptional sites-enabled/*.conf # ↑ Después de # Protección contra Clickjacking Header always append X-Frame-Options SAMEORIGIN # Evitar que el servidor muestre su versión ServerTokens Prod ServerSignature Off # ↓ Antes de # vim: syntax=apache ts=4 sw=4 sts=4 sr noet |
Encabezados de seguridad: Añadí Header always append X-Frame-Options SAMEORIGIN
para proteger contra Clickjacking, impidiendo que tu sitio sea mostrado en un iframe desde un dominio diferente.
Ocultar versión de Apache: Agregué ServerTokens Prod
y ServerSignature Off
para que Apache no muestre su versión en los encabezados o en las páginas de error, lo que es otra buena práctica de seguridad.
19. Habilitar .conf
1 2 3 4 | sudo a2ensite NuevoNombreDelDirectorio.com.conf # Te Pedirá recargar apache2. sudo systemctl reload apache2 |
20. Instalamos y configuramos PHP-FPM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # Instalamos php-fpm. sudo apt install php8.1-fpm # Revisamos que este corriendo php-fpm. service php8.1-fpm status # Saber la versión de php-fpm. php-fpm8.1 -v # Socket. ls -la /var/run/php/php8.1-fpm.sock # Deshabilita el módulo prefork de Apache. sudo a2dismod php8.1 sudo a2dismod mpm_prefork # Activamos php-fpm sudo a2enmod mpm_event proxy_fcgi setenvif sudo a2enconf php8.1-fpm # Verificamos, systemctl es más versátil y detallado en sistemas que utilizan systemd. sudo systemctl status php8.1-fpm service php8.1-fpm status |
21. Configurar php.ini
1 2 3 4 5 6 7 8 | # Saber mi versión de PHP php -v # Ubicación si estás usando PHP-FPM con Nginx o Apache: /etc/php/8.1/fpm/php.ini # Ubicación si estás usando el módulo mod_php con Apache: /etc/php/8.1/apache2/php.ini |
¿No estás seguro?, si estás usando PHP-FPM con Nginx / Apache o módulo mod_php con Apache, comprueba con phpinfo()
1 | sudo nano /var/www/NuevoNombreDelDirectorio.com/info.php |
1 2 3 | <?php phpinfo(); ?> |
php.ini
que está siendo utilizado.
No olvides eliminar el archivo info.php
después de haber comprobado la información para mantener la seguridad de tu servidor.22. Parámetros php.ini
1 2 3 4 | # Abrimos php.ini sudo nano /etc/php/8.1/fpm/php.ini # o sudo nano /etc/php/8.1/apache2/php.ini |
1 2 3 4 5 6 7 8 9 10 11 | memory_limit = 512M upload_max_filesize = 512M max_execution_time = 360 post_max_size = 512M date.timezone = "America/Mexico_City" 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 |
memory_limit = 512M: establece el límite de memoria que un script PHP puede consumir a 512 megabytes.
upload_max_filesize = 512M: define el tamaño máximo permitido para archivos cargados a 200 megabytes.
max_execution_time = 360: determina que un script PHP puede ejecutarse hasta 360 segundos antes de ser terminado.
post_max_size = 512M: especifica que el tamaño máximo para datos enviados mediante el método POST es de 200 megabytes.
date.timezone = “America/Mexico_City”: configura la zona horaria predeterminada a la de Ciudad de México.
opcache.enable=1: habilita la extensión OPcache. Cuando está establecido en 1, OPcache mejora el rendimiento almacenando bytecode precompilado en la memoria compartida, eliminando así la necesidad de cargar y analizar scripts en cada solicitud.
opcache.interned_strings_buffer=8: determina la cantidad de memoria, en megabytes, reservada para almacenar cadenas internadas. Cuando una cadena se interna, es almacenada una vez en memoria y se reutiliza, lo que puede mejorar el rendimiento y reducir el uso de memoria.
opcache.max_accelerated_files=10000: establece el número máximo de archivos que pueden ser acelerados por OPcache. Este valor determina cuántos scripts PHP pueden ser optimizados y guardados en el caché.
opcache.memory_consumption=128: define el tamaño, en megabytes, de la memoria compartida que se utilizará para almacenar el bytecode de PHP en OPcache.
opcache.save_comments=1: indica si se deben guardar o no los comentarios de los scripts PHP. Al establecer este valor en 1, todos los comentarios en el código PHP se conservarán cuando se almacenen en el caché. Esto puede ser necesario para algunas bibliotecas o herramientas que dependen de la presencia de comentarios en el código, como las anotaciones.
opcache.revalidate_freq=1: establece con qué frecuencia, en segundos, se deben verificar los archivos de script PHP para detectar cambios. Un valor de 1 significa que OPcache verificará los scripts en cada solicitud para ver si han sido modificados y, en caso afirmativo, los recompilará y almacenará en el caché.
23. Configurar php-fpm pool
1 | sudo nano /etc/php/8.1/fpm/pool.d/www.conf |
1 2 3 4 5 6 7 8 9 10 | pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 6 # Reiniciamos sudo systemctl restart php8.1-fpm # Comprobamos sudo systemctl status php8.1-fpm |
24. Directivas de Apache para el procesamiento de archivos PHP por php-fpm
1 | sudo nano /etc/apache2/sites-available/NuevoNombreDelDirectorio.com.conf |
1 2 3 | <FilesMatch ".php$"> SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/" </FilesMatch> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <VirtualHost *:80> # Definimos el directorio raíz del dominio DocumentRoot "/var/www/NombreDominio.com" # Nombre del servidor ServerName NombreDominio.com # Registro de errores y accesos ErrorLog /var/log/apache2/NombreDominio.com_error.log CustomLog /var/log/apache2/NombreDominio.com_access.log combined <Directory "/var/www/NombreDominio.com/"> # Opciones para el directorio Options -Indexes +FollowSymlinks AllowOverride All # Configuración de acceso Require all granted </Directory> # Directivas de Apache para el procesamiento de archivos PHP por php-fpm <FilesMatch ".php$"> SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/" </FilesMatch> </VirtualHost> |
1 2 3 4 5 6 7 8 9 | # Reiniciamos apache2 sudo systemctl restart apache2 # Reiniciamos php sudo systemctl restart php8.1-fpm # Verifica apache2 sudo systemctl status apache2 # Verifica php sudo systemctl status php8.1-fpm |
25. Instalar Nextcloud mediante comando CLI
1 | cd /var/www/NombreDelDirectorio.com/ |
1 | sudo -u www-data php occ maintenance:install --database "mysql" --database-name "NombreDeTuBaseDeDatos" --database-user "UsuarioDeTuBaseDeDatos" --database-pass "ContraseñaDeTuBaseDeDatos" --admin-user "UsuarioParaNextCloud" --admin-pass "ContraseñaParaNextCloud" |
Si lo hiciste bien, el comando mostrará “Nextcloud was successfully installed”
26. Soluciona el error ‘Acceso a través de un Dominio no Confiable’ en config.php
1 | sudo nano /var/www/NombreDelDirectorio.com/config/config.php |
1 2 3 4 | 'trusted_domains' => [ 0 => 'localhost', 1 => 'NombreDelDirectorio.com', ], |
1 | 'memcache.local' => '\OC\Memcache\APCu', |
1 2 3 4 | 'trusted_proxies' => [ 0 => 'AquiTuIPv4', 1 => '[AquiTuIPv6]', ], |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php $CONFIG = array ( 'instanceid' => '***', 'passwordsalt' => '***', 'secret' => '***', 'trusted_domains' => [ 0 => 'localhost', 1 => 'NombreDelDirectorio.com', ], 'datadirectory' => '/var/www/NombreDelDirectorio.com/data', 'trusted_proxies' => 0 => '*.*.*.*', 1 => '[*:*::*:*:*:*]', ], 'dbtype' => 'mysql', 'version' => '27.1.3.2', 'overwrite.cli.url' => 'http://localhost', 'dbname' => '***', 'dbhost' => 'localhost', 'dbport' => '', 'dbtableprefix' => '**_', 'mysql.utf8mb4' => true, 'dbuser' => '***', 'dbpassword' => '***', 'installed' => true, 'memcache.local' => '\OC\Memcache\APCu', ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php $CONFIG = array( 'instanceid' => '***', 'passwordsalt' => '***', 'secret' => '***', 'trusted_domains' => 0 => 'localhost', 1 => 'NombreDelDirectorio.com', ], 'datadirectory' => '/var/www/NombreDelDirectorio.com/data', 'trusted_proxies' => 0 => '*.*.*.*', 1 => '[*:*::*:*:*:*]', ], 'dbtype' => 'mysql', 'version' => '27.1.*.*', 'overwrite.cli.url' => 'http://localhost', 'dbname' => '*', 'dbhost' => '*', 'dbport' => '', 'dbtableprefix' => '**_', 'mysql.utf8mb4' => true, 'dbuser' => '**', 'dbpassword' => '**', 'default_phone_region' => 'MX', 'memcache.local' => '\OC\Memcache\APCu', 'filelocking.enabled' => true, 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => [ 'host' => '/var/run/redis/redis.sock', 'port' => 0, 'dbindex' => 0, 'password' => '', 'timeout' => 1.5, ], 'htaccess.RewriteBase' => '/', 'installed' => true, ); |
1 2 3 4 5 6 7 8 9 | # Reiniciamos apache2 sudo systemctl restart apache2 # Reiniciamos php sudo systemctl restart php8.1-fpm # Verifica apache2 sudo systemctl status apache2 # Verifica php sudo systemctl status php8.1-fpm |
27. Instala y configura Redis
1 2 3 4 5 6 7 8 | # Instalamos Redis sudo apt-get install redis-server php-redis # Iniciamos Redis sudo systemctl start redis-server # Habilitamos sudo systemctl enable redis-server |
Configura Redis para usar sockets Unix en lugar de puertos.
1 | sudo nano /etc/redis/redis.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # ↓ Debajo de # Accept connections on the specified port, default is 6379 (IANA #815344). # If port 0 is specified Redis will not listen on a TCP socket. port 0 unixsocket /var/run/redis/redis.sock unixsocketperm 770 # TCP listen() backlog. # ↑ Antes de # Reiniciamos redis sudo systemctl restart redis # Verificamos redis sudo systemctl status redis # Comprobamos la ruta de redis.sock ls -la /var/run/redis/redis.sock # Añade el usuario de Apache al grupo Redis. sudo usermod -a -G redis www-data |
1 | sudo nano /var/www/NombreDelDirectorio.com/config/config.php |
1 2 3 4 5 6 7 8 9 | 'filelocking.enabled' => true, 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => [ 'host' => '/var/run/redis/redis.sock', 'port' => 0, 'dbindex' => 0, 'password' => '', 'timeout' => 1.5, ], |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php $CONFIG = array ( 'instanceid' => '***', 'passwordsalt' => '***', 'secret' => '***', 'trusted_domains' => [ 0 => 'localhost', 1 => 'NombreDelDirectorio.com', ], 'datadirectory' => '/var/www/NombreDelDirectorio.com/data', 'trusted_proxies' => 0 => '*.*.*.*', 1 => '[*:*::*:*:*:*]', ], 'dbtype' => 'mysql', 'version' => '27.1.3.2', 'overwrite.cli.url' => 'http://localhost', 'dbname' => '***', 'dbhost' => 'localhost', 'dbport' => '', 'dbtableprefix' => '**_', 'mysql.utf8mb4' => true, 'dbuser' => '***', 'dbpassword' => '***', 'installed' => true, 'memcache.local' => '\OC\Memcache\APCu', 'filelocking.enabled' => true, 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => [ 'host' => '/var/run/redis/redis.sock', 'port' => 0, 'dbindex' => 0, 'password' => '', 'timeout' => 1.5, ], ); |
1 | sudo nano /etc/php/8.1/fpm/php.ini |
1 2 3 4 5 6 7 8 9 10 11 12 | # ↓ Debajo de ; Sets the size of the cache limit. (Max. number of WSDL files to cache) soap.wsdl_cache_limit = 5 ;Enable Redis session locking redis.session.locking_enabled = 1 redis.session.lock_retries = -1 redis.session.lock_wait_time = 10000 [sysvshm] ; A default size of the shared memory segment # ↑ Antes de |
1 2 3 4 5 6 7 8 9 | # Reiniciamos apache2 sudo systemctl restart apache2 # Reiniciamos php sudo systemctl restart php8.1-fpm # Verifica apache2 sudo systemctl status apache2 # Verifica php sudo systemctl status php8.1-fpm |
Ahora, podemos verificar el uso de Redis (activando el puerto de Redis en la configuración de Redis) ejecutando el comando “redis-cli MONITOR”. Durante la carga de Nextcloud, mostrará datos en tiempo real en la pantalla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Ruta sudo nano /etc/redis/redis.conf # Cambiamos el puerto de 0 a 6379 Momentaneamente # Reseteamos sudo systemctl restart redis # comando para ver en tiempo real sudo redis-cli MONITOR # y cualquier accion en nextcloud lo veremos en tiempo real # Vuelve a cambiar el puerto a 0, reinicia redis y listo |
28. Instala SSL
Puedes usar https://certbot.eff.org/instructions, pero no lo haré de esta forma en esta ocasión.
Vamos a usar “python3-certbot-apache”.
Usar sudo snap install --classic certbot
es como tener una aplicación en tu teléfono que se actualiza automáticamente cada vez que hay una nueva versión, sin que tengas que preocuparte por nada. Por otro lado, con sudo apt-get install python3-certbot-apache
, es como si descargases una app que necesita que tú, de vez en cuando, la revises y actualices manualmente. Ambas opciones hacen prácticamente lo mismo, pero una te da actualizaciones automáticas y la otra te permite decidir cuándo y cómo actualizar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # Instalamos. sudo apt-get install python3-certbot-apache -y # Con la herramienta certbot, solicitemos un certificado para nuestro dominio. sudo certbot --apache -d NombreDelDominio.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): # correo@dominio.com → Introduce la dirección de correo electrónico (utilizada para avisos urgentes de renovación y de seguridad) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: # R → teclea "Y" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: # R → teclea "Y" |
29. Habilitar el módulo HTTP2 de Apache y configura el sitio para los protocolos http2
1 | sudo a2enmod http2 |
1 | sudo nano /etc/apache2/sites-enabled/NombreDelDominio.com-le-ssl.conf |
1 2 3 4 5 | # ↓ Debajo de <VirtualHost *:443> # permite el protocolo HTTP/2 y HTTP/1.1 Protocols h2 h2c http/1.1 |
1 2 3 4 5 6 7 | sudo systemctl restart apache2 # Verificamos curl -I --http2 -s https://NombreDelDominio.com/ | grep HTTP #deberías recibir: HTTP/2 302 |
Resolver problemas de Nextcloud
1 | sudo nano /etc/apache2/sites-enabled/NombreDelDominio.com-le-ssl.conf |
1 2 3 4 | # No permitir ninguna conexión usando HTTP <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" </IfModule> |
1 2 | # Reiniciamos apache2 sudo systemctl restart apache2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <IfModule mod_ssl.c> <VirtualHost *:443> # permite el protocolo HTTP/2 y HTTP/1.1 Protocols h2 h2c http/1.1 # Definimos el directorio raíz del dominio DocumentRoot "/var/www/NombreDelDirectorio.com" # Nombre del servidor ServerName NombreDelDirectorio.com # Registro de errores y accesos ErrorLog /var/log/apache2/NombreDelDirectorio.com.log CustomLog /var/log/apache2/NombreDelDirectorio.com_access.log combined # No permitir ninguna conexión usando HTTP <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" </IfModule> <Directory "/var/www/NombreDelDirectorio.com/"> # Opciones para el directorio Options -Indexes +FollowSymlinks AllowOverride All # Configuración de acceso Require all granted </Directory> # Directivas de Apache para el procesamiento de archivos PHP por php-fpm <FilesMatch ".php$"> SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/" </FilesMatch> SSLCertificateFile /etc/letsencrypt/live/NombreDelDirectorio.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/NombreDelDirectorio.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule> |
1 | sudo nano /var/www/NombreDelDirectorio.com/config/config.php |
1 | 'default_phone_region' => 'MX', |
Pretty URL’s
1 | sudo nano /var/www/NombreDelDirectorio.com/config/config.php |
1 2 | # Agrega la siguiente línea: 'htaccess.RewriteBase' => '/', |
1 2 | # Ejecuta este comando qué actualizará el archivo .htaccess para la redirección. sudo -u www-data php --define apc.enable_cli=1 /var/www/NombreDelDirectorio.com/occ maintenance:update:htaccess |
Actualiza tu sistema
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # update sudo apt update # upgrade sudo upgrade ó # dist-upgrade sudo apt dist-upgrade # Eliminar paquetes parciales sudo apt-get autoclean # Borrar todos los paquetes .deb sudo apt-get clean # Eliminar paquetes como dependencias que el sistema ya no necesita sudo apt-get autoremove # Eliminar paquetes huérfanos # Para poder eliminar estos paquetes debemos instalar Deborphan. sudo apt-get install deborphan # Luego, ejecuta el siguiente comando: sudo deborphan | xargs sudo apt-get -y remove --purge # Reiniciar tu sistema sudo reboot |
Así debería de verse tu config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php $CONFIG = array( 'instanceid' => '***', 'passwordsalt' => '***', 'secret' => '***', 'trusted_domains' => [ 0 => 'localhost', 1 => 'NombreDelDominio.com', ], 'datadirectory' => '/var/www/NombreDelDominio.com/data', 'trusted_proxies' => [ 0 => 'AquiTuIPv4', 1 => '[AquiTuIPv6]', ], 'dbtype' => 'mysql', 'version' => '***', 'overwrite.cli.url' => 'http://localhost', 'dbname' => 'NombreDeTuBaseDeDatos', 'dbhost' => 'localhost', 'dbport' => '', 'dbtableprefix' => 'TuPrefijo_', 'mysql.utf8mb4' => true, 'dbuser' => '***', 'dbpassword' => '***', 'default_phone_region' => 'MX', 'memcache.local' => '\OC\Memcache\APCu', 'filelocking.enabled' => true, 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => [ 'host' => '/var/run/redis/redis.sock', 'port' => 0, 'dbindex' => 0, 'password' => '', 'timeout' => 1.5, ], 'htaccess.RewriteBase' => '/', 'installed' => true, ); |
0 comentarios