Windows

Cài đặt IIS và host website trên Windows Server

Bạn vừa thuê một VPS Windows và muốn host website ngay trên đó. IIS (Internet Information Services) là web server tích hợp sẵn trong Windows Server, không cần cài thêm phần mềm bên ngoài. Bài này mình sẽ hướng dẫn bạn cài đặt IIS, tạo website đầu tiên, cấu hình SSL và xử lý các lỗi thường gặp, áp dụng trên Windows Server 2022 và 2025.

Tóm tắt nhanh

  • IIS có sẵn trong Windows Server, chỉ cần bật qua Server Manager hoặc PowerShell.
  • Website mặc định nằm tại C:\inetpub\wwwroot, bind với port 80 và 443.
  • Dùng URL Rewrite và Application Request Routing để làm reverse proxy cho Node.js hoặc Python.
  • Windows Server 2025 là bản LTSC hiện tại, hỗ trợ đến 2034, thích hợp cho hạ tầng mới.

Yêu cầu trước khi bắt đầu

Vì sao chọn IIS thay vì Nginx hay Apache trên Windows?

IIS là web server được Microsoft phát triển riêng cho Windows, tích hợp sâu với hệ điều hành. Nó hỗ trợ ASP.NET, WebSocket, và quản lý qua giao diện đồ họa hoặc PowerShell. Nếu bạn chạy ứng dụng .NET thì IIS gần như là lựa chọn bắt buộc. Với các web tĩnh hoặc PHP, bạn vẫn dùng IIS được, nhưng Nginx trên Linux thường nhẹ hơn và dễ cấu hình hơn.

Điểm mạnh của IIS là khả năng quản lý tập trung qua IIS Manager, hỗ trợ Application Pool giúp cô lập tiến trình giữa các website. Bạn có thể chạy nhiều site trên một IP bằng Host Header, tương tự virtual host của Apache. Nếu bạn đã quen với Windows Server thì việc host website bằng IIS sẽ tiết kiệm thời gian hơn so với việc chuyển sang Linux.

Bước 1 - Cài đặt IIS qua Server Manager

Mở Server Manager từ thanh taskbar, chọn Add roles and features. Cách này phù hợp nếu bạn thao tác bằng giao diện đồ họa.

1. Nhấn "Add roles and features" trên màn hình Server Manager.
2. Chọn "Role-based or feature-based installation".
3. Chọn server hiện tại.
4. Tích chọn "Web Server (IIS)".
5. Nhấn Next, Next và Install.

Quá trình cài đặt mất khoảng 1-2 phút tùy tốc độ ổ cứng. Sau khi xong, bạn mở trình duyệt và gõ http://localhost, nếu thấy trang IIS Welcome thì cài đặt thành công.

Ngoài ra, bạn có thể cài IIS nhanh hơn bằng PowerShell. Mở PowerShell với quyền Administrator và chạy lệnh sau:

Install-WindowsFeature -Name Web-Server -IncludeManagementTools

Lệnh này cài IIS kèm IIS Management Console. Kiểm tra kết quả bằng:

Get-WindowsFeature Web-Server | Select-Object Name, InstallState

Output mong đợi: InstallState: Installed. Sau đó truy cập http://localhost để xác nhận trang mặc định hiển thị.

Bước 2 - Tạo website đầu tiên trên IIS

Sau khi cài IIS, website mặc định nằm tại C:\inetpub\wwwroot. Bạn có thể thay nội dung trong thư mục này để thay đổi trang chủ. Tuy nhiên, nếu muốn tạo một website riêng, nên tạo thư mục riêng và cấu hình web site mới trong IIS Manager.

Tạo thư mục chứa source code:

mkdir C:\web\mywebsite
notepad C:\web\mywebsite\index.html

Gõ nội dung HTML đơn giản và lưu lại. Sau đó mở IIS Manager, chuột phải vào Sites và chọn Add Website. Điền thông tin:

Site name: mywebsite
Physical path: C:\web\mywebsite
Host name: (để trống nếu muốn truy cập bằng IP)

Nhấn OK. Website sẽ được tạo và bind với port 80. Truy cập http://IP-cua-vps để xem kết quả. Nếu muốn dùng tên miền, bạn chỉ cần trỏ DNS A record về IP VPS và điền host name vào ô Host name ở trên.

Bước 3 - Mở port 80 và 443 trên Windows Firewall

Windows Server bật firewall mặc định, chặn mọi kết nối từ ngoài vào. Nếu bạn truy cập website từ máy khác mà không thấy hiển thị, gần như chắc chắn là do firewall chặn port. Mở PowerShell với quyền Administrator và chạy:

New-NetFirewallRule -DisplayName "HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow

Sau khi chạy xong, kiểm tra rule đã tồn tại:

Get-NetFirewallRule -DisplayName "HTTP" | Select-Object DisplayName, Enabled

Đến đây bạn đã có thể truy cập website bằng IP từ máy ngoài. Lưu ý là nếu VPS của bạn có thêm tầng firewall từ nhà cung cấp (như security group của cloud) thì cần mở thêm port ở đó nữa.

Bước 4 - Cấu hình HTTPS với SSL certificate

HTTPS là tiêu chuẩn bắt buộc cho website hiện nay, cả về bảo mật lẫn thứ hạng SEO. Trên IIS, bạn cần một SSL certificate. Có hai hướng: dùng chứng chỉ SSL trả phí từ GoGetSSL hoặc dùng Let's Encrypt miễn phí thông qua win-acme.

Cài win-acme bằng PowerShell (bản mới nhất, thay số phiên bản nếu cần):

Invoke-WebRequest -Uri "https://github.com/win-acme/win-acme/releases/download/v2.2.8.1951/win-acme.v2.2.8.1951.x64.pluggable.zip" -OutFile "$env:TEMP\win-acme.zip"
Expand-Archive -Path "$env:TEMP\win-acme.zip" -DestinationPath C:\win-acme

Chạy win-acme để tạo certificate Let's Encrypt:

cd C:\win-acme
.\wacs.exe

Chọn option N để tạo certificate mới, sau đó chọn website cần cấu hình. win-acme sẽ tự động gia hạn certificate trước khi hết hạn. Nếu bạn dùng SSL trả phí, cài trực tiếp qua IIS Manager:

1. Mở IIS Manager.
2. Chọn server, vào mục "Server Certificates".
3. Chọn "Import", trỏ tới file .pfx và nhập mật khẩu.
4. Chọn website, vào "Bindings", thêm binding loại https với certificate vừa import.

Sau khi cấu hình xong, truy cập https://ten-mien-cua-ban để kiểm tra. Nếu trình duyệt báo khóa xanh thì đã thành công. Nếu báo lỗi certificate không đúng tên miền, kiểm tra lại DNS A record và thông tin trong binding.

Bước 5 - Reverse proxy cho Node.js hoặc Python bằng IIS

IIS không chỉ host web tĩnh hay ASP.NET. Bạn có thể dùng nó làm reverse proxy để chạy Node.js hoặc Python phía sau. Cần cài hai module: URL Rewrite và Application Request Routing (ARR). Tải về từ https://www.iis.net/downloads/microsoft/url-rewritehttps://www.iis.net/downloads/microsoft/application-request-routing, cài cả hai rồi khởi động lại IIS.

Mở IIS Manager, chọn server, vào Application Request Routing Cache, chọn Server Proxy Settings và tích Enable proxy. Sau đó tạo hoặc sửa file web.config trong thư mục website:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="ReverseProxyToNode" stopProcessing="true">
          <match url="(.*)" />
          <action type="Rewrite" url="http://localhost:3000/{R:1}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Ví dụ trên chuyển mọi request đến port 3000, nơi Node.js app đang chạy. Kiểm tra bằng cách truy cập website, nếu thấy nội dung từ Node.js thì proxy hoạt động. Cách làm tương tự cho Python (Flask, Django) hoặc bất kỳ ứng dụng nào chạy trên port nội bộ.

Bước 6 - Cấu hình Application Pool và tối ưu cho production

Application Pool là vùng cách ly tiến trình giữa các website. Mỗi site nên có pool riêng để nếu một site bị lỗi hoặc ngốn CPU, các site khác không bị ảnh hưởng. Trong IIS Manager, vào Application Pools, chuột phải chọn Add Application Pool, đặt tên theo site rồi gán cho website trong mục Basic Settings.

Một số cài đặt nên kiểm tra trước khi đưa lên production:

1. .NET CLR Version: chọn "No Managed Code" nếu site chạy tĩnh hoặc PHP.
2. Start Mode: "AlwaysRunning" để site không bị tắt khi không có request.
3. Idle Time-out: đặt 0 để pool không tự giải phóng.
4. Recycling: đặt theo khung giờ thấp điểm (vd 03:00 sáng) để tránh gián đoạn.

Nếu bạn chạy PHP trên IIS, cần cài thêm PHP Manager và cấu hình handler cho *.php. IIS không hỗ trợ PHP sẵn như Apache hay Nginx. Cài PHP từ windows.php.net, giải nén vào C:\php, rồi thêm handler trong IIS Manager. Bạn có thể tham khảo cách triển khai PHP với LEMP stack trên Ubuntu nếu muốn so sánh hai hệ sinh thái.

Xử lý lỗi thường gặp khi host website trên IIS

Lỗi 403.14 - Forbidden là lỗi hay gặp nhất khi truy cập website IIS. Nguyên nhân do thư mục không có file mặc định (như index.html hoặc Default.htm) hoặc Directory Browsing bị tắt. Kiểm tra bằng cách thêm file index.html vào thư mục root.

Lỗi 502.3 - Bad Gateway thường xảy ra khi reverse proxy không kết nối được tới ứng dụng phía sau. Kiểm tra ứng dụng Node.js/Python đã chạy chưa bằng lệnh:

netstat -ano | findstr :3000

Nếu không thấy output, ứng dụng chưa chạy. Ngoài ra kiểm tra file web.config có đúng cú pháp hay không. Xem log IIS để chẩn đoán chi tiết:

Get-Content C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log -Tail 50

Lỗi HTTP 500.19 liên quan đến file web.config sai cú pháp hoặc thiếu module. Đọc kỹ thông báo lỗi, nó thường chỉ rõ dòng nào sai. Cài lại URL Rewrite hoặc xóa file web.config để test từng bước.

Nếu website truy cập từ ngoài không được nhưng localhost vẫn chạy, kiểm tra lại Windows Firewall và tầng firewall từ nhà cung cấp VPS. Cài thêm CrowdSec hoặc fail2ban (bản Linux) để chặn brute force nếu bạn mở RDP ra internet.

Câu hỏi thường gặp

IIS có miễn phí không?

Có. IIS là thành phần tích hợp sẵn trong Windows Server, bạn không cần trả thêm phí bản quyền riêng. Chi phí nằm trong license Windows Server của VPS.

Host website trên IIS hay Nginx tốt hơn?

Nếu chạy ứng dụng .NET thì IIS là lựa chọn tự nhiên. Với web tĩnh, PHP hay Node.js, Nginx trên Linux thường nhẹ hơn và dễ tối ưu hơn. Nếu bạn đã có sẵn VPS Linux, dùng Nginx sẽ tiết kiệm RAM hơn.

Làm sao để chạy nhiều website trên một IIS?

Tạo nhiều website, mỗi site dùng một Host Header (tên miền) khác nhau hoặc một port khác nhau. Vào Bindings của mỗi site để cấu hình host name tương ứng.

IIS có hỗ trợ HTTP/3 không?

Windows Server 2022 và 2025 hỗ trợ HTTP/3 khi dùng chung với tính năng QUIC. Bạn cần bật tính năng này và cấu hình binding với port 443. Nếu cần hướng dẫn chi tiết, tham khảo bài bật HTTP/3 trên Nginx để so sánh cách làm giữa hai nền tảng.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.