
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
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=[email protected] set smtp=smtp.office365.com:587 set smtp-auth=login set smtp-auth-user=[email protected] 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 [email protected]
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/* [email protected]:/var/lib/mysql/
scp -pr /var/logs/mariadb/* [email protected]:/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:

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
¿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.