---
id: webserver-iis
title: "IIS"
shortTitle: "IIS"
track: webserver
trackTitle: "Web Server, Proxy & Load Balancer"
order: 4
level: normal
status: published
estimatedMinutes: 25
prerequisites:
  - webserver-tomcat
next: database-postgres
reviewedAgainst: 2026-10-12
sources:
  - title: "Introduction to IIS"
    url: https://learn.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architecture
  - title: "Web sites, applications, and virtual directories"
    url: https://learn.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-in-iis
---

# IIS

IIS phục vụ site trên Windows. Bài Windows Server đã nhắc service `W3SVC`. Bài này đi vào site, binding, và application pool.

## Để làm gì

Đọc một site đang gắn port nào, và biết vì sao pool dừng thì site không trả trang dù service WWW vẫn Running.

## Gồm những gì

- Site, binding, application pool.
- `web.config` ở thư mục app.
- Khi nào đứng sau ARR hoặc một reverse proxy khác.

Không gồm cài IIS lên máy đang dùng để học, và không gồm certificate store của Windows.

## Dùng khi nào

App ASP.NET hoặc file tĩnh đang nằm trên Windows Server thì ở lại IIS. Team mới trên Linux thì dùng Nginx hoặc Caddy, đừng mở thêm IIS cho một site.

Đừng dùng một application pool cho mọi site. Một app crash có thể kéo pool, và mọi site trong pool đó restart cùng lúc.

## Kiến thức cốt lõi

Service `W3SVC` là web server. Một site có binding: IP, port, và host header. Hai site không cùng một bộ ba đó. Host header giống ý `Host` của HTTP.

Application pool là process chạy app. Site trỏ tới một pool. Pool identity là user mà process dùng để đọc file. File trong thư mục site mà identity không đọc được thì lỗi 500 hoặc 401, service vẫn Running.

`web.config` là XML trong thư mục app. URL rewrite và một số module đọc file này. Sửa sai XML thì site không start, log nằm trong Event Log.

Application Request Routing (ARR) biến IIS thành reverse proxy trên Windows, cùng việc Nginx làm ở bài trước.

## Lệnh và code mẫu

PowerShell, không cần quyền admin để đọc:

```powershell
Get-Service W3SVC -ErrorAction SilentlyContinue |
  Select-Object Name, Status
```

Nếu đã cài IIS và có module quản trị:

```powershell
Get-Website | Select-Object Name, State, PhysicalPath, Bindings
```

Không có module thì lệnh thứ hai báo không nhận `Get-Website`. Đó là kết quả hợp lệ của lab trên máy chưa cài IIS.

## Thực hành

1. Chạy `Get-Service W3SVC`.
2. Chỉ chạy `Get-Website` khi máy này đã có IIS.
3. Không bật Windows feature trong bài này.

## Kết quả mong đợi

Máy không cài IIS thì không có service `W3SVC`, hoặc status không phải Running. Máy có IIS thì bạn thấy tên site và binding.

## Checklist

- [ ] Mỗi site một pool khi các app không cùng vòng đời.
- [ ] Binding trùng port và host thì site thứ hai không lên.
- [ ] Quyền NTFS của thư mục site khớp pool identity.

## Thẻ ôn

### webserver-iis-pool
kind: trap
cue: `W3SVC` vẫn Running mà trang trả 503 thì xem application pool của site, đừng chỉ restart service web. Một pool cho nhiều site thì một app crash có thể kéo cả pool.

Q: Trang IIS trả 503. Bạn xem service và `W3SVC` vẫn Running, nên restart service web. Vì sao có thể không hết, và một pool dùng chung cho nhiều site thì một app crash ảnh hưởng tới đâu?

A: `W3SVC` là service web của IIS, nó có thể đang chạy trong khi application pool của riêng site đã dừng. Process phục vụ site nằm ở pool, không phải ở chỗ status Running của service. Restart `W3SVC` mà không nhìn pool thì site vẫn 503. Mở đúng pool của site đó và xem vì sao nó dừng. Nếu nhiều site dùng chung một pool, một app crash có thể làm cả pool dừng, và các site không liên quan cũng 503 cùng lúc. Tách pool khi các site không nên chết theo nhau.

## Lỗi thường gặp

**Service Running mà trang 503.** Pool đã dừng. Xem pool của site, đừng chỉ restart `W3SVC`.

**Sửa `web.config` bằng editor làm hỏng XML.** IIS không phục vụ site đó. Event Log có dòng cấu hình. Giữ bản trước khi sửa, hoặc đưa file vào Git.

## Nguồn

1. [Introduction to IIS architecture](https://learn.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architecture) — service và module.
2. [Sites, applications, and virtual directories](https://learn.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-in-iis) — site và binding.

## Tiếp theo

[PostgreSQL cho vận hành](../database/01-postgres.md)
