Servidor Perfecto · 13 min read · Oct 02, 2025
El Servidor Perfecto - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)
El Servidor Perfecto - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)
Versión 1.0
Autores: Till Brehm, Srijan Kishore y Falko Timme
Sigue a howtoforge en Twitter
Este tutorial muestra cómo preparar un servidor CentOS 7 x86_64 para la instalación de ISPConfig 3, y cómo instalar ISPConfig 3 en él. ISPConfig 3 es un panel de control de alojamiento web que te permite configurar los siguientes servicios a través de un navegador web: servidor web nginx, servidor de correo Postfix, MySQL, servidor de nombres BIND, PureFTPd, SpamAssassin, ClamAV, Mailman, y muchos más. Desde la versión 3.0.4, ISPConfig viene con soporte completo para el servidor web nginx además de Apache; este tutorial cubre la configuración de un servidor que utiliza nginx, no Apache. El tutorial del servidor perfecto de ISPConfig 3 para apache está disponible aquí.
Manual de ISPConfig 3
Para aprender a usar ISPConfig 3, recomiendo encarecidamente descargar el Manual de ISPConfig 3.
En aproximadamente 300 páginas, cubre el concepto detrás de ISPConfig (administrador, revendedores, clientes), explica cómo instalar y actualizar ISPConfig 3, incluye una referencia para todos los formularios y campos de formulario en ISPConfig junto con ejemplos de entradas válidas, y proporciona tutoriales para las tareas más comunes en ISPConfig 3. También detalla cómo hacer que tu servidor sea más seguro y viene con una sección de solución de problemas al final.
1. Requisitos
Para instalar un sistema así necesitarás lo siguiente:
- Descarga los dos DVDs de CentOS 7.0 desde un espejo cercano a ti (la lista de espejos se puede encontrar aquí: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7.0-1406-x86_64-DVD.iso.
- Una conexión a internet rápida
2. Nota Preliminar
En este tutorial utilizo el nombre de host server1.example.com con la dirección IP 192.168.0.100 y la puerta de enlace 192.168.0.1. Estos ajustes pueden diferir para ti, así que debes reemplazarlos donde sea apropiado. Por favor, instala la instalación mínima de CentOS 7 desde este enlace de tutorial antes de continuar.
3 Instalar el editor nano y ajustar /etc/hosts
yum -y install nano wget
A continuación, editamos /etc/hosts. Haz que se vea así:
nano /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100 server1.example.com server1
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6y establece el nombre de host en server1.example.com:
echo ‘server1.example.com’ > /etc/hostname
4 Configurar el Firewall e instalar algunos software de red básicos
(Puedes omitir este capítulo si ya has deshabilitado el firewall al final de la instalación del sistema básico.)
Quiero instalar ISPConfig al final de este tutorial, que viene con su propio firewall. Por eso deshabilito el firewall predeterminado de CentOS ahora. Por supuesto, eres libre de dejarlo encendido y configurarlo a tus necesidades (pero entonces no deberías usar ningún otro firewall más adelante, ya que probablemente interferirá con el firewall de CentOS).
Ejecuta
systemctl stop firewalld.service
systemctl disable firewalld.service
[root@server1 ~]# systemctl disable firewalld.service
rm ‘/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service’
rm ‘/etc/systemd/system/basic.target.wants/firewalld.service’
[root@server1 ~]# y desactiva el firewall.
Para comprobar que el firewall realmente ha sido deshabilitado, puedes ejecutar
firewall-cmd –state
despues. La salida debería verse así:
[root@server1 ~]# firewall-cmd –state
not running
[root@server1 ~]#
yum -y install net-tools NetworkManager-tui
5 Deshabilitar SELinux
SELinux es una extensión de seguridad de CentOS que debería proporcionar seguridad extendida. En mi opinión, no lo necesitas para configurar un sistema seguro, y generalmente causa más problemas que ventajas (piensa en ello después de haber hecho una semana de solución de problemas porque algún servicio no estaba funcionando como se esperaba, y luego descubres que todo estaba bien, solo que SELinux estaba causando el problema). Por lo tanto, lo desactivo (esto es un requisito si deseas instalar ISPConfig más adelante).
Edita /etc/selinux/config y establece SELINUX=disabled:
nano /etc/selinux/config
# Este archivo controla el estado de SELinux en el sistema.
# SELINUX= puede tomar uno de estos tres valores:
# enforcing - La política de seguridad de SELinux se aplica.
# permissive - SELinux imprime advertencias en lugar de aplicar.
# disabled - No se carga ninguna política de SELinux.
SELINUX=disabled
# SELINUXTYPE= puede tomar uno de estos dos valores:
# targeted - Los procesos dirigidos están protegidos,
# mls - Protección de Seguridad de Múltiples Niveles.
SELINUXTYPE=targeted
Después debemos reiniciar el sistema:
reboot
6 Habilitar Repositorios Adicionales E Instalar Algunos Software
Habilitaremos los repositorios EPEL en nuestro sistema CentOS ya que muchos de los paquetes que vamos a instalar a lo largo de este tutorial no están disponibles en los repositorios oficiales de CentOS 7.0:
yum -y install epel-release
yum -y install yum-priorities
Edita /etc/yum.repos.d/epel.repo…
nano /etc/yum.repos.d/epel.repo
… y agrega la línea priority=10 a la sección [epel]:
[epel]
name=Paquetes Extra para Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]Luego actualizamos nuestros paquetes existentes en el sistema:
yum update
Ahora instalamos algunos paquetes de software que se necesitan más adelante:
yum -y groupinstall ‘Development Tools’
7 Cuota
(Si has elegido un esquema de particionado diferente al que yo hice, debes ajustar este capítulo para que la cuota se aplique a las particiones donde la necesites.)
Para instalar cuota, ejecutamos este comando:
yum -y install quota
Ahora comprobamos si la cuota ya está habilitada para el sistema de archivos donde se almacenan los datos del sitio web (/var/www) y del correo (var/vmail). En este ejemplo, tengo una gran partición raíz, así que busco ‘ / ‘:
mount | grep ‘ / ‘
[root@server1 ~]# mount | grep ‘ / ‘
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
[root@server1 ~]#
Si tienes una partición /var separada, entonces usa:
mount | grep ‘ /var ‘
en su lugar. Si la línea contiene la palabra “ noquota “, entonces procede con los siguientes pasos para habilitar la cuota.
Habilitando cuota en la partición / (raíz)
Normalmente habilitarías la cuota en el archivo /etc/fstab, pero si el sistema de archivos es el sistema de archivos raíz “/“, entonces la cuota debe ser habilitada mediante un parámetro de arranque del núcleo de Linux.
Edita el archivo de configuración de grub:
nano /etc/default/grub
busca la línea que comienza con GRUB_CMDLINE_LINUX y agrega rootflags=uquota,gquota a los parámetros de la línea de comandos para que la línea resultante se vea así:
[...]
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto vconsole.keymap=us rhgb quiet rootflags=uquota,gquota"
[...]
y aplica los cambios ejecutando el siguiente comando.
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak
grub2-mkconfig -o /boot/grub2/grub.cfg
y reinicia el servidor.
reboot
Ahora verifica si la cuota está habilitada:
mount | grep ‘ / ‘
[root@server1 ~]# mount | grep ‘ / ‘
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)
[root@server1 ~]#
Cuando la cuota está activa, podemos ver “ usrquota,grpquota “ en la lista de opciones de montaje.
Habilitando cuota en una partición /var separada
Si tienes una partición /var separada, entonces edita /etc/fstab y agrega,uquota,gquota a la partición / ( /dev/mapper/centos-var):
nano /etc/fstab
#
# /etc/fstab
# Creado por anaconda el Dom Sep 21 16:33:45 2014
#
# Los sistemas de archivos accesibles, por referencia, se mantienen bajo '/dev/disk'
# Consulta las páginas del manual fstab(5), findfs(8), mount(8) y/o blkid(8) para más información
#
/dev/mapper/centos-root / xfs defaults 1 1
/dev/mapper/centos-var /var xfs defaults,uquota,gquota 1 2
UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot xfs defaults 1 3
/dev/mapper/centos-swap swap swap defaults 0 0
Luego ejecuta
mount -o remount /var
quotacheck -avugm
quotaon -avug
para habilitar la cuota.
8 Sincronizar El Reloj Del Sistema
Es una buena idea sincronizar el reloj del sistema con un servidor NTP ( n etwork t ime p rotocol) a través de Internet. Simplemente ejecuta
yum -y install ntp
y tu hora del sistema siempre estará sincronizada.
9 Instalar MariaDB
Instalaremos el servidor y cliente de MariaDB de la siguiente manera:
yum -y install mariadb mariadb-server
Queremos que el servicio de Mariadb se ejecute al iniciar y después de iniciar el servicio como:
systemctl enable mariadb.service
systemctl start mariadb.service
Establece contraseñas para la cuenta root de MySQL:
mysql_secure_installation
[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: línea 379: find_mysql_client: comando no encontrado
NOTA: ¡SE RECOMIENDA EJECUTAR TODAS LAS PARTES DE ESTE SCRIPT PARA TODOS LOS SERVIDORES MariaDB EN USO DE PRODUCCIÓN! ¡LEE CADA PASO CUIDADOSAMENTE!
Para iniciar sesión en MariaDB y asegurarla, necesitaremos la contraseña actual para el usuario root. Si acabas de instalar MariaDB, y no has establecido la contraseña de root aún, la contraseña estará en blanco, así que solo debes presionar enter aquí. <–ENTER
Ingresa la contraseña actual para root (presiona enter si no hay): <–ENTER
OK, se utilizó la contraseña correctamente, continuando…
Establecer la contraseña de root asegura que nadie pueda iniciar sesión en el usuario root de MariaDB sin la autorización adecuada.
¿Establecer contraseña de root? [Y/n] <–ENTER
Nueva contraseña: <–tucontraseñamariadb
Reingresa la nueva contraseña: <–tucontraseñamariadb
¡Contraseña actualizada con éxito!
Recargando tablas de privilegios..
… ¡Éxito!
Por defecto, una instalación de MariaDB tiene un usuario anónimo, permitiendo que cualquiera inicie sesión en MariaDB sin tener que tener una cuenta de usuario creada para ellos. Esto está destinado solo para pruebas, y para hacer que la instalación sea un poco más fluida. Deberías eliminarlos antes de pasar a un entorno de producción.
¿Eliminar usuarios anónimos? [Y/n] <–ENTER
… ¡Éxito!
Normalmente, solo se debería permitir que root se conecte desde ‘localhost’. Esto asegura que alguien no pueda adivinar la contraseña de root desde la red.
¿Deshabilitar inicio de sesión remoto de root? [Y/n] <–ENTER
… ¡Éxito!
Por defecto, MariaDB viene con una base de datos llamada ‘test’ a la que cualquiera puede acceder. Esto también está destinado solo para pruebas, y debería ser eliminado antes de pasar a un entorno de producción.
¿Eliminar la base de datos de prueba y el acceso a ella? [Y/n] <–ENTER
- Eliminando base de datos de prueba…
… ¡Éxito! - Eliminando privilegios sobre la base de datos de prueba…
… ¡Éxito!
Recargar las tablas de privilegios asegurará que todos los cambios realizados hasta ahora surtan efecto de inmediato.
¿Recargar tablas de privilegios ahora? [Y/n] <–ENTER
… ¡Éxito!
Limpiando…
¡Todo listo! Si has completado todos los pasos anteriores, tu instalación de MariaDB debería estar ahora segura.
¡Gracias por usar MariaDB!
[root@server1 ~]#
10 Instalar Dovecot
Dovecot se puede instalar de la siguiente manera:
yum -y install dovecot dovecot-pigeonhole dovecot-mysql
Crea un archivo dovecot-sql.conf vacío y un enlace simbólico:
touch /etc/dovecot/dovecot-sql.conf
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf
Ahora crea los enlaces de inicio del sistema y comienza Dovecot:
systemctl enable dovecot.service
systemctl start dovecot.service
11 Instalar Postfix
Postfix se puede instalar de la siguiente manera:
yum -y install postfix
Luego apaga Sendmail y comienza Postfix:
systemctl enable mariadb.service
systemctl start mariadb.service
systemctl stop sendmail.service
systemctl disable sendmail.service
systemctl enable postfix.service
systemctl restart postfix.service
12 Instalar Getmail
Getmail se puede instalar de la siguiente manera:
yum -y install getmail
13 Instalar Amavisd-new, SpamAssassin, Y ClamAV
Para instalar amavisd-new, spamassassin y clamav, ejecuta el siguiente comando:
yum -y install amavisd-new spamassassin clamav clamd clamav-update unzip bzip2 unrar perl-DBD-mysql
Edita el archivo de configuración freshclam /etc/freshclam.conf
nano /etc/freshclam.conf
y comenta la línea “Ejemplo”
[….]
[….]
Luego comenzamos freshclam, amavisd y clamd.amavisd:
sa-update
freshclam
systemctl enable amavisd.service
14 Instalar Nginx, PHP5 (PHP-FPM), Y Fcgiwrap
Nginx está disponible como un paquete para CentOS 7.0 (desde EPEL) que podemos instalar de la siguiente manera:
yum -y install nginx
Si Apache2 ya está instalado en el sistema, deténlo ahora…
systemctl stop httpd.service
… y elimina los enlaces de inicio del sistema de Apache:
systemctl disable httpd.service
Luego creamos los enlaces de inicio del sistema para nginx y lo comenzamos:
systemctl enable nginx.service
systemctl start nginx.service
(Si tanto Apache2 como nginx están instalados, el instalador de ISPConfig 3 te preguntará cuál deseas usar - responde nginx en este caso. Si solo uno de estos dos está instalado, ISPConfig hará la configuración necesaria automáticamente.)
Podemos hacer que PHP5 funcione en nginx a través de PHP-FPM (PHP-FPM (FastCGI Process Manager) es una implementación alternativa de PHP FastCGI con algunas características adicionales útiles para sitios de cualquier tamaño, especialmente sitios más concurridos). Podemos instalar php-fpm junto con php-cli y algunos módulos de PHP5 como php-mysql que necesitas si deseas usar MySQL desde tus scripts PHP de la siguiente manera:
yum -y install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-magickwand php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy
A continuación, abrimos /etc/php.ini…
nano /etc/php.ini
… y cambiamos el informe de errores (para que no se muestren más avisos):
[...]
;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting = E_ALL & ~E_NOTICE
[...]También establece cgi.fix_pathinfo=0:
nano /etc/php.ini
[...]
; cgi.fix_pathinfo proporciona soporte *real* para PATH_INFO/PATH_TRANSLATED para CGI. PHP's
; el comportamiento anterior era establecer PATH_TRANSLATED en SCRIPT_FILENAME, y no entender
; qué es PATH_INFO. Para más información sobre PATH_INFO, consulta las especificaciones de cgi. Establecer
; esto en 1 hará que PHP CGI corrija sus rutas para ajustarse a la especificación. Un ajuste
; de cero hace que PHP se comporte como antes. El valor predeterminado es 1. Deberías corregir tus scripts
; para usar SCRIPT_FILENAME en lugar de PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...](Consulta http://wiki.nginx.org/Pitfalls para averiguar por qué deberías hacer esto.)
Además de eso, para evitar errores como
[08-Aug-2011 18:07:08] PHP Warning: phpinfo(): No es seguro confiar en la configuración de zona horaria del sistema. Se requiere usar la configuración date.timezone o la función date_default_timezone_set(). En caso de que hayas utilizado alguno de esos métodos y aún estés recibiendo esta advertencia, lo más probable es que hayas escrito mal el identificador de zona horaria. Seleccionamos ‘Europa/Berlín’ para ‘CEST/2.0/DST’ en su lugar en /usr/share/nginx/html/info.php en la línea 2
… en /var/log/php-fpm/www-error.log cuando llamas a un script PHP en tu navegador, deberías establecer date.timezone en /etc/php.ini:
[...]
[Date]
; Define la zona horaria predeterminada utilizada por las funciones de fecha
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]A continuación, crea los enlaces de inicio del sistema para php-fpm y comienza:
systemctl enable php-fpm
systemctl restart php-fpm
PHP-FPM es un proceso daemon (con el script de inicio /etc/init.d/php-fpm) que ejecuta un servidor FastCGI en el puerto 9000.
Para obtener soporte CGI en nginx, instalamos Fcgiwrap.
Fcgiwrap es un envoltorio CGI que también debería funcionar para scripts CGI complejos y puede ser utilizado para entornos de alojamiento compartido porque permite que cada vhost use su propio directorio cgi-bin.
Como no hay un paquete fcgiwrap para CentOS 7.0, debemos construirlo nosotros mismos. Primero instalamos algunos requisitos previos:
yum -y install fcgi-devel
Ahora podemos construir fcgiwrap de la siguiente manera:
cd /usr/local/src/
git clone git://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
make install
Esto instala fcgiwrap en /usr/local/sbin/fcgiwrap.
A continuación, instalamos el paquete spawn-fcgi que nos permite ejecutar fcgiwrap como un daemon:
yum -y install spawn-fcgi
Abre /etc/sysconfig/spawn-fcgi…
nano /etc/sysconfig/spawn-fcgi
… y modifica el archivo de la siguiente manera:
# Debes establecer algunas opciones de trabajo antes de que el servicio "spawn-fcgi" funcione.
# Si SOCKET apunta a un archivo, entonces este archivo es limpiado por el script de inicio.
#
# Consulta spawn-fcgi(1) para todas las opciones posibles.
#
# Ejemplo :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=apache
FCGI_GROUP=apache
FCGI_EXTRA_OPTIONS="-M 0770"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"Ahora agrega el usuario nginx al grupo apache:
usermod -a -G apache nginx
Crea los enlaces de inicio del sistema para spawn-fcgi…
chkconfig spawn-fcgi on
… y comienza de la siguiente manera:
systemctl start spawn-fcgi
Ahora deberías encontrar el socket fcgiwrap en /var/run/fcgiwrap.socket, propiedad del usuario y grupo apache (algunos scripts, por ejemplo, Mailman, esperan ser ejecutados por el usuario/grupo apache, por eso no ejecutamos spawn-fcgi como usuario/grupo nginx, sino que agregamos nginx al grupo apache).
14.1 Versiones Adicionales de PHP
A partir de ISPConfig 3.0.5, es posible tener múltiples versiones de PHP en un servidor (seleccionables a través de ISPConfig) que pueden ser ejecutadas a través de FastCGI y PHP-FPM. El procedimiento para construir versiones adicionales de PHP en CentOS se describe en este tutorial: Cómo Usar Múltiples Versiones de PHP (PHP-FPM & FastCGI) Con ISPConfig 3 (CentOS 6.3)
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.