Windows IIS 部署 Spring Boot 应用详细指南
本文档提供了在 Windows Server 上使用 IIS 部署 Spring Boot 应用的完整步骤和最佳实践。
目录
概述
Spring Boot 应用通常是独立的 Java 应用程序,它们自带嵌入式 Web 服务器(如 Tomcat、Jetty 或 Undertow)。在 Windows 环境中,虽然可以直接运行这些应用,但使用 IIS 作为前端服务器有以下优势:
- 更好的静态资源处理能力
- 提供额外的安全层
- 集成 Windows 认证
- 集中管理多个应用
- 利用 IIS 的高级功能(如缓存、压缩等)
本指南将介绍如何使用 IIS 作为反向代理来部署 Spring Boot 应用。
前期准备
Windows Server 环境准备
-
安装或确认 IIS 已安装:
- 打开服务器管理器 → 添加角色和功能
- 安装 Web 服务器 (IIS) 角色
- 确保以下功能已选中:
- Web 服务器 → 通用 HTTP 功能 → 静态内容
- Web 服务器 → 应用程序开发 → WebSocket 协议
- Web 服务器 → 性能 → 压缩静态内容
- 管理工具 → IIS 管理控制台
-
安装 URL 重写模块:
- 从 Microsoft 官方网站 下载
- 按照安装向导完成安装
-
安装 Application Request Routing (ARR):
- 从 Microsoft 官方网站 下载
- 按照安装向导完成安装
Java 环境准备
-
安装 JDK:
- 下载并安装适合的 JDK 版本(推荐 JDK 11 或更高版本)
- 设置 JAVA_HOME 环境变量
- 添加 Java 到 PATH 环境变量
-
验证 Java 安装:
java -version
Spring Boot 应用准备
应用打包
-
配置应用端口:
在application.properties
或application.yml
中设置端口:server.port=8080
-
构建可执行 JAR 文件:
mvn clean package -DskipTests
或使用 Gradle:
./gradlew bootJar
-
测试应用:
java -jar target/your-application.jar
确保应用可以正常启动并访问。
优化应用配置
-
配置日志输出到文件:
在application.properties
中添加:logging.file.name=logs/application.log logging.file.max-size=10MB logging.file.max-history=10
-
配置健康检查端点:
management.endpoints.web.exposure.include=health,info,metrics management.endpoint.health.show-details=always
-
配置应用上下文路径(可选):
如果需要在子路径下运行应用:server.servlet.context-path=/myapp
安装配置必要组件
设置应用服务器目录
-
创建应用目录:
mkdir C:\SpringBootApps\my-application
-
创建子目录:
mkdir C:\SpringBootApps\my-application\logs mkdir C:\SpringBootApps\my-application\config
-
复制应用文件:
将构建好的 JAR 文件复制到应用目录:copy target\your-application.jar C:\SpringBootApps\my-application\
-
创建应用配置文件(可选):
如果需要覆盖默认配置,创建application.properties
或application.yml
文件:copy src\main\resources\application.properties C:\SpringBootApps\my-application\config\
-
创建启动脚本:
创建start.bat
文件:@echo off set JAVA_HOME=C:\Program Files\Java\jdk-11 set PATH=%JAVA_HOME%\bin;%PATH% cd /d C:\SpringBootApps\my-application java -Xms256m -Xmx512m -jar your-application.jar --spring.config.location=file:./config/
配置 IIS 站点
创建和配置 IIS 网站
-
打开 IIS 管理器:
- 开始菜单 → 管理工具 → Internet Information Services (IIS) 管理器
-
创建应用程序池:
- 右键点击"应用程序池" → “添加应用程序池”
- 名称:
MyApplicationPool
- .NET CLR 版本:
无托管代码
- 托管管道模式:
集成
- 点击确定
-
创建网站:
- 右键点击"网站" → “添加网站”
- 网站名称:
MySpringBootApp
- 物理路径:
C:\inetpub\wwwroot\myapp
(创建一个空目录) - 端口:
80
(或其他可用端口) - 点击确定
-
创建物理目录:
mkdir C:\inetpub\wwwroot\myapp
配置反向代理
配置 ARR 和 URL 重写
-
启用 ARR 代理功能:
- 在 IIS 管理器中选择服务器级别
- 双击"Application Request Routing Cache"
- 点击右侧操作面板中的"服务器代理设置"
- 勾选"启用代理"
- 点击"应用"
-
创建 URL 重写规则:
- 选择您创建的网站
- 双击"URL 重写"
- 在右侧操作面板中点击"添加规则"
- 选择"空白规则"
- 配置如下:
- 名称:
ReverseProxyInbound
- 模式:
(.*)
- 操作类型:
重写
- 重写 URL:
http://localhost:8080/{R:1}
- 点击"应用"
- 名称:
-
添加反向代理配置到 web.config:
在网站的物理路径 (C:\inetpub\wwwroot\myapp
) 创建web.config
文件:<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInbound" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:8080/{R:1}" /> <conditions> </conditions> </rule> </rules> <outboundRules> <rule name="ReverseProxyOutbound" preCondition="ResponseIsHtml1"> <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:8080/(.*)" /> <action type="Rewrite" value="/{R:2}" /> </rule> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> </outboundRules> </rewrite> <httpErrors errorMode="Custom"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" prefixLanguageFilePath="" path="/" responseMode="ExecuteURL" /> </httpErrors> </system.webServer> </configuration>
-
配置 ARR 绕过本地请求(提高性能):
- 选择服务器级别
- 双击"Application Request Routing Cache"
- 点击"服务器代理设置"
- 取消勾选"在服务器变量或标头中传递请求标头"
- 点击"应用"
配置 Windows 服务
使用 NSSM 创建 Windows 服务
-
下载 NSSM (Non-Sucking Service Manager):
- 从 NSSM 官网 下载
- 解压到合适的位置,例如
C:\Tools\nssm
-
创建服务:
C:\Tools\nssm\win64\nssm.exe install MySpringBootService
-
在弹出的界面中配置服务:
- 路径:
C:\Program Files\Java\jdk-11\bin\java.exe
- 启动目录:
C:\SpringBootApps\my-application
- 参数:
-Xms256m -Xmx512m -jar your-application.jar --spring.config.location=file:./config/
- 路径:
-
配置详细信息:
- 切换到"详细信息"选项卡
- 显示名称:
My Spring Boot Application
- 描述:
Spring Boot application running as a service
- 启动类型:
自动
-
配置日志:
- 切换到"I/O"选项卡
- 输出(stdout):
C:\SpringBootApps\my-application\logs\service-stdout.log
- 错误(stderr):
C:\SpringBootApps\my-application\logs\service-stderr.log
- 点击"安装服务"
-
启动服务:
net start MySpringBootService
或通过服务管理控制台启动。
配置应用自启动
检查和配置服务自启动
-
确认服务自启动设置:
- 打开"服务"管理控制台(services.msc)
- 找到创建的服务
MySpringBootService
- 确认"启动类型"设置为"自动"
-
设置依赖关系(可选):
如果应用依赖于其他服务(如数据库),可以设置服务依赖:sc config MySpringBootService depend= MSSQLSERVER
设置 IIS 站点自启动
- 配置 IIS 站点自启动:
- 在 IIS 管理器中,选择创建的网站
- 在右侧操作面板中点击"高级设置"
- 将"启动自动启动"设置为"True"
- 点击"确定"
HTTPS 配置
配置 SSL 证书
-
获取 SSL 证书:
- 从证书颁发机构购买证书
- 使用 Let’s Encrypt 免费证书
- 创建自签名证书(仅测试环境)
-
安装证书:
- 在 IIS 管理器中选择服务器
- 双击"服务器证书"
- 在右侧操作面板中点击"导入"(如果已有证书文件)或"创建自签名证书"
- 按照向导完成证书导入或创建
-
绑定 HTTPS:
- 在 IIS 管理器中选择您的网站
- 在右侧操作面板中点击"绑定…"
- 点击"添加"
- 类型:
https
- IP 地址:
All Unassigned
(或指定 IP) - 端口:
443
- 主机名:您的域名(可选)
- SSL 证书:选择安装的证书
- 点击"确定"
配置 Spring Boot 应用支持 HTTPS
如果您希望 Spring Boot 应用本身也支持 HTTPS,可以在 application.properties
中添加:
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
注意:当 IIS 已经配置了 HTTPS,通常不需要 Spring Boot 应用再配置 HTTPS。
日志配置
配置 IIS 日志
- 配置 IIS 站点日志:
- 在 IIS 管理器中选择您的网站
- 双击"日志记录"
- 设置合适的日志格式和路径
- 点击"应用"
配置 Spring Boot 日志
- 使用 logback 进行高级日志配置:
在C:\SpringBootApps\my-application\config
目录下创建logback-spring.xml
:<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_PATH" value="logs" /> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/application.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/application.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </configuration>
部署多个应用
使用多个网站或应用程序
-
为每个 Spring Boot 应用创建独立服务:
使用 NSSM 为每个应用创建单独的 Windows 服务。 -
配置方法 A:多个 IIS 网站:
- 为每个 Spring Boot 应用创建独立的 IIS 网站
- 每个网站使用不同的端口或主机名
-
配置方法 B:使用应用程序:
- 创建一个主网站
- 为每个 Spring Boot 应用添加应用程序:
- 右键点击网站 → “添加应用程序”
- 别名:
app1
- 物理路径:为此应用创建的目录
- 点击"确定"
- 为每个应用程序配置单独的 URL 重写规则
性能优化
IIS 性能优化
-
启用静态和动态内容压缩:
- 在 IIS 管理器中选择服务器
- 双击"压缩"
- 启用静态和动态内容压缩
- 点击"应用"
-
配置输出缓存:
- 在 IIS 管理器中选择您的网站
- 双击"输出缓存"
- 添加适当的缓存规则
- 点击"应用"
-
优化应用程序池设置:
- 右键点击您的应用程序池 → “高级设置”
- 将"闲置超时"设置为更长时间(例如 0 表示永不超时)
- 配置合适的回收设置
- 点击"确定"
Spring Boot 性能优化
-
调整 JVM 参数:
更新服务启动参数,添加合适的 JVM 选项:-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200
-
启用响应压缩:
在application.properties
中添加:server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain server.compression.min-response-size=2048
-
配置 Tomcat 连接池:
server.tomcat.max-threads=200 server.tomcat.min-spare-threads=20 server.tomcat.max-connections=10000
常见问题排查
应用无法启动
-
检查 Java 版本兼容性:
java -version
确保 Java 版本与 Spring Boot 应用兼容。
-
检查服务日志:
查看服务输出日志:C:\SpringBootApps\my-application\logs\service-stdout.log C:\SpringBootApps\my-application\logs\service-stderr.log
-
检查应用日志:
查看应用日志:C:\SpringBootApps\my-application\logs\application.log
-
检查端口占用:
netstat -ano | findstr :8080
如果端口已被占用,修改应用的端口配置。
网站连接错误
-
检查 IIS 站点是否启动:
在 IIS 管理器中确认网站状态为"已启动"。 -
检查 URL 重写规则:
确认 web.config 中的 URL 重写规则正确。 -
检查防火墙设置:
确保必要的端口已在 Windows 防火墙中开放。 -
检查反向代理配置:
确认 ARR 代理功能已启用。 -
检查 IIS 日志:
查看 IIS 日志了解具体错误。
常见错误码排查
-
HTTP 404:
- 检查 Spring Boot 应用是否正常运行
- 确认 URL 重写规则正确
- 确认请求路径与应用的上下文路径匹配
-
HTTP 500:
- 检查应用日志获取详细错误信息
- 确认应用配置无误
- 检查数据库连接等外部依赖
-
HTTP 502:
- 表示反向代理无法连接到后端 Spring Boot 应用
- 确认应用服务正在运行
- 检查端口配置
最佳实践
安全性最佳实践
-
配置 HTTPS:
始终使用 HTTPS 保护数据传输。 -
使用适当的防火墙规则:
仅开放必要的端口。 -
定期更新系统和组件:
保持 Windows、IIS、Java 和应用依赖的最新安全补丁。 -
实施适当的身份验证和授权:
考虑使用 Windows 认证或其他安全机制。 -
保护敏感配置信息:
避免在源代码中存储敏感信息,使用环境变量或加密配置。
维护最佳实践
-
实施自动化备份:
定期备份应用、配置和数据库。 -
监控应用和服务器性能:
使用适当的监控工具(如 Spring Boot Actuator、Windows 性能监视器)。 -
日志轮转和管理:
实施日志轮转策略,防止日志文件过大。 -
定期检查和清理临时文件:
维护服务器空间。 -
制定部署和回滚策略:
确保能够快速响应问题并恢复服务。