El contenido web de alojamiento propio es relevante para pequeñas y medianas empresas, propietarios de negocios, organizaciones sin fines de lucro e individuos.
No hay un límite real para quién puede hospedarse por sí mismo, pero los grupos conscientes de la privacidad se beneficiarán directamente y verán resultados inmediatos. Las pequeñas y medianas empresas obtendrán un sistema en pleno funcionamiento que se adhiere a todos los protocolos de seguridad y cifrado actuales, especialmente la especificación PCI.
Hay un montón de razones por las que el alojamiento propio es beneficioso, estas son algunas de ellas:
Este artículo trata sobre el alojamiento de servidores web. Si está interesado en el alojamiento de correo electrónico, lea el artículo sobre el alojamiento propio de su propio servidor de correo electrónico .
Asegúrese de que su servidor tenga un nombre de dominio completo (FQDN) y que el archivo /etc/hosts
tenga la IP del servidor apuntando al FQDN y no al nombre corto. Este es un requisito para algunas herramientas como OpenDKIM, que no funcionará sin un FQDN.
Para probar si su FQDN está configurado correctamente, ejecute:
# hostname -f server.example.tld
Si solo ve el nombre del servidor y no el FQDN, use el comando systemd hostnamectl
para configurar su FQDN:
# hostnamectl set-hostname server.example.tld
El primer paso es instalar algunos paquetes básicos, use su administrador de paquetes:
dnf para versiones más nuevas de EL8/EL9:
# dnf install php php-cli php-pdo php-mbstring epel-release unzip wget
mmm para EL7:
# yum install php php-cli php-pdo php-mbstring epel-release unzip wget
para Fedora, los paquetes son ligeramente diferentes:
# dnf install php php-cli php-pdo php-mbstring unzip wget
En el segundo paso, instalaremos el panel de control de alojamiento virtual de Aetolos, que solo genera archivos de configuración y no realiza ninguna otra modificación en el sistema:
# wget -O /root/master.zip 'https://gitlab.com/noumenia/aetolos/-/archive/master/aetolos-master.zip' # unzip /root/master.zip -d /root/ # mv /root/aetolos-master /root/aetolos # rm -rf /root/master.zip
El código de desarrollo más reciente se puede descargar desde el repositorio de git:
clon de git 'https://gitlab.com/noumenia/aetolos.git'
Ahora es el momento de elegir qué servicios proporcionará el servidor. Ejecute Aetolos con el parámetro de estado para tener una idea de todos los servicios disponibles:
# ~/aetolos/aetolos --status +---------+--------------+---------+------------+--------------+ | Enabled | Module | SystemD | Repository | Dependencies | +---------+--------------+---------+------------+--------------+ | [ ] | apache | | | | | [ ] | clamav | | epel | postfix | | [ ] | dehydrated | | | | | [ ] | dovecot | | | | | [ ] | haproxy | | | | | [ ] | mariadb | | | | | [ ] | mtasts | | | apache | | [ ] | nsd | | epel | | | [ ] | opendkim | | epel | postfix | | [ ] | opendmarc | | epel | postfix | | [✓] | php | | | | | [ ] | postfix | | | | | [ ] | postgrey | | epel | postfix | | [ ] | spamassassin | | | postfix | | [✓] | virtualhost | | | | +---------+--------------+---------+------------+--------------+
Como este va a ser un servidor web autohospedado, vamos a habilitar los servicios que nos brindan un conjunto completo de características para el alojamiento web:
Si tiene un servidor separado para correo electrónico con firmas DKIM, también debe habilitar OpenDKIM en este servidor. Luego comparta la clave entre los servidores para una firma adecuada.
Habilitemos estos servicios con Aetolos:
# ~/aetolos/aetolos --enable=apache # ~/aetolos/aetolos --enable=dehydrated # ~/aetolos/aetolos --enable=mariadb
Ahora podemos volver a ejecutar Aetolos con el parámetro de estado para ver la siguiente tabla:
+---------+--------------+---------+------------+--------------+ | Enabled | Module | SystemD | Repository | Dependencies | +---------+--------------+---------+------------+--------------+ | [✓] | apache | dead | | | | [ ] | clamav | | epel | postfix | | [✓] | dehydrated | | | | | [ ] | dovecot | | | | | [ ] | haproxy | | | | | [✓] | mariadb | dead | | | | [ ] | mtasts | | | apache | | [ ] | nsd | | epel | | | [ ] | opendkim | | epel | postfix | | [ ] | opendmarc | | epel | postfix | | [✓] | php | dead | | | | [ ] | postfix | | | | | [ ] | postgrey | | epel | postfix | | [ ] | spamassassin | | | postfix | | [✓] | virtualhost | | | | +---------+--------------+---------+------------+--------------+
Tenga en cuenta la columna SystemD que muestra la mayoría de los servicios como dead
. Esto no es un problema, porque aún no hemos configurado/iniciado esos servicios.
Finalmente, podemos ejecutar la configuración de Aetolos para instalar los paquetes RPM necesarios y generar todos los archivos de configuración. Preferimos ver la salida detallada con el parámetro extra --verbose
.
Notará una advertencia sobre el script deshidratado, que nos indica que especifiquemos la dirección de correo electrónico de registro para Let's Encrypt
# ~/aetolos/aetolos --verbose --setup [DEBUG] Check running system [DEBUG] Detected: AlmaLinux 8.7 (Stone Smilodon) [DEBUG] Check system memory [DEBUG] Detected: 460MiB [DEBUG] Check CPU cores [DEBUG] Detected: 2 [DEBUG] Check proxy [DEBUG] Loading Aetolos configuration [DEBUG] Starting operating system setup [DEBUG] Checking repository dependencies [DEBUG] Checking package dependencies [DEBUG] Installing package: php-fpm [DEBUG] Checking SELinux requirements [DEBUG] SELinux: enable httpd_can_network_connect [DEBUG] SELinux: enable httpd_can_sendmail [DEBUG] SELinux: enable httpd_read_user_content [DEBUG] SELinux: enable httpd_enable_homedirs [DEBUG] SELinux: enable httpd_home_tmp_aetolos.pp [DEBUG] Checking certificate requirements [DEBUG] Generating a self-signed certificate [DEBUG] Certificate: /etc/pki/tls/certs/localhost.crt [DEBUG] Fullchain: /etc/pki/tls/certs/localhost.fullchain [DEBUG] Key: /etc/pki/tls/private/localhost.key [DEBUG] Checking ACME client [DEBUG] Downloading ACME client: dehydrated 0.7.1 [DEBUG] Installing ACME client under: /root/dehydrated/ [WARNING] ACME registration email set to: postmaster [WARNING] Please change the ACME registration email by executing: '/root/aetolos/aetolos --verbose --module=dehydrated --registration-email=new-email' [DEBUG] Checking module dependencies [DEBUG] Save configuration: apache [DEBUG] Writing to file: /etc/httpd/conf/httpd.conf [DEBUG] Writing to file: /etc/httpd/conf.d/ssl.conf [DEBUG] Writing to file: /etc/sysconfig/htcacheclean [INFO] System memory: 460MB [INFO] Allocate 50% of system memory to MariaDB: 230MB [INFO] 70% of the above usage goes to total thread memory: 161MB [INFO] The rest 30% goes to server buffers: 69MB [INFO] MariaDB memory per connection: 18MB [INFO] MariaDB max connections: 10 [INFO] MariaDB temporary table size: 16MB [INFO] MariaDB query cache: 16MB [INFO] Allocate 40% of system memory to Apache/PHP-FPM: 184MB [INFO] Estimated average number of connections per CPU core: 9 [INFO] Apache StartServers: 1 [INFO] Apache ServerLimit: 2 [INFO] Apache ThreadsPerChild: 18 [INFO] Apache MinSpareThreads: 18 [INFO] Apache ThreadLimit: 22 [INFO] Apache MaxRequestWorkers: 36 [INFO] Apache maximum number of concurrent connections: 108 [DEBUG] Writing to file: /etc/logrotate.d/httpd [DEBUG] Save configuration: dehydrated [DEBUG] Writing to file: /root/dehydrated/config [DEBUG] Writing to file: /root/dehydrated/hook.sh [DEBUG] Writing to file: /etc/pki/letsencrypt/domains.txt [DEBUG] Writing to file: /etc/cron.daily/dehydrated.cron [DEBUG] Save configuration: mariadb [DEBUG] Writing to file: /etc/systemd/system/mariadb.service.d/limitnofile.conf [DEBUG] Writing to file: /etc/my.cnf.d/mariadb-server.cnf [DEBUG] Save configuration: php [DEBUG] Writing to file: /etc/php.ini [DEBUG] Writing to file: /etc/php.d/10-opcache.ini [DEBUG] Save configuration: virtualhost [DEBUG] Writing to file: /etc/tmpfiles.d/hometmp.conf [DEBUG] Reloading systemd
Según la advertencia, agregamos una dirección de correo electrónico para Let's Encrypt:
# ~/aetolos/aetolos --verbose --module=dehydrated [email protected]
A diferencia de otros servicios, MariaDB debe iniciarse y funcionar para que Aetolos agregue hosts virtuales y los permisos de base de datos correspondientes. Así que habilitemos e iniciemos MariaDB:
# systemctl --now enable mariadb
En este punto, podemos asegurar la instancia de MariaDB ejecutando:
/usr/bin/mysql_secure_installation
Esto requiere que también cree el archivo /root/.my.cnf
con los detalles de inicio de sesión para root:
[client] default-character-set="utf8mb4" user="root" password='the_password_set_in_the_previous_step'
Ahora estamos listos para agregar tantos hosts virtuales como queramos (o tantos como el servidor pueda manejar).
Antes de ejecutar cualquier comando, podemos tomarnos un segundo para pensar qué hosts virtuales tendrán un subdominio de prefijo, a veces podemos tener un dominio como ejemplo.tld con un subdominio www (www.ejemplo.tld), otras veces es posible que no queramos use un prefijo porque queremos nuestras direcciones de correo electrónico solo en el dominio superior ([email protected] y no [email protected]).
Como ejemplo, agregaremos tres hosts virtuales, dos de ellos sin subdominio:
# ~/aetolos/aetolos --verbose --module=virtualhost --add-virtualhost=example1.tld --no-prefix [DEBUG] Verify domain: example1.tld [DEBUG] Add virtual host: example1.tld # ~/aetolos/aetolos --verbose --module=virtualhost --add-virtualhost=example2.tld --no-prefix [DEBUG] Verify domain: example2.tld [DEBUG] Add virtual host: example2.tld # ~/aetolos/aetolos --verbose --module=virtualhost --add-virtualhost=example3.tld [DEBUG] Verify domain: example3.tld [DEBUG] Add virtual host: example3.tld
Ahora podemos enumerar todos los hosts virtuales:
# ~/aetolos/aetolos --module=virtualhost --list-virtualhosts +----+---------------------+--------------+-------------+----------------+--------+--------------+ | ID | Timestamp | Virtual host | System user | MariaDB prefix | Parked | Prefix alias | +----+---------------------+--------------+-------------+----------------+--------+--------------+ | 1 | 2023-01-10 08:51:36 | example1.tld | example1tld | example1 | [ ] | | | 2 | 2023-01-10 08:51:40 | example2.tld | example2tld | example2 | [ ] | | | 3 | 2023-01-10 08:51:45 | example3.tld | example3tld | example3 | [ ] | www | +----+---------------------+--------------+-------------+----------------+--------+--------------+
Cada host virtual "vivirá" aislado dentro de su propio directorio de inicio, con su propia propiedad de usuario/grupo, así que echemos un vistazo a nuestro /home:
# ls -la /home total 0 drwxr-xr-x. 5 root root 63 Jan 20 10:51 . dr-xr-xr-x. 17 root root 224 Dec 21 2021 .. drwx--x--x. 8 example1tld example1tld 159 Jan 10 08:51 example1tld drwx--x--x. 8 example2tld example2tld 159 Jan 10 08:51 example2tld drwx--x--x. 8 example3tld example3tld 159 Jan 10 08:51 example3tld
Después de realizar modificaciones con el comando Aetolos, necesitamos generar nuevos archivos de configuración para todos los servicios relevantes (Apache, PHP-FPM, Deshidratado, etc.). Por lo tanto, ejecutamos la configuración de Aetolos por última vez.
# ~/aetolos/aetolos --setup
En este punto, todos los servicios utilizarán el mismo certificado autofirmado, por lo que ahora es un buen momento para ejecutar deshidratado manualmente para recopilar todos los certificados de host virtual. Dado que Aetolos usa el protocolo ACME con validación de dominio a través del puerto HTTP 80, primero iniciamos nuestro servidor Apache para atender esas solicitudes.
# systemctl start httpd # ~/dehydrated/dehydrated --cron --config /root/dehydrated/config --keep-going # systemctl stop httpd # ~/aetolos/aetolos --setup
Ahora podemos habilitar e iniciar todos los servicios.
# systemctl --now enable httpd [email protected] [email protected] [email protected] mariadb php-fpm Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /usr/lib/systemd/system/[email protected]. Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /usr/lib/systemd/system/[email protected]. Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /usr/lib/systemd/system/[email protected].
Notará que cada host virtual tiene su propio servicio Apache, esta es una función proporcionada por systemd y nos permite definir los hosts virtuales en servicios systemd separados. El parámetro --now
iniciará todos los servicios.
Cabe hacer una mención especial a la arquitectura utilizada para el alojamiento de sitios web. Por razones de seguridad, cada host virtual está aislado dentro de las cuentas de Unix almacenadas en su propio directorio /home
. El contenido web público debe almacenarse en el directorio public_html
.
/home/example1tld -> virtual host home /home/example1tld/etc -> email accounts /home/example1tld/mail -> email storage /home/example1tld/public_html -> web content /home/example1tld/www -> symbolic link to public_html /home/example1tld/tmp -> temp directory
En este punto, Aetolos ha configurado el servidor sin modificaciones personalizadas, todos los cambios se realizan en los archivos de configuración predeterminados. Podemos eliminar Aetolos del servidor y continuar con las modificaciones manualmente o podemos conservar Aetolos en caso de que queramos agregar más servidores virtuales en el futuro.
Foto del artículo de Manuel Geissinger de pexels