IIS: Windows에서 사이트 운영하기
VPS에 IIS 웹 서버를 설치하고, 자신의 도메인으로 첫 사이트를 게시하고, 인증서를 발급하고, 로그에 파묻히지 않는 방법을 설명해요.
업데이트 2026년 8월 23일
IIS는 Windows Server에 내장된 웹 서버예요. ASP.NET 애플리케이션, 정적 콘텐츠, 그리고 로컬 포트에서 수신 대기하는 서비스 앞의 리버스 프록시로 잘 동작해요.
설치
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Install-WindowsFeature Web-Asp-Net48, Web-Http-Redirect, Web-Dyn-Compression
방화벽에서 포트를 열어 주세요:
New-NetFirewallRule -DisplayName "HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
제어판의 “개요” /hosting/vds/m/<id>에 있는 내 머신 주소에서 시작 페이지가 열리는지 확인해 보세요. 열리지 않으면 Windows 방화벽을 참고하세요.
첫 사이트
Import-Module WebAdministration
New-Item -ItemType Directory C:\sites\example
Set-Content C:\sites\example\index.html "<h1>It works</h1>"
New-WebAppPool -Name "example"
New-Website -Name "example" -Port 80 -HostHeader "example.ru" `
-PhysicalPath "C:\sites\example" -ApplicationPool "example"
호스트 헤더(-HostHeader)를 사용하면 하나의 주소에서 여러 사이트를 호스팅할 수 있어요. IIS는 도메인으로 사이트를 구분해요. 도메인은 A 레코드로 내 머신 주소를 가리켜야 해요.
사이트에는 디렉터리에 대한 최소한의 권한, 즉 읽기 권한만 있으면 돼요:
icacls C:\sites\example /grant "IIS AppPool\example:(OI)(CI)R" /T
HTTPS 인증서
무료 인증서를 받는 가장 쉬운 방법은 win-acme 클라이언트예요. wacs.exe를 내려받아 관리자 권한으로 실행하고 목록에서 사이트를 선택하면 인증서를 발급하고, 사이트에 바인딩하고, 갱신 작업을 만들어 줘요.
바인딩을 확인하려면:
Get-WebBinding -Name "example"
New-WebBinding -Name "example" -Protocol https -Port 443 -HostHeader "example.ru" -SslFlags 1
인증서를 발급하려면 외부에서 포트 80이 열려 있어야 해요. 도메인 검증이 이 포트를 통해 이루어져요.
IIS 뒤의 애플리케이션
서비스(Node, Python, .NET Kestrel)가 127.0.0.1:5000에서 수신 대기한다면 URL Rewrite와 Application Request Routing 모듈을 설치하고, 프록시를 활성화한 뒤 사이트의 web.config에 다음을 추가하세요:
<rule name="proxy" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://127.0.0.1:5000/{R:1}" />
</rule>
이렇게 하면 인증서가 있는 IIS만 외부에 노출되고, 애플리케이션은 localhost에 남아 있어요.
운영
Get-Website | Select-Object Name, State, PhysicalPath
Restart-WebAppPool example
Get-WebAppPoolState
로그는 C:\inetpub\logs\LogFiles에 저장되며 무한정 커져요. 40 GB 디스크에서는 금방 쌓여요. IIS Manager의 “Logging” 섹션에서 순환(일별 파일)을 설정하고, 예약 작업으로 오래된 로그를 삭제하세요:
Get-ChildItem C:\inetpub\logs\LogFiles -Recurse -File |
Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) | Remove-Item -Force
자주 발생하는 오류
- 오류 500.19 —
web.config가 손상되었거나 모듈이 없어요. 로컬 요청에 대해 자세한 메시지를 활성화하면 오류 텍스트에서 정확한 원인을 볼 수 있어요. - 애플리케이션 풀이 저절로 중지돼요. 신속 실패 보호가 작동한 거예요. 사이트가 충돌하면 IIS가 이를 종료해요. 애플리케이션 로그(
Get-WinEvent -LogName Application -MaxEvents 30)에서 원인을 찾아보세요. - 주소로는 사이트가 열리지만 도메인으로는 열리지 않아요. 호스트 헤더가 일치하지 않거나 DNS가 아직 갱신되지 않았어요.
- 게시 후 403이 발생해요. 애플리케이션 풀에 디렉터리 권한이 부여되지 않았어요.
사이트 디렉터리는
C:\inetpub밖에 두고C:\sites같은 별도 폴더에 두세요. 백업이 쉬워지고 데이터 손실 없이 시스템을 재설치할 수 있어요.