Iniciar, detener y reiniciar Apache: comandos y la diferencia con graceful
En un servidor Linux, Apache se inicia, se detiene y se reinicia con el comando systemctl, y el nombre del servicio es httpd en la familia RHEL y apache2 en la familia Debian. Tras leer la salida de systemctl status, el archivo de unidad de httpd y el script apachectl en un servidor AlmaLinux 9, vimos que restart baja Apache y lo vuelve a levantar, mientras que graceful mantiene el proceso padre y solo vuelve a leer la configuración.
Como detener y reiniciar paran realmente el servicio, no ejecutamos start, stop ni restart en el servidor de prueba. En su lugar, comprobamos el comportamiento con la documentación oficial de Apache, el manual de httpd.service y los registros de reload que había en el servidor. El nombre de host, el número de puerto, las horas y el número de solicitudes de la salida siguiente son valores de ejemplo.
1️⃣ Comandos para iniciar, detener y reiniciar Apache
El nombre del servicio de Apache cambia según la familia de la distribución. En la familia RHEL, como RHEL, AlmaLinux y Rocky Linux, se registra en systemd como httpd, y en Ubuntu y Debian, como apache2.
| tareas | Familia RHEL (httpd) | Familia Debian (apache2) |
|---|---|---|
| Iniciar | systemctl start httpd | systemctl start apache2 |
| Detener | systemctl stop httpd | systemctl stop apache2 |
| Reiniciar | systemctl restart httpd | systemctl restart apache2 |
| Recargar la configuración (graceful) | systemctl reload httpd | systemctl reload apache2 |
| Ver el estado | systemctl status httpd | systemctl status apache2 |
| Inicio automático al arrancar | systemctl enable httpd | systemctl enable apache2 |
Ejecuta los comandos de la tabla como root. Si usas una cuenta normal, pon sudo delante del comando.
Si confundes la familia y usas el otro nombre, el comando no se ejecuta. Al consultar el estado con apache2 en un servidor de la familia RHEL, apareció un error que decía que no se encontraba la unidad.
systemctl status apache2Unit apache2.service could not be found.El código de salida fue 4, y al cambiar el nombre a httpd en el mismo servidor salió la salida normal.
En la familia RHEL, estos tres comandos inician, detienen y reinician Apache.
systemctl start httpdstart levanta un Apache que está detenido. Para comprobar que arrancó, usa systemctl status.
systemctl stop httpdstop detiene Apache. No acepta solicitudes web hasta que lo vuelvas a iniciar.
systemctl restart httpdrestart ejecuta stop y start uno tras otro. Si solo cambiaste archivos de configuración, aplícalos con reload (graceful), que no corta las conexiones.
En AlmaLinux 9, apachectl es un script de shell que sustituye al apachectl que distribuye Apache. Cuando recibe start, stop, restart o status, los pasa tal cual a systemctl, así que apachectl restart y systemctl restart httpd hacen lo mismo.
2️⃣ Ver el estado del servicio Apache
Para saber si Apache está en marcha ahora y cuándo se inició, usa systemctl status.
systemctl status httpd● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-10-17 08:30:49 UTC; 1 week 4 days ago
Docs: man:httpd.service(8)
Process: 2930107 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 741 (httpd)
Status: "Total requests: 52418; Idle/Busy workers 75/0;Requests/sec: 0.0528; Bytes served/sec: 3.9KB/sec"
Tasks: 224 (limit: 4615)
Memory: 184.3M (peak: 593.8M)
CPU: 47min 33.944s
CGroup: /system.slice/httpd.service
├─ 741 /usr/sbin/httpd -DFOREGROUND
├─2930111 /usr/sbin/httpd -DFOREGROUND
├─2930143 /usr/sbin/httpd -DFOREGROUND
└─2930144 /usr/sbin/httpd -DFOREGROUND
Oct 28 15:00:00 server systemd[1]: Reloading The Apache HTTP Server...
Oct 28 15:00:00 server systemd[1]: Reloaded The Apache HTTP Server.
Oct 28 15:00:00 server httpd[741]: Server configured, listening on: port 80active (running) en la línea [Active] significa que está en ejecución, y la hora que sigue a since es cuándo se inició. Este servidor se inició hace 11 días y no se detuvo ni una vez, y [Main PID] 741 era el proceso padre que se levantó entonces.
En [CGroup], lo que aparece debajo de 741 son procesos hijos que realmente atienden las solicitudes (ver Procesos). La línea [Status] muestra el número de solicitudes atendidas hasta ahora y cuántos workers están libres y cuántos ocupados.
Las tres líneas de registro al final de la salida eran registros de reload que quedaban una vez al día a la misma hora: la herramienta logrotate, que divide los registros por fecha, ejecutó systemctl reload httpd al terminar la rotación, y el manual de httpd.service también indica que httpd se recarga después de logrotate.
En scripts y comandos de comprobación se usan is-active e is-enabled, que muestran una sola palabra.
systemctl is-active httpdactiveCon el servicio en marcha salió active y el código de salida 0. Incluso con apache2, que no existe en el servidor, salió inactive y el código de salida 3, igual que un servicio detenido, así que en los scripts comprueba primero que el nombre del servicio sea correcto.
systemctl is-enabled httpdenabledenabled significa que Apache está registrado para iniciarse automáticamente al arrancar.
3️⃣ Diferencia entre reiniciar Apache y graceful
restart y graceful (reload) tratan de forma distinta las solicitudes en curso y el proceso padre. Primero comprobamos esa diferencia en las líneas del archivo de unidad de httpd que se usan para reload y stop.
systemctl cat httpd | grep -E "Exec|Kill"ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixedLa línea ExecReload significa que reload ejecuta httpd -k graceful, y la línea KillSignal significa que la señal que se envía en stop es SIGWINCH (graceful-stop).
Por eso systemctl restart httpd detiene Apache con graceful-stop y luego lo inicia de nuevo. Las solicitudes en curso se terminan antes de bajar, pero el propio proceso padre arranca de nuevo, así que cambia el número de [Main PID]. Entre la parada y el inicio el puerto se cierra y no se aceptan conexiones nuevas. El archivo de unidad apache2.service del paquete de Debian también ejecuta apachectl graceful-stop al detenerse.
httpd -k restart envía una señal HUP al proceso padre. Según la documentación oficial de Apache, el padre se mantiene, pero los procesos hijos terminan de inmediato, así que las solicitudes en curso se cortan y las estadísticas de solicitudes vuelven a 0.
graceful envía una señal USR1 al proceso padre. El padre vuelve a leer los archivos de configuración, y cada proceso hijo se sustituye por un hijo con la nueva configuración en cuanto termina la solicitud que estaba atendiendo. Las conexiones que llegan mientras tanto quedan en espera en el sistema operativo, así que no se pierden.
Es como una tienda que no cierra la puerta mientras cada cajero, al terminar con su cliente, cede el puesto a un compañero del nuevo turno.
Comprobamos esta diferencia con el Main PID. Aunque reload se ejecutaba cada día, el Main PID 741 y la hora de Active seguían igual que hace 11 días, y los números de los procesos hijos (2930111, etc.) venían justo después del 2930107 de la línea [Process] del último reload.
systemctl reload httpd, apachectl graceful y httpd -k graceful son el mismo graceful. En AlmaLinux 9, apachectl envía SIGUSR1 al proceso padre con systemctl kill cuando recibe graceful, y apachectl -k graceful, con -k delante, quita el -k y hace lo mismo.
graceful solo vuelve a leer la configuración, así que no sirve después de actualizar el paquete httpd. Según el manual de httpd.service, reload no es seguro si un módulo actualizado usa una función que solo existe en el nuevo httpd, por eso el paquete httpd reinicia Apache automáticamente con systemctl try-restart cuando se actualiza.
4️⃣ Comprobar la sintaxis de la configuración de Apache
Aunque apliques los cambios con graceful para no cortar conexiones, si un archivo de configuración tiene una errata, Apache no cambia a la nueva configuración. Según la documentación oficial de Apache, restart y graceful hacen primero una comprobación de sintaxis y, si hay un error, solo muestran el mensaje de error y no reinician.
Por eso, después de editar la configuración, comprueba primero la sintaxis con apachectl -t.
apachectl -tSyntax OKAl ejecutar apachectl -t salió una sola línea, Syntax OK, y con apachectl configtest el resultado fue el mismo. El apachectl de la familia RHEL ejecuta httpd -t tal cual cuando recibe -t.
Al comprobar un archivo de configuración de prueba con un nombre de directiva mal escrito, en lugar de Syntax OK salió el error AH00526 junto con el número de línea y la directiva que no reconoció ([Invalid command 'DirectoryIndx']), y el código de salida fue 1. Corrige la línea que indica el mensaje de error y vuelve a comprobar.
systemctl reload httpdSi la comprobación pasa, aplica la configuración con reload. Según la documentación oficial de Apache, la comprobación de sintaxis solo mira la sintaxis, así que la aplicación puede fallar aunque pase. Después de reload, revisa otra vez la línea [Active] de systemctl status y los registros del final.
🔲 Simulador de comandos de Apache
En el servidor virtual del simulador de abajo puedes escribir tú mismo comandos systemctl, apachectl y httpd -k. Después de reload, el Main PID sigue igual y solo cambian los números de los procesos hijos. Después de restart, cambia a un número nuevo incluso el Main PID.
🔢 FAQ & contenido recomendado
Apache · Error al reiniciar
Error al reiniciar Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
Por qué comandos como apachectl restart dan un error del archivo pid y los pasos para limpiar un httpd.pid vacío.
Apache · php-fpm
Aviso de php-fpm max_children: encuentra la causa en los logs antes de añadir workers
Un registro de cómo se encontró con los logs la causa de que se acumularan avisos de max_children en un servidor WordPress con Nginx, Apache y php-fpm.
ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.