ISPConfig

ISPConfig

Instalación, configuración y mantenimiento integral de servidor con panel ISPConfig.


Prerrequisito

Una vez instalado Centos debemos seleccionar la versión base de PHP:

dnf module list dnf module enable php:7.4

Instalamos PHP, MariaDB, librerías y dependencias:

yum install epel-release yum-utils -y yum install php php-bcmath php-cli php-common php-gd php-intl php-mbstring php-mysqlnd php-pecl-apcu php-pdo php-pear php-soap php-xml php-ldap php-pecl-zip php-xmlrpc php-fpm gcc php-devel mod_fcgid mod_ssl ImageMagick php-cli libsodium php-pear php-devel libsodium-devel make composer -y

yum install nginx mariadb-server mailx -y

pecl install libsodium echo ‘extension=sodium.so’ > /etc/php.d/20-sodium.ini

Para montar comparticiones CIFS de la red necesitaremos yum install cifs-utils, además de abrir sus puertos en los cortafuegos (UDP:137,138;TCP:139,445).

Adicionalmente puede necesitar instalar manualmente Letsencrypt Certbot:

yum install certbot

Por desactualización con el servicio certbot de letsencrypt del repositorio de Centos, debemos instalarlo desde Snapdragon en caso de que no nos funcione la integración a la hora de certificar SSL desde el panel:

yum install snapd systemctl enable –now snapd.socket ln -s /var/lib/snapd/snap /snap

Debemos esperar un tiempo a que se aprovisione.

snap install core snap refresh core snap install –classic certbot ln -s /snap/bin/certbot /usr/bin/certbot rm -f /usr/bin/letsencrypt

En este punto debemos decidir si vamos a usar Jailkit o no, para instalarlo. No es nuestro caso.

A partir de ahora podemos ir añadiendo las excepciones a los accesos de los servicios en SElinux o, lo que es más fácil y eficiente para nuestro caso, deshabilitamos SElinux por completo:

Editamos su configuración:

nano /etc/selinux/config

Cambiamos la línea

SELINUX=enforcing

por

SELINUX=permissive

y lo deshabilitamos de inmediato (al reinicio leera la conifguración y no volvera a habilitarse):

setenforce 0

Habilitamos los servicios en el siguiente orden (httpd NO):

systemctl enable –now mariadb nginx php-fpm systemctl enable –now nginx systemctl enable –now php-fpm

Cambiamos la contraseña al usuario root de Mysql:

ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘ponercontraseña’; FLUSH PRIVILEGES;

Instalación

Copiamos la url del botón de descarga en la web de ISPconfig: https://www.ispconfig.org/ispconfig/download/

En la conexión ssh descargamos el instalador de la url copiada y lo descomprimimos. Por ejemplo:

wget https://ispconfig.org/downloads/ISPConfig-3.2.7p1.tar.gz tar -xvf ISPConfig-3.2.7p1.tar.gz

Navegamos hasta la carpeta de instalación e iniciamos el instalador (como root):

cd ispconfig3_install/install php install.php

Contestamos a los requerimientos haciendo hincapié en lo siguiente:

Instalación standard

Mysql charset: utf8mb4

(…) server to use(…): nginx

ISPconfig Port: 8083

Admin password: CAMBIAR LA CONTRASEÑA

Ignore DNS check (…): y

Rellenar los datos solicitados:

ES Madrid Centro MiEmpresa IT

admin@ejemplo.com

Y habiendo habilitado el nuevo objeto de red en el grupo de servidores Web del Cisco, ya podremos acceder al panel desde IPDELSERVIDOR:8083

Envío de correos

Una vez instalado mailx debemos añadir al final de \etc\mail.rc:

set from=info@ejemplo.com set smtp=smtp.office365.com:587 set smtp-auth=login set smtp-auth-user=info@ejemplo.com set smtp-auth-password=CONTRASEÑA set smtp-use-starttls set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/

Adicionalmente, añadiremos el módulo pear Mail.

Debemos crear configuraciones para cada instancia de PHP que hayamos instalado:

pear config-create /opt/remi/php74/root/usr/share/pear/pear ./php74

pear config-create /opt/remi/php80/root/usr/share/pear/pear ./php80

pear config-create /opt/remi/php82/root/usr/share/pear/pear ./php82

A continuación, instalaremos los módulos para cada instancia usando su configuración:

pear -C php74 install pear/Net_SMTP pear/Mail

pear -C php80 install pear/Net_SMTP pear/Mail

pear -C php82 install pear/Net_SMTP pear/Mail

Y añadimos al final del campo System > Server Config > Select Server > Web (tab) > PHP open_basedir

:/usr/share/pear:/opt/remi/php74/root/usr/share/pear:/opt/remi/php80/root/usr/share/pear:/opt/remi/php82/root/usr/share/pear

Trabajos programados y scripts

Para habilitar los trabajos no “enjaulados” (chroot) mediante Jailkit, debemos selección FullCRon en cliente>Límites>Límites de Cron Job>Tipo de trabajos programados permitidos (chrooted y/o url completa)

Clúster

Añadir servidor secundario

Instalaremos todos los prerrequisitos de ISPconfig en el nuevo servidor;

Nos aseguraremos de tener ambos servidores añadidos en el archivo /etc/hosts

192.168.1.10 server1.ejemplo.int

192.168.1.11 server2.ejemplo.int

Accedemos a mysql y creamos un usuario para la replicación:

mysql -uroot -p

GRANT REPLICATION SLAVE ON . TO ‘slaveuser’@‘192.168.1.%’ IDENTIFIED BY ‘contraseña’; FLUSH PRIVILEGES; quit;

Detenemos mysql y añadimos los siguientes parámetros a /etc/my.cnf en el servidor primario:

[mysql] default-character-set=utf8mb4

[mysqld] server-id = 1 replicate-same-server-id = 0 auto-increment-increment = 2 auto-increment-offset = 1 #lower_case_table_names = 1 #case insensitive collation-server = utf8mb4_unicode_ci init-connect=‘SET NAMES utf8mb4’ character-set-server = utf8mb4 ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem ssl-cipher=TLSv1.2,TLSv1.3 slow_query_log=0 #desactivar para cluster #skip-log-bin #disable_log_bin #activar para Cluster log_bin=/var/log/mariadb/mysql-bin.log expire_logs_days=10 max_binlog_size=500M

[mariadb] log_error=/var/log/mariadb/mariadb.err # This group is read both by the client and the server # use it for options that affect everything

[client-server]

# include all files from the config directory

!includedir /etc/my.cnf.d

Hacemos lo mismo en el secundario, el que vamos a añadir, antes de iniciar la instalación de ISPconfig:

[mysql] default-character-set=utf8mb4 [mysqld] server-id = 2 replicate-same-server-id = 0 auto-increment-increment = 2 auto-increment-offset = 2 #lower_case_table_names = 1 #case insensitive collation-server = utf8mb4_unicode_ci init-connect=‘SET NAMES utf8mb4’ character-set-server = utf8mb4 ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem ssl-cipher=TLSv1.2,TLSv1.3 slow_query_log=0 #desactivar para cluster #skip-log-bin #disable_log_bin #activar para Cluster log_bin=/var/log/mariadb/mysql-bin.log expire_logs_days=10 max_binlog_size=500M

[mariadb] log_error=/var/log/mariadb/mariadb.err

This group is read both both by the client and the server

use it for options that affect everything

[client-server]

include all files from the config directory

!includedir /etc/my.cnf.d

Generamos claves ssh en el primer servidor y las copiamos al secundario:

ssh-keygen

Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): <– ENTER Created directory ‘/root/.ssh’. Enter passphrase (empty for no passphrase): <– ENTER Enter same passphrase again: <– ENTER Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub.

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.11

Cambiamos lo siguiente en /etc/ssh/sshd_config en secundario:

PermitRootLogin yes

Reiniciamos el servicio:

service ssh restart

Copiamos los archivos y logs de mysql hasta el momento del servidor primario, y reconfiguramos sus permisos en el nuevo antes de reiniciar los servicios:

scp -pr /var/lib/mysql/* root@server2.ejemplo.int:/var/lib/mysql/

scp -pr /var/logs/mariadb/* root@server2.ejemplo.int:/var/logs/mariadb/

chown mysql:mysql /var/lib/mysql/* -Rf chown mysql:mysql /var/logs/mariadb/* -Rf

Iniciamos mysql en ambos de nuevo:

systemctl start mysql

Obtenemos el log y la posición para sincronizar el secundario:

mysql -u root –p

SHOW MASTER STATUS;

Insertaremos ambos campos resultantes (cambiarlos por las Z):

STOP SLAVE; CHANGE MASTER TO MASTER_HOST=‘192.168.1.11’, MASTER_USER=‘slaveuser’, MASTER_PASSWORD=‘contraseña’, MASTER_LOG_FILE=‘mysql-bin.ZZZZ’, MASTER_LOG_POS=ZZZ; START SLAVE;

Rápidamente, sin realizar ninguna consulta, copiaremos las mismas líneas en el secundario, cambiando la dirección IP por la del primario.

Comprobaremos que ambos servidores muestran YES en los campos Slave_IO_Running y Slave_SQL_Running:

SHOW SLAVE STATUS \G

Instalar ISPconfig en modo experto en el nuevo servidor, cambiando las siguiente opciones:

Installation mode (standard,expert) [standard]: expert

MySQL database to create [dbispconfig]:dbispconfig2

MySQL charset [utf8]: utf8mb4

ISPConfig mysql database username [ispconfig]: ispconfig2

Shall this server join an existing ISPConfig multiserver setup (y,n) [n]: y

MySQL master server hostname []: server1.ejemplo.int …

Usaremos también NGINX como servidor web y no crearemos un certificad SSL nuevo ni instalaremos Interfaz WEB.

Instalamos unison para sincronizar los archivos y datos:

yum install yum-utils

yum-config-manager –add-repo=https://copr.fedorainfracloud.org/coprs/croadfeldt/Unison/repo/centos-stream-8/croadfeldt-Unison-centos-stream-8.repo

yum install unison251

snap install unison-jz

ln -s /snap/unison-jz/current/bin/unison-2.51 /usr/bin/unison

Creamos un archivo de configuración:

mkdir .unison

nano .unison/web.prf

Pegamos el contenido cambiando la ip de nuestro servidor secundario:

root = /var/www

root = ssh://192.168.1.11//var/www

ignore = Name access.log ignore = Name error.log ignore = Name webalizer.conf

auto=true batch=true confirmbigdel=true

fastcheck=true

group=true

owner=true

prefer=newer

silent=true

times=false

log=false numericids=true

Creamos un script para correrlo en cronjob:

#!/bin/sh 

lockdir=/tmp 
UNISON=/usr/bin/unison 
LOGGER=/usr/bin/logger 

if [ ! -f /$lockdir/unison ]; then 
        touch $lockdir/unison 
        $UNISON -testserver web 
        rc=$? 
        if [ $rc -ne 0 ] ; then 
                echo "Error" 
                $LOGGER -d -t unison "web - Error conectando al remoto" 
        else 
                $UNISON web 
        fi 
        rm $lockdir/unison 
else 
    $LOGGER -d -t unison "Unison ya se encuentra en ejecución" 
fi 

Lo ejecutamos la primera vez, y luego lo programamos cada minuto en el panel de ISPconfig:

chmod +x unison.sh

./unison.sh

Accedemos a la interfaz que ya estaba corriendo en el servidor primario, y en la pestaña Sistema > Servicios del servidor clicamos el secundario. Seleccionaremos el servidor primario en “es espejo del servidor…”.

En Configuración del Servidor > Web > permisos, estableceremos para ambos servidores:

Permisos ISPConfig

Al disponer ya de sitios y datos corriendo, los sincronizaremos al secundario en Herramientas > Resync > Resync completo (todas las opciones).

Listo. info: https://www.howtoforge.com/tutorial/installing-a-web-email-and-mysql-database-cluster-on-debian-8.4-with-ispconfig-3/

Versiones adicionales de PHP

Instalar repositorios epel y remi.

dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Instalar versión de PHP adicional. Por ejemplo, 8.2:

yum install -y php82-php-bcmath php82-php-cli php82-php-common php82-php-fpm php82-php-gd php82-php-intl php82-php-mbstring php82-php-mcrypt php82-php-mysqlnd php82-php-opcache php82-php-pdo php82-php-pear php82-php-pecl-uploadprogress php82-php-soap php82-php-xml php82-php-xmlrpc php82-php-pecl-zip php82-php-ldap

systemctl enable –now php82-php-fpm

Añadir la nueva versión: Sistema > Versiones adicionales de PHP > Añadir versión de PHP:

Nombre

Servidor: Debe estar seleccionado el propio servidor.

Cliente: Al no especificar nada, todos los clientes tendrán la opción de cambiar sus webs a esta versión nueva.

Versión de PHP: Nombre que aparecerá en el desplegable (por ejemplo, 8.2)

Activo: Activar o desactivar esta versión

Opciones de FastCGI

Ruta a los binarios de PHP FastCGI: /opt/remi/php82/root/usr/bin/php-cgi

Ruta al directorio de php.ini: /etc/opt/remi/php82

Opciones de PHP-FPM

Ruta al archivo de arranque de PHP-FPM: php82-php-fpm

Ruta al directorio de php.ini: /etc/opt/remi/php82

Ruta al directorio de procesos de PHP-FPM: /etc/opt/remi/php82/php-fpm.d

PHP-FPM socket directory: DEJAR VACÍO

Solución de problemas

Si tras el cambio de versión en una web produce un error de servidor (502), hay que reiniciar el servicio FPM de la versión correspondiente. Por ejemplo:

systemctl restart php82-php-fpm

Aumentar requerimientos de las webs

Al utilizar PHP-FPM, añadir opciones de php o de NGINX globales no tiene resultado. Debemos añadir mediante ##merge## las opciones o requerimientos dentro de las directivas NGINX en un bloque @php:

Sitios > NombrePáginaWeb > Opciones > Directivas NGINX

Por ejemplo, para aumentar el tiempo de lectura de una API:

location @php {
  client_max_body_size 32M; #Tamaño permitido de archivos subidos 
  fastcgi_read_timeout  540; #Tiempo máximo de lectura de métodos PHP 
  proxy_connect_timeout 600s; #Tiempo máximo de conexión del proxy 
  proxy_send_timeout    600s; #Tiempo máximo de envío del proxy 
  proxy_read_timeout    600s; #Tiempo máximo de lectura del proxy 
}

Bug

Existe un bug por el cual una instalación reciente de Centos 8 no inicia este servicio. Para solucionarlo, debemos crear el archivo /etc/modprobe.d/blacklist-ipmi.conf con lo siguiente:

blacklist ipmi_si 
blacklist ipmi_devintf 
blacklist ipmi_msghandler 
blacklist ipmi_ssif 
blacklist ipmi_watchdog 
blacklist ipmi_poweroff 
blacklist acpi_ipmi 
blacklist ibmaem 
blacklist ibmpex
Soporte e Implantación

¿Necesitas ayuda implementando esta solución?

El equipo de ingenieros de Kuretes puede encargarse de la configuración, migración y mantenimiento seguro de estos entornos en tu infraestructura empresarial.