Iniciar, detener y reiniciar Apache: comandos y la diferencia con graceful

Entorno de pruebaFamilia RHELAlmaLinux 9.8Cuenta rootVerificado el 2026-10-29

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.

tareasFamilia RHEL (httpd)Familia Debian (apache2)
Iniciarsystemctl start httpdsystemctl start apache2
Detenersystemctl stop httpdsystemctl stop apache2
Reiniciarsystemctl restart httpdsystemctl restart apache2
Recargar la configuración (graceful)systemctl reload httpdsystemctl reload apache2
Ver el estadosystemctl status httpdsystemctl status apache2
Inicio automático al arrancarsystemctl enable httpdsystemctl 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 apache2
Unit 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 httpd

start levanta un Apache que está detenido. Para comprobar que arrancó, usa systemctl status.

systemctl stop httpd

stop detiene Apache. No acepta solicitudes web hasta que lo vuelvas a iniciar.

systemctl restart httpd

restart 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 80

active (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 httpd
active

Con 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 httpd
enabled

enabled 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=mixed

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

🔁 Qué cambia en las tres formas de reiniciar Apache
Diagrama explicativo
🔁 Comando
$ systemctl restart httpdhttpd -k restartsystemctl reload httpd
① Proceso padre (Main PID)Se detiene y vuelve a iniciarseCambia el número de Main PID.Sin cambiosRecibe la señal HUP y vuelve a leer los archivos de configuración.Sin cambiosRecibe la señal USR1 y vuelve a leer los archivos de configuración.
② Solicitudes en cursoSe terminan y luego se cierraLa parada es graceful-stop (WINCH), así que las solicitudes en curso se terminan.Se cortan al instanteTermina los procesos hijos de inmediato y levanta hijos nuevos.Se atienden hasta el finalCada hijo se sustituye por uno con la nueva configuración al terminar su solicitud.
③ Conexiones nuevasNo se aceptan hasta que vuelve a arrancarCierra el puerto al detenerse.Se atienden cuando arrancan los hijos nuevosDeja el puerto abierto y las atiende cuando arrancan los hijos nuevos.No se cortanDeja el puerto abierto para que el sistema operativo ponga las conexiones en espera.
systemctl restart httpd detiene Apache y luego lo vuelve a iniciar, así que el propio proceso padre arranca de nuevo y entretanto no se aceptan conexiones nuevas.
httpd -k restart envía una señal HUP al proceso padre y termina los procesos hijos de inmediato, así que las solicitudes en curso se cortan.
systemctl reload httpd y apachectl graceful dejan el proceso padre como está y sustituyen los procesos hijos a medida que terminan sus solicitudes.

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 -t
Syntax OK

Al 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 httpd

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

Simulador de comandos de Apachehttpd de la familia RHEL
[root@server work]#
Con las teclas ↑↓ recuperas los comandos que escribiste antes.

🔢 FAQ & contenido recomendado

Al escribir apachectl fullstatus en AlmaLinux 9 salió un error que decía que la opción fullstatus no es compatible (not supported) y el código de salida 2. El apachectl de la familia RHEL es un script que sustituye al apachectl que distribuye Apache, así que solo acepta start, stop, restart, status, graceful, graceful-stop, configtest, -t y -v.

Según el manual de httpd.service, la unidad httpd viene desactivada (disabled) por defecto, y preset: disabled en la línea [Loaded] de systemctl status es ese valor por defecto. Si ejecutas systemctl enable httpd una vez, se inicia en cada arranque, y si añades --now a enable, también se inicia en ese mismo momento.

Según el manual de httpd.service, si ejecutas httpd directamente desde una shell de root, el servicio se inicia fuera de systemd y no se aplican las restricciones de seguridad predeterminadas, como SELinux. Por eso, inicia y detén el servicio con systemctl o apachectl, y usa el comando httpd solo para opciones que no levantan el servicio, como la comprobación de sintaxis -t.

ℹ️ 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 2   +   6   =