Guías · Nivel 2

IIS: sitios, enlaces, grupos de aplicaciones, certificados HTTPS y un 503 Service Unavailable

Sitios y enlaces con encabezado de host, grupos de aplicaciones (identidad, reciclado y versión de .NET CLR), el certificado HTTPS en el enlace, los logs W3C y HTTPERR, Failed Request Tracing, appcmd y PowerShell, y un 503 por un grupo detenido por la protección contra errores rápidos o por una contraseña caducada.

Qué vas a conseguir

Dar soporte a las aplicaciones web que corren en IIS: saber qué sitio responde a qué nombre, en qué grupo de aplicaciones corre y con qué cuenta, qué certificado entrega, dónde está el log de cada petición y qué hacer cuando la página dice HTTP Error 503. The service is unavailable.

Antes de empezar

  • Windows Server 2022 o 2025 con IIS 10 y permisos de administrador local.
  • Las características que esta guía usa: Install-WindowsFeature Web-Server, Web-Mgmt-Console, Web-Scripting-Tools, Web-Http-Tracing.
  • PowerShell como administrador, con WebAdministration (la unidad IIS:\) o IISAdministration (Get-IISSite, Get-IISAppPool). Los dos sirven; no los mezcles en el mismo script.

1. Sitios, enlaces y encabezados de host

Un sitio es una carpeta con uno o varios enlaces (bindings): protocolo, IP, puerto y nombre de host. Varios sitios comparten la IP y el puerto 443 si cada uno tiene su nombre:

Administrador de IIS · Sites › Add Website
Site nameReservas
Application poolReservas
Physical pathD:\Sites\Reservas
Bindinghttps · IP address: All Unassigned · Port: 443
Host namereservas.corp.example
Require Server Name Indication
SSL certificatereservas.corp.example (Contoso Issuing CA 01)
OK
  • Con HTTPS y varios sitios en el mismo puerto hace falta SNI (Require Server Name Indication): el navegador dice el nombre antes de recibir el certificado.
  • Cada sitio tiene un ID: su carpeta de logs se llama W3SVC<ID>. Apúntalo en la ficha de la aplicación.

Get-IISSite o appcmd list sites listan los sitios con su ID, su estado y sus enlaces.

2. Grupos de aplicaciones

El grupo de aplicaciones (application pool) es el proceso w3wp.exe que ejecuta el sitio. Un grupo por aplicación: si una se cuelga o se recicla, las demás siguen.

  • Identidad: por defecto, ApplicationPoolIdentity, una cuenta virtual llamada IIS AppPool\Reservas a la que se dan permisos NTFS sobre la carpeta. Si la aplicación necesita entrar en SQL Server o en un recurso compartido con autenticación de Windows, una cuenta de dominio; mejor una gMSA (CONTOSO\gmsa-reservas$, sin contraseña que caduque).
  • Versión de .NET CLR: v4.0 para ASP.NET 4.x; No Managed Code para ASP.NET Core, que lleva su propio runtime. Modo de canalización: Integrated.
  • Reciclado: por defecto, cada 1.740 minutos (29 horas), así que cada día a una hora distinta. Mejor una hora fija sin uso, como las 4:00. El Idle Time-out (20 minutos) apaga el proceso si nadie entra.
  • Rapid-Fail Protection: si el proceso falla 5 veces en 5 minutos, IIS detiene el grupo. Es el origen del 503 más frecuente.

Get-IISAppPool muestra el estado, la versión de CLR y la identidad de cada grupo; appcmd list wp, el PID de cada w3wp.exe, el que buscas en el Administrador de tareas cuando un proceso consume CPU.

3. El certificado HTTPS

  • El certificado va en el almacén del equipo, Local Machine › Personal, con su clave privada: Import-PfxCertificate -FilePath .\reservas.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $pwd.
  • El enlace guarda la huella (thumbprint) del certificado. Al renovarlo, el nuevo tiene otra huella y el enlace sigue con el viejo hasta que lo cambias.
PowerShell · cambiar el certificado del enlace
$thumb = (Get-ChildItem Cert:\LocalMachine\My | Where-Object Subject -like "*reservas.corp.example*" | Sort-Object NotAfter -Descending | Select-Object -First 1).ThumbprintImport-Module WebAdministration(Get-WebBinding -Name "Reservas" -Protocol https).AddSslCertificate($thumb, "My")netsh http show sslcert hostnameport=reservas.corp.example:443

netsh muestra lo que HTTP.sys tiene de verdad asociado a ese nombre y puerto.

4. Logs: W3C y HTTPERR

  • Logs de IIS en %SystemDrive%\inetpub\logs\LogFiles\W3SVC<ID>\, un fichero u_exAAMMDD.log por día en formato W3C. Las horas están en UTC: en Madrid, una o dos horas menos que el reloj.
  • Los campos clave: sc-status, sc-substatus y time-taken (milisegundos).
  • HTTPERR en %SystemRoot%\System32\LogFiles\HTTPERR\: lo que HTTP.sys rechazó antes de pasarlo a IIS. Un 503 con el grupo detenido aparece aquí, no en el log del sitio. El último campo es el motivo: AppOffline (los errores de la aplicación la han dejado fuera de servicio), Disabled (un administrador la ha detenido) o QueueFull (la cola está llena).

5. Failed Request Tracing

Cuando el log dice 500 y no se sabe qué módulo lo produce, Failed Request Tracing (FREB) guarda el recorrido completo de la petición:

  1. En el sitio, Actions › Failed Request Tracing... y marcar Enable (por defecto guarda hasta 50 ficheros).
  2. En Failed Request Tracing Rules, una regla: All content, códigos 500-599 o un tiempo mayor que 30 segundos.
  3. Reproducir el error. Los ficheros quedan en %SystemDrive%\inetpub\logs\FailedReqLogFiles\W3SVC<ID>\ y se abren con el navegador. Desactívalo al acabar.

Un 503 de un grupo detenido no deja traza en FREB: la petición se queda en HTTP.sys y nunca entra en IIS. Para ese caso, HTTPERR y el registro de eventos.

6. El ticket: "la aplicación de reservas da 503 Service Unavailable"

Lunes, 8:30. Recepción no puede abrir la aplicación de reservas: HTTP Error 503. The service is unavailable.

  1. El grupo: en el Administrador de IIS, Application Pools, Reservas aparece Stopped. HTTPERR lo confirma con 503 ... AppOffline Reservas.
  2. Por qué se detuvo: en el Visor de eventos › Registros de Windows › Sistema, origen WAS. Uno de estos dos eventos:
  • 5021: The identity of application pool Reservas is invalid. La contraseña de la cuenta CONTOSO\svc-reservas ha caducado o alguien la ha cambiado en el directorio activo. Tras varios intentos fallidos, WAS deshabilita el grupo.
  • 5002: Application pool 'Reservas' is being automatically disabled due to a series of failures. Es la protección contra errores rápidos: el proceso arranca y se cae. En el registro Aplicación, el error de w3wp.exe (evento 1000) o de .NET Runtime dice por qué, a menudo un despliegue del viernes.

Si es el 5021, la contraseña: comprobar la cuenta con Get-ADUser svc-reservas -Properties PasswordExpired, LockedOut, pedir el cambio de contraseña al responsable de la cuenta y ponerla en el grupo:

PowerShell · actualizar la identidad y arrancar el grupo
$cred = Get-Credential CONTOSO\svc-reservasImport-Module WebAdministrationSet-ItemProperty IIS:\AppPools\Reservas -Name processModel -Value @{userName=$cred.UserName; password=$cred.GetNetworkCredential().Password; identityType=3}Start-WebAppPool -Name "Reservas"(Invoke-WebRequest https://reservas.corp.example -UseBasicParsing).StatusCode200

Si es el 5002, los errores rápidos: arrancar el grupo no basta: se volverá a parar a los cinco fallos, y desactivar la protección solo esconde el problema. Primero la causa (deshacer el despliegue, la dependencia que falta, el web.config roto) y después Start-WebAppPool. Para que no se repita, el grupo pasa a una gMSA.

En el ticket: grupo, evento de WAS, causa, cambio y la comprobación final (200 desde fuera del servidor).

Siguientes pasos

  • La guía de Windows Server cubre los roles, los parches y los eventos del sistema que has usado aquí.
  • La de Nginx y Apache del Nivel 3 es lo mismo en Linux: sitios por nombre, certificados, proxy inverso y el 502.

¿Falta algo o en tu entorno es distinto? Escríbeme y lo corrijo.

Tech Career Lab · newsletter

¿Te ha servido? Cada dos semanas envío una idea práctica para perfiles IT: LinkedIn, proyectos, networking y procesos de selección.

Apúntate y llévate las 33 ideas →