Overview
IIS (Internet Information Services) is the web server that ships with every copy of Windows Server. It’s not installed by default, but it’s a single role away. Once it’s running, you can host ASP.NET applications, static websites, PHP sites via FastCGI, and more — all managed through a graphical interface or PowerShell.
Most people land here because they’ve just spun up a Windows Server VPS and have no idea why their site isn’t accessible yet. The answer is almost always that IIS hasn’t been installed, or it has been installed but hasn’t been properly bound to their domain. This guide covers both.
The steps below apply to Windows Server 2019 and 2022. If you’re on a Host & Tech VPS SSD Hosting plan running Windows, this is where you start before deploying any web application.
Prerequisites
- Windows Server 2019 or 2022 (Standard or Datacenter edition)
- Administrator access to the server — either via RDP or directly at the console
- A static IP address assigned to the server (confirm this in Network Adapter Settings before you start)
- Firewall ports 80 (HTTP) and 443 (HTTPS) open — check your Host & Tech firewall rules or Windows Firewall if traffic isn’t reaching the server
- If you’re pointing a domain at this server, DNS should already be configured. Allow up to 24–48 hours for propagation, though it’s usually much faster.
Step-by-Step Instructions
Step 1: Install the IIS Role via Server Manager
The most straightforward way to install IIS on a fresh Windows Server is through Server Manager. If you prefer PowerShell, skip to Step 2.
- Open Server Manager (it usually opens automatically on login; if not, search for it in the Start menu).
- Click Manage in the top-right corner, then select Add Roles and Features.
- Click Next through the wizard until you reach the Server Roles screen.
- Check the box next to Web Server (IIS). A dialog will appear asking you to add required features — click Add Features.
- On the Role Services screen, you’ll see a list of IIS components. The defaults cover basic static file serving. If you’re running ASP.NET, expand Application Development and check ASP.NET 4.8 and .NET Extensibility 4.8. For PHP, you’ll add FastCGI support — check CGI under Application Development.
- Click Next, review the summary, then click Install. The install takes about 1–2 minutes.
📝 Note: You don’t need to restart the server after installing IIS in most cases, but the W3SVC (World Wide Web Publishing Service) will start automatically once the role is installed.
Step 2: Install IIS via PowerShell (Faster)
If you’re working headlessly or just prefer the command line, one command does the job. Open PowerShell as Administrator and run:
Install-WindowsFeature -Name Web-Server -IncludeManagementTools -IncludeAllSubFeature
The -IncludeAllSubFeature flag installs all IIS role services at once — static content, ASP.NET, CGI, logging, health/diagnostics, the works. It’s more than the minimum, but it saves you the annoyance of missing a sub-feature later and wondering why something doesn’t work.
To verify the installation succeeded:
Get-WindowsFeature -Name Web-Server | Select-Object Name, InstallState
You should see InstallState: Installed.
Step 3: Verify IIS Is Running
Open a browser on the server itself and go to http://localhost. You should see the default IIS welcome page — a blue screen that says “Internet Information Services.” If you see that, IIS is running.
You can also confirm via PowerShell:
Get-Service -Name W3SVC
The status should be Running. If it’s stopped, start it with:
Start-Service -Name W3SVC
Step 4: Open IIS Manager
IIS Manager is the GUI you’ll use to manage sites, application pools, bindings, and SSL certificates. Open it by pressing Win + R, typing inetmgr, and hitting Enter. Alternatively, find it in Server Manager > Tools > Internet Information Services (IIS) Manager.
Step 5: Add a New Website
The default IIS site serves files from C:inetpubwwwroot. For a real deployment, you’ll want your own site with its own folder and bindings.
- In IIS Manager, expand the server node in the left pane.
- Right-click Sites and select Add Website.
- Fill in the fields:
- Site name: Something descriptive, like
mysite.com - Physical path: The folder where your site files live, e.g.
C:inetpubsitesmysite.com - Binding: Leave Type as
http, set IP Address to your server’s IP or leave asAll Unassigned, Port80, and enter your domain in the Host name field (e.g.mysite.com)
- Site name: Something descriptive, like
- Click OK.
⚠ Warning: If you leave the Host name field blank and you have more than one site, IIS won’t know which site to serve for incoming requests. Always set the host name binding unless you’re running a single site with one IP.
📝 Note: Create the physical path folder before adding the site, or IIS will show a warning. You can do it quickly in PowerShell: New-Item -ItemType Directory -Path "C:inetpubsitesmysite.com"
Step 6: Configure Application Pool
Every IIS site runs under an Application Pool, which controls the .NET version and worker process settings. By default, a new pool is created with the same name as your site.
To adjust it: in IIS Manager, click Application Pools, right-click your pool, and select Basic Settings. If you’re hosting a classic ASP.NET app, set .NET CLR Version to v4.0. For modern ASP.NET Core apps, set it to No Managed Code (ASP.NET Core handles its own runtime via the hosting bundle).
I’d recommend setting the Identity of the app pool to a dedicated local user with only the permissions it needs, rather than leaving it as ApplicationPoolIdentity for anything public-facing.
Step 7: Allow IIS Through Windows Firewall
IIS installation doesn’t automatically open firewall ports. Run these commands in an elevated PowerShell session:
netsh advfirewall firewall add rule name="IIS HTTP" protocol=TCP dir=in localport=80 action=allow
netsh advfirewall firewall add rule name="IIS HTTPS" protocol=TCP dir=in localport=443 action=allow
If you’re on a Host & Tech VPS or dedicated server, also check the network-level firewall in your control panel — Windows Firewall and the host firewall are separate layers.
Step 8: Test External Access
From a different machine (not the server itself), open a browser and navigate to your server’s IP address. If you’ve configured a domain and DNS has propagated, test by domain name too. You should see your site or the default IIS page.
If nothing loads, work through the troubleshooting section below before assuming something is misconfigured in IIS.
Common Issues & Troubleshooting
HTTP Error 403.14 — Directory Listing Denied
This means IIS found the folder you pointed it to, but there’s no default document (like index.html or default.aspx) in it, and directory browsing is off. Either add an index.html file to your site folder, or go to IIS Manager > your site > Default Document and confirm the file names listed there match what you’ve actually deployed. This catches a lot of people who upload index.htm when IIS is looking for index.html.
HTTP Error 503 — Service Unavailable
The application pool has stopped. This usually happens because the pool crashed (often due to a bad app config or missing .NET version) or it hit the rapid-fail protection limit. In IIS Manager, go to Application Pools, find the pool for your site, and check its status. If it says Stopped, right-click and select Start. Check the Windows Event Viewer under Windows Logs > Application for the underlying error — that’s where the real cause hides.
Site Loads on localhost But Not Externally
Almost always a firewall issue. Confirm ports 80 and 443 are open in both Windows Firewall and your host-level firewall. You can test quickly from another machine using:
Test-NetConnection -ComputerName YOUR_SERVER_IP -Port 80
If TcpTestSucceeded returns False, the port is blocked somewhere in the network path — not inside IIS.
HTTP Error 500.19 — Internal Server Error (Config Error)
This error usually means IIS can’t read your web.config file — either the file has a syntax error, or the IIS worker process doesn’t have read permission on the site folder. Check permissions first: right-click the site folder, go to Security, and make sure IIS_IUSRS and your app pool identity have at least Read & Execute access. Then validate your web.config XML syntax — a missing closing tag will cause this every time.
IIS Manager Doesn’t Show After Installation
This happens when the IIS Management Console feature wasn’t included in the installation. Fix it with:
Install-WindowsFeature -Name Web-Mgmt-Console
Then run inetmgr again. It’ll be there.
Frequently Asked Questions
Does IIS come pre-installed on Windows Server?
No. IIS is available on every Windows Server edition but has to be manually installed as a server role. It’s not running out of the box. Use Server Manager or the PowerShell Install-WindowsFeature command to add it.
Can I run PHP on IIS?
Yes. You need to install the CGI role service in IIS, then download the PHP Windows binaries from php.net and configure a FastCGI handler in IIS Manager. It’s a bit more setup than PHP on Linux/Apache, but it works well. Microsoft’s official PHP on IIS documentation covers the handler mapping steps in detail.
How do I add an SSL certificate to IIS?
In IIS Manager, click on your server node, then open Server Certificates. From there you can import a PFX file, request a certificate from a CA, or create a self-signed cert for testing. After the cert is installed, go to your site’s Bindings, add an HTTPS binding on port 443, and select the certificate from the dropdown.
What's the default website folder path in IIS?
C:inetpubwwwroot is the default physical path for the built-in Default Web Site. You can put files there for quick testing, but for production sites you should create a dedicated folder (e.g. C:inetpubsitesyourdomain.com) and add a new site with its own bindings and app pool.
How do I restart IIS without rebooting the server?
Open an elevated command prompt or PowerShell and run iisreset. This recycles all application pools and restarts the IIS service without touching the rest of the server. You can also restart individual app pools in IIS Manager if you only need to reset one site’s worker process.