IIS:站点管理
发布时间:2026-04-23 08:00
一、前言
搞过IIS的人都知道,最烦的是每隔段时间就要新建站点、绑定域名、配证书,手动点图形界面点到你手抽筋。尤其遇到要批量部署或者紧急故障恢复时,鼠标操作简直是噩梦。这篇直接上命令行,让你5分钟搞定站点从创建到HTTPS配置全套流程。
二、操作步骤
步骤1:确认IIS已安装且WebAdministration模块可用
PS C:\> Import-Module WebAdministration; Get-Website | Select Name, State, PhysicalPath
Name State PhysicalPath
---- ----- ------------
Default Web Site Started C:\inetpub\wwwroot
能列出站点信息说明模块正常,没安装的话先跑 Add-WindowsFeature Web-Server。
步骤2:创建新站点目录结构
PS C:\> New-Item -Path "E:\WebApps\myapp" -ItemType Directory -Force
PS C:\> New-Item -Path "E:\WebApps\myapp\logs" -ItemType Directory
Directory: E:\WebApps\myapp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/3/15 10:30:48 logs
日志目录单独建,后面配access log和error log用得上,别全堆一起。
步骤3:创建应用程序池
PS C:\> Import-Module WebAdministration
PS C:\> New-WebAppPool -Name "MyAppPool"
PS C:\> Set-ItemProperty IIS:\AppPools\MyAppPool managedRuntimeVersion "v4.0"
PS C:\> Set-ItemProperty IIS:\AppPools\MyAppPool -Name processModel.identityType -Value "ApplicationPoolIdentity"
Name State
---- -----
MyAppPool Started
identity用 ApplicationPoolIdentity 最安全,别傻乎乎用LocalSystem,那等于给攻击者开了后门。
步骤4:创建站点并绑定到物理路径
PS C:\> New-Website -Name "MyApp" -PhysicalPath "E:\WebApps\myapp" -ApplicationPool "MyAppPool" -Port 8080
Name ID State Physical Path Binding
---- -- ----- -------------- --------
MyApp 2 Started E:\WebApps\myapp :8080:
端口先别用80/443,等配置完再改,避免跟现有站点冲突。
步骤5:绑定主机头(多站点共用80端口的核心)
PS C:\> New-WebBinding -Name "MyApp" -Protocol http -HostHeader "www.example.com" -Port 80
PS C:\> Get-WebBinding -Name "MyApp"
protocol bindingInformation hostHeader
-------- ------------------ ----------
http :80:www.example.com www.example.com
主机头绑定做好了,多个子域名指向同一IP的不同站点,全靠这个。
步骤6:配置HTTP重定向到HTTPS(可选但强烈建议)
PS C:\> Install-WindowsFeature Web-Http-Redirect
PS C:\> Set-WebConfigurationProperty -PSPath IIS:\Sites\MyApp -Filter /httpRedirect -Name enabled -Value true
PS C:\> Set-WebConfigurationProperty -PSPath IIS:\Sites\MyApp -Filter /httpRedirect -Name destination -Value "https://www.example.com$1"
PS C:\> Set-WebConfigurationProperty -PSPath IIS:\Sites\MyApp -Filter /httpRedirect -Name exactDestination -Value true
状态确认:
PS C:\> Get-WebConfigurationProperty -PSPath IIS:\Sites\MyApp -Filter /httpRedirect -Name enabled
True
301重定向对SEO友好,别让用户访问到明文HTTP版本。
步骤7:申请并绑定SSL证书(Let's Encrypt示例)
PS C:\> $cert = New-SelfSignedCertificate -DnsName "www.example.com" -CertStoreLocation cert:\LocalMachine\My
PS C:\> $binding = New-WebBinding -Name "MyApp" -Protocol https -Port 443 -HostHeader "www.example.com"
PS C:\> $binding.AddSslCertificate($cert.Thumbprint, "My")
验证绑定:
PS C:\> netsh http show sslcert
SSL Certificate bindings:
-----------------
Hostname:port : www.example.com:443
Certificate Hash : a1b2c3d4e5f6...
生产环境建议用Certbot或者 ACMESharp 自动续期,别用手工证书,到期忘了换就呵呵了。
步骤8:验证站点可访问
PS C:\> iisreset
PS C:\> Invoke-WebRequest -Uri "https://www.example.com" -SkipCertificateCheck
StatusCode : 200
StatusDescription : OK
Content : ...站点内容...
能返回200说明站点跑起来了,有问题先查防火墙和 bindings 配置。
三、常见问题FAQ
Q:站点创建后访问提示403 Forbidden,目录权限也给了?
A:大概率是IIS_IUSRS组没加或者应用程序池身份不对。先跑 Get-Acl E:\WebApps\myapp | fl 看实际权限,检查应用程序池用的什么账号。常见坑是匿名认证用的IUSR账户不在文件夹访问列表里。建议统一用ApplicationPoolIdentity,然后给对应AppPool账号加目录权限。
Q:同一IP绑定多个HTTPS站点,报错"另一个同名站点已使用此绑定"?
A:HTTPS不像HTTP能用主机头区分,必须每个站点用不同端口或者不同IP。解决方案:买多IP服务器,或者443端口后面跟证书SNI。跑 Get-WebBinding -Protocol https 看现有绑定,确认目标站点用的证书支持SNI(Server Name Indication),Windows Server 2012以上默认开启。老系统2008 R2就乖乖用不同端口吧。
Q:想批量创建20个站点,一个个New-Website要命,有没有批量脚本?
A:上来就问这个说明你是做运维的料。给你个模板:
$siteList = @(
@{Name="Site1"; Host="site1.com"; Path="E:\WebApps\site1"},
@{Name="Site2"; Host="site2.com"; Path="E:\WebApps\site2"}
)
foreach ($site in $siteList) {
New-Item -Path $site.Path -ItemType Directory -Force | Out-Null
New-Website -Name $site.Name -PhysicalPath $site.Path -Port 80 -HostHeader $site.Host
Write-Host "Created $($site.Name)" -ForegroundColor Green
}
数组定义站点信息,循环跑完收工。生产环境记得加错误处理和日志记录。
Q:站点迁移怎么保证 downtime 最少?
A:套路是这样:1)新服务器先把站点建好配好,测试通过;2)DNS TTL先改成60秒;3)迁移前把旧站点停了;4)DNS切到新IP;5)观察几天没问题再把旧服务器下线。别在迁移过程中两边同时改,数据库同步出问题你就等着半夜起来吧。
四、总结
核心要点就三条:
- PowerShell命令比图形界面快10倍,批量操作必须上脚本
- 应用程序池身份用 ApplicationPoolIdentity,别偷懒用LocalSystem
- SSL证书必须自动续期,手工管理早晚出事
延伸阅读:
记住:能用命令行搞定的事就别点鼠标,脚本写好了下次30秒搞定,图形界面点半天下次还是从头来。运维的核心是把重复劳动自动化,别让自己成为人肉部署工具。