Windows服务器JavaWeb项目部署指南:从环境搭建到外网访问

发布时间:2026/10/1 21:42:51
Windows服务器JavaWeb项目部署指南:从环境搭建到外网访问 上周一个朋友找我帮忙说在Windows服务器上部署JavaWeb项目跟着网上的教程一步步操作Tomcat起来了、war包也解压了可外网就是访问不了。我远程连上去看了五分钟就定位了问题8080端口在Windows防火墙里放行了但云控制台的安全组漏掉了入方向的规则。这种错位在Linux服务器上很少出现因为大家天然会去检查iptables和firewalld而Windows服务器的部署教程大多停在“装个JDK、扔个war包”这个层面后面的网络配置、服务自启、日志管理这些真正决定项目能否长期稳定运行的部分几乎没人完整写过。这篇文章把我这些年往Windows服务器上部署JavaWeb项目的流程完整梳理一遍从部署形态选型、基础环境搭建、打包部署到服务注册、防火墙配置、Docker编排再到常见问题的排查链路每一步都尽量写清楚“为什么这么做”和“哪里容易踩坑”。适合三类人看第一次把项目往Windows服务器放的开发者、帮公司维护内部系统的运维以及期末或毕设需要部署JavaWeb项目的学生。如果你手里的服务器是Windows Server 2016、2019、2022或者Windows 10/11长期开机当服务器用这篇都能直接照着走。1. 先别急着动手war包、jar包和服务器现状要搞清楚1.1 你的项目到底是war包还是jar包部署方式完全取决于项目形态这一步搞错后面全白搭。传统JavaWeb项目也就是基于JSP和Servlet的SSM框架项目通常打包成war包丢到外置Tomcat的webapps目录下由Tomcat负责解压和运行。而Spring Boot项目默认打包成jar包内置了Tomcat直接java -jar就能启动不需要额外安装Tomcat。我见过很多人在这一步就绕了远路。明明是个Spring Boot项目非要把war包扔进Tomcat结果启动报错或者类冲突反过来传统SSM项目非要让Spring Boot内嵌容器去跑折腾半天不如直接用Tomcat。判断方法很简单打开项目的pom.xml看packaging标签war就是warjar就是jar。再看有没有spring-boot-maven-plugin有就是Spring Boot项目。这里还有一个特殊情况Spring Boot项目也可以打成war包部署到外置Tomcat需要修改打包方式、继承SpringBootServletInitializer、排除内嵌Tomcat依赖。但这种做法意义不大除非是公司现有运维体系强依赖外置Tomcat管理。个人项目或者新项目Spring Boot老老实实打jar包就好。部署形态适用项目运行时依赖启动方式维护难度war包 外置Tomcat传统SSM、Spring MVC、JSP项目JDK Tomcat启动Tomcat自动部署中等要关心Tomcat本身jar包 内嵌TomcatSpring Boot项目只需要JDKjava -jar较低进程交给服务工具管1.2 服务器配置摸底和路径规划别一上来就装环境先花十分钟搞清楚服务器现状。远程桌面登录后按Win R运行winver查看系统版本Windows Server 2016、2019、2022的常用命令基本一致不用太担心版本差异。然后在命令行里执行systeminfo看内存和磁盘剩余空间尤其要注意C盘空间很多服务器默认系统盘只有40G装完系统和补丁就剩不了多少Java应用再往C盘塞迟早把磁盘撑爆。接着检查已经安装的软件和服务。在服务器上打开任务管理器切到“服务”标签页或者命令行执行services.msc看看有没有装过MySQL、Redis、Nginx、IIS、Docker这些。尤其是端口占用情况先执行netstat -ano | findstr 8080看看8080端口现在有没有被占用如果已经有一个程序在监听你的Tomcat启动时会直接报端口冲突。路径规划是我一直在强调但很多人忽略的点。项目文件、JDK、Tomcat、数据目录全部放D盘或者其他数据盘不要放C盘Program Files。原因有两点第一Windows系统更新、权限控制都可能影响C盘下文件的读写Tomcat解压war包、程序写日志经常报权限不足第二Program Files中间有空格某些脚本和批处理处理起来容易出问题。我习惯的目录结构是这样的D:\app\jdk D:\app\tomcat D:\app\projects\app.jar D:\app\logs D:\data\mysql D:\data\redis所有环境集中在一个根目录下备份、迁移、清理都方便。1.3 远程操作和文件传输方案部署过程中需要频繁在服务器和本地之间传文件war包或者jar包动辄几十上百兆用远程桌面自带的剪贴板复制粘贴不靠谱经常传到一半断掉而且某些格式的文件还会被安全策略阻断。我的建议是安装OpenSSH Server在“设置”-“应用”-“可选功能”里添加或者用PowerShell执行Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0。装好后用本地的WinSCP、xftp或者直接用scp命令传文件目录拖拽、断点续传都支持比远程桌面复制稳太多。日常操作我推荐优先用OpenSSH加命令行而不是远程桌面。原因很简单远程桌面断开重连不影响后台进程但容易让人养成“看到图形界面就能解决问题”的错觉而命令行操作可以沉淀成脚本下次部署直接复用。当然装系统级软件、改防火墙规则这类操作远程桌面还是更直观两个结合着用。2. 搭好运行环境JDK、Tomcat和数据库的安装细节2.1 JDK版本选择和安装时的三个坑JDK版本怎么选打开项目pom.xml看java.version标签或者maven.compiler.source标签项目写的是Java 8就用JDK 8写的17就用JDK 17。Spring Boot 2.x系列一般用JDK 8Spring Boot 3.x必须用JDK 17以上。这里千万别自作聪明装个最新版JDK 21很可能项目编译版本太低直接跑不起来。JDK安装包可以从Oracle官网下载也可以从Adoptium下载Temurin OpenJDK。个人项目我推荐Temurin开源协议友好不需要注册Oracle账号版本管理也清晰。安装路径设置到D:\app\jdk\jdk-17这种无空格路径然后配置环境变量。环境变量配置是这个环节最大的坑集中地。右键“此电脑”-“属性”-“高级系统设置”-“环境变量”在“系统变量”里新建JAVA_HOME变量值填JDK的安装根路径注意不要带bin目录也不要结尾加反斜杠。然后在Path变量里新建一行%JAVA_HOME%\bin。配置完成后关掉所有已经打开的cmd窗口重新开一个执行java -version验证。这里有个细节很多人不知道配置环境变量时系统变量和用户变量是叠加的如果之前在用户变量里配过一个旧JDK路径系统变量里又配了新路径命令行里java -version显示的可能是旧的。排查时执行where java会列出所有匹配的可执行文件路径按顺序从上到下就是实际调用顺序。我遇到过一台服务器上残留了三个JDK环境变量指向的和实际运行的根本不是同一个项目启动报各种莫名其妙的版本错误最后就是靠where java定位清理干净的。2.2 Tomcat安装和启动解压比安装更靠谱Tomcat在Windows上不需要安装程序直接下载zip压缩包解压就行。到Apache Tomcat官网下载对应版本注意选择64位Windows zip包。解压到D:\app\tomcat然后设置一个CATALINA_HOME环境变量指向这个目录Path里添加%CATALINA_HOME%\bin。进入D:\app\tomcat\bin目录双击startup.bat启动Tomcat。这里会弹出一个黑色命令行窗口千万别关窗口关闭等于Tomcat退出。启动成功后浏览器访问http://localhost:8080能出现Tomcat默认页面就算成了。如果启动失败去D:\app\tomcat\logs目录看catalina.日期.log文件端口占用、JDK版本不对、环境变量没配置日志里都会明确写出来。Tomcat的server.xml在D:\app\tomcat\conf目录下里面可以配置三个端口8005是关闭端口、8080是HTTP访问端口、8009是AJP端口。AJP如果不用建议直接注释掉历史上出现过多个AJP漏洞没必要暴露不用的服务。内存参数在catalina.bat里配置在文件的set JAVA_OPTS%JAVA_OPTS%...这一行前后追加参数。简单一点直接在文件开头加一行固定配置set JAVA_OPTS-Xms512m -Xmx1024m -XX:MaxMetaspaceSize256m-Xms是初始堆大小-Xmx是最大堆大小。设置前先看服务器物理内存比如一台4G内存的服务器Tomcat分配1024MMySQL分配大概500M还剩下足够系统运行。不要贪心堆内存不是越大越好设置过大会导致系统内存耗尽。2.3 MySQL和Redis在Windows上的安装配置MySQL建议用MSI安装包安装过程会自动注册成Windows服务省去手动初始化的麻烦。安装时选择“Server only”模式字符集选utf8mb4密码设置一个强密码不要用root加个简单密码直接部署到公网迟早被扫库。如果要用zip解压方式步骤也不复杂解压到D:\mysql在目录下新建my.ini配置文件[mysqld] basedirD:/mysql datadirD:/mysql/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci bind-address0.0.0.0 [client] default-character-setutf8mb4然后用管理员权限打开cmd进入D:\mysql\bin先执行mysqld --initialize-insecure生成初始化数据目录这时候root用户是空密码再执行mysqld --install MySQL --defaults-fileD:\mysql\my.ini把MySQL注册成服务最后net start MySQL启动。启动后立即处理两件事第一给root设置密码第二创建应用专用账号不要用root连接JavaWeb项目。SQL是这样CREATE USER javaw% IDENTIFIED BY Javaw2024; GRANT ALL PRIVILEGES ON *.* TO javaw%; FLUSH PRIVILEGES;如果项目和应用在同一台服务器host用localhost更安全但很多场景要支持运维从外部连数据库所以这里用%。安全考量上这个账号只给app库的全部权限不给所有库权限更规范。Redis在Windows上没有官方支持版本我用的比较多的是tporadowski在GitHub上维护的Redis for Windows发行版。下载zip解压后进入目录执行安装服务命令redis-server --service-install redis.windows.conf --service-name Redis修改redis.windows.conf文件重点是两个参数requirepass设置访问密码appendonly yes开启持久化防止重启丢数据。如果只有本机的Java应用需要连Redisbind保持127.0.0.1不要改减少暴露面。3. 打包和部署war包与jar包方式的全流程操作3.1 打包前必须核对的配置清单部署最怕的不是不会打包而是打包前没确认配置部署完启动失败又要回去改配置重新打包。我每次打包前都会花五分钟过一遍这几项。第一数据库连接配置。找到配置文件里的spring.datasource或jdbc相关配置确认数据库地址、端口、库名、账号、密码是生产环境的。很多人本地连的是localhost上传到服务器后没改启动时数据库连接报错。第二文件存储路径。JavaWeb项目通常涉及文件上传下载如果配置文件里写死了绝对路径比如D:\workspace\uploads而服务器上没有这个目录程序运行时会报FileNotFoundException。Windows路径建议用D:/uploads这种正斜杠写法兼容性更好。第三激活的配置文件profile。Spring Boot项目常用application-dev.yml和application-prod.yml区分环境部署时要在启动命令里显式指定--spring.profiles.activeprod否则默认加载的是dev配置。确认无误后执行打包命令mvn clean package -DskipTests加-DskipTests的意思是跳过单元测试因为测试环境很可能连接不上数据库或者依赖其他外部服务强行跑测试只会拖慢打包速度。打包完成后target目录下会生成war或jar文件。3.2 war包部署到Tomcat最容易被忽略的旧包残留问题把生成的war包复制到D:\app\tomcat\webapps目录下。如果Tomcat正在运行它会自动检测到新文件并解压。如果没运行启动Tomcat时会自动处理。访问路径是http://服务器IP:8080/war包名/比如war包叫myweb.war访问路径就是http://IP:8080/myweb/。有个点必须提醒更新部署时一定先停Tomcat然后删除webapps下旧的war包和解压出来的同名目录再放新的war包进去。如果不删旧目录Tomcat解压新war包时会覆盖部分文件但残留的旧配置文件、编译后的class文件可能还在造成“改了配置但没生效”“代码好像还是老的”这种诡异问题。我踩过不止一次现在养成习惯更新版本就干净删除不留旧文件。如果想让项目直接通过http://IP:8080/访问不带项目名路径把war包改名为ROOT.war即可这是Tomcat约定的根应用名称。3.3 jar包方式部署Spring Boot项目Spring Boot的jar包部署更简单但需要注意的事情一点也不少。进入jar包所在目录执行java -jar app.jar --spring.profiles.activeprod --server.port8080如果jar包的配置文件需要外置Spring Boot会自动读取jar包同级config目录下的application.yml。这个特性非常实用意味着部署时不用重新打jar包直接改服务器上的配置文件就能调整环境。启动之后开一个cmd窗口执行jps -l看Java进程是否存活再执行netstat -ano | findstr 8080看端口是否监听最后浏览器访问http://localhost:8080验证。这里有一个Spring Boot部署的经典问题项目启动成功了localhost访问正常但用局域网IP访问不了。原因是内嵌Tomcat默认绑定的是0.0.0.0理论上没问题但如果你在application.yml里显式配置了server.address127.0.0.1那就只有本机访问得了。排查时先确认这个配置项再检查防火墙和安全组别一上来就怀疑防火墙。4. Windows服务器独有的内容服务注册、开机自启、日志管理4.1 为什么你的Tomcat窗口一关项目就没了在Windows上直接运行startup.bat或者java -jar进程是附着在cmd窗口上的这个窗口一关进程就被系统终止。Windows Server重启后这些进程更不可能自己回来。这就是Windows和Linux最大的差别Linux有systemd可以定义服务的开机自启和异常重启Windows默认没有这套机制需要额外借助工具。解决思路是给Java进程套一层系统服务的外壳。常用的两个工具是WinSW和NSSM二选一就够我个人用得比较多的是WinSW配置全部集中在一个XML文件里清晰好维护。先去GitHub下载WinSW-x64.exe放到D:\app\services目录重命名为myapp-service.exe。同一目录下新建一个myapp-service.xmlservice idmyapp-service/id nameJavaWebApp Service/name descriptionJavaWeb Application Service/description executablejava/executable arguments-Xms512m -Xmx1024m -jar D:\app\projects\app.jar --spring.profiles.activeprod/arguments logpathD:\app\services\logs/logpath logmoderotate/logmode /service用管理员权限打开cmd进入D:\app\services目录执行myapp-service.exe install net start myapp-service到这一步JavaWeb项目就变成Windows服务了。系统服务管理器里可以看到它属性里把启动类型设为“自动”以后开机自动运行。卸载服务时先net stop myapp-service再执行myapp-service.exe uninstall。需要注意executable写的是java依赖PATH环境变量能找到java命令。如果服务器上装了多个JDK建议把executable改成JDK实际路径比如D:\app\jdk\jdk-17\bin\java.exe避免指向错误版本的JDK。4.2 Tomcat作为war包容器的服务化如果走war包部署方式也可以把Tomcat注册成服务。Tomcat的bin目录下自带service.bat提前设置好CATALINA_HOME环境变量管理员cmd运行D:\app\tomcat\bin\service.bat installTomcat就会注册为一个名为Tomcat的服务。如果这个方式有问题用NSSM包装一下也简单运行nssm install Tomcat在界面里把Application指向D:\app\tomcat\bin\startup.bat启动目录指向D:\app\tomcat\bin。4.3 日志管理和磁盘空间防护服务化之后日志管理成为长期稳定运行的关键点。WinSW自带日志轮转能力logmoderotate/logmode表示按大小分割不会让单个日志文件无限膨胀。应用程序自己打的日志比如logback、log4j2在配置文件里配好滚动策略日志文件按天切分保留最近30天就够。Tomcat的logs目录需要特别注意。Tomcat运行时间长了catalina.out、localhost_access_log这些文件会越来越大。我习惯写一个批处理脚本通过Windows计划任务每天执行一次清理7天前的日志forfiles /p D:\app\tomcat\logs /s /m *.log /d -7 /c cmd /c del file forfiles /p D:\app\projects\logs /s /m *.log /d -7 /c cmd /c del file计划任务添加方式控制面板-管理工具-任务计划程序-创建基本任务触发器选“每天”操作选“启动程序”把脚本路径填进去。这一步做了服务器长期运行基本不会因为日志把磁盘塞满。5. 从本机能开提到外网能开防火墙、安全组、端口和域名5.1 Windows防火墙放行端口的正确姿势很多人的部署流程走到“浏览器访问localhost通了”就停了但实际用户访问的是外网IP这时候就会卡住。第一步检查Windows防火墙。打开“控制面板”-“Windows Defender防火墙”-“高级设置”-“入站规则”-“新建规则”选择“端口”-“TCP”-“特定本地端口”填8080选“允许连接”配置文件全勾选规则名称随便填。用命令行更快管理员cmd执行netsh advfirewall firewall add rule nameOpen 8080 dirin actionallow protocolTCP localport80805.2 云服务器安全组是最容易被漏掉的一环Windows防火墙放行之后如果外网还是不通接着查云控制台的安全组。阿里云、腾讯云、华为云的ECS实例都有安全组规则相当于在虚拟机外面又套了一层防火墙Windows防火墙放行只是第一层安全组不放行流量根本到不了服务器网卡。在云控制台找到对应的实例进入安全组配置添加入方向规则协议端口填TCP:8080授权对象填0.0.0.0/0或者你公司出口IP更安全。这一步操作完再测外网基本就通了。一个通用的排查链路是这样telnet 公网IP 8080通说明网络链路没问题问题在应用层不通用排除法先关Windows防火墙测试注意生产环境别随便关测完要开回去不行再查安全组安全组没问题就查程序是不是只监听了127.0.0.1。我在开头提到的那个朋友他的问题就是这一步Windows防火墙放行了安全组漏掉了。前后排查不到十分钟但他自己折腾了一个下午。5.3 80端口冲突和IIS的宿怨很多人希望直接用80端口访问项目不用带端口号。但Windows服务器上最常见的80端口占用来自IIS。如果服务器的“World Wide Web服务”处于运行状态80端口就是IIS的Tomcat启动时会报Address already in use。解决方案有两种第一停用IIS控制面板-“启用或关闭Windows功能”-取消勾选“Internet Information Services”重启生效第二给Tomcat换个端口比如8080然后用Nginx做反向代理监听80把请求转发到8080。第二种方案更灵活也是我在生产环境推荐的做法因为Nginx还能顺便处理静态资源、HTTPS证书、多个应用的路由分发。排查端口占用用这三条命令netstat -ano | findstr :80 tasklist | findstr PID taskkill /F /PID 进程ID先看到底是哪个进程占了80端口确认能杀再杀。5.4 域名、HTTPS与Nginx反向代理项目部署到公网后最好用域名访问而不是一长串IP加端口。域名从云厂商购买后解析到服务器公网IP就完成绑定。如果是国内服务器域名解析后还要按云厂商指引完成相应的合规流程这个在云控制台会有明确提醒按流程走就行。HTTPS证书现在基本都是免费的了云厂商提供一年期的免费SSL证书。部署到Tomcat的方式有两种一种是在server.xml里配置证书文件然后用Tomcat直接监听443端口另一种是Nginx监听443并配置证书把请求反向代理到后端8080。我更推荐后者因为证书到期替换、多个应用共用一个证书、HTTP自动跳转HTTPS这些操作在Nginx里都更简单。Windows上安装Nginx非常省事下载Windows版zip解压到D:\app\nginx修改conf\nginx.conf一个最基础的反向代理配置server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }然后执行start nginx启动浏览器访问域名就直接转到JavaWeb项目了。Nginx在Windows上以非服务方式运行建议配合WinSW把nginx.exe也注册成服务方法和Java应用一样。6. 环境混乱时的另一种解法用Docker Compose编排整个JavaWeb栈6.1 Windows上Docker的安装前提如果你的Windows服务器上已经装了乱七八糟一堆软件MySQL一个版本、Redis一个版本互相掺杂很难管或者你需要在多台Windows服务器上复现同一套环境这时候用Docker是更好的选择。Windows上装Docker Desktop底层依赖WSL2。安装前在PowerShell管理员里执行wsl --install装完WSL2并设置默认版本后去Docker官网下载Docker Desktop安装包。安装过程中选择使用Linux容器。装好后后续的docker、docker-compose命令用法和Linux上基本一致。需要说明的是Docker Desktop对大型企业有商业授权要求如果是在公司生产环境用使用前确认一下许可情况。个人开发和中小团队测试环境免费版本完全够用。Windows Server老版本如果装不了Docker Desktop要用Docker Enterprise或者干脆上一台Linux虚拟机但这些都不是纯Windows部署的范畴了。6.2 用docker-compose.yml一锅端编排MySQL、Redis和应用我这里给一个可以直接套用的docker-compose.yml模板包含MySQL、Redis和Java应用三个容器version: 3.8 services: mysql: image: mysql:8.0 container_name: javaw-mysql restart: always environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: Root2024 MYSQL_DATABASE: javawdb MYSQL_USER: javaw MYSQL_PASSWORD: Javaw2024 command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_unicode_ci ports: - 3306:3306 volumes: - D:/docker-data/mysql:/var/lib/mysql redis: image: redis:7 container_name: javaw-redis restart: always command: redis-server --requirepass Redis2024 --appendonly yes ports: - 6379:6379 volumes: - D:/docker-data/redis:/data app: image: openjdk:8-jre container_name: javaw-app restart: always depends_on: - mysql - redis ports: - 8080:8080 volumes: - D:/app/projects/app.jar:/app/app.jar - D:/app/projects/config:/app/config - D:/app/projects/logs:/logs command: java -Xms256m -Xmx512m -jar /app/app.jar --spring.profiles.activeprod为什么需要把数据目录挂载到Windows的D盘因为容器重建或者升级镜像后容器内部的数据会全部丢失。把MySQL数据、Redis持久化文件映射到宿主机目录才能保证数据安全。这个细节在生产环境尤其重要我见过不下三次因为容器删除导致数据库数据全没了的案例都是没挂载数据卷。在这个编排里应用镜像用的是通用openjdk镜像jar包通过挂载方式放入容器好处是更新代码时只需要替换jar包不用重新构建镜像。如果项目依赖特殊环境也可以写一个Dockerfile把jar包打进去FROM openjdk:8-jre MAINTAINER yourname COPY app.jar /app/app.jar WORKDIR /app EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]然后docker-compose.yml里的app服务改成build: .用docker-compose up -d一条命令拉起整个环境。6.3 Docker方案和传统方案的取舍用Docker部署不是银弹它解决的是“环境一致性”和“依赖管理”两个问题但在Windows上也有代价。对比维度传统方式JDKTomcatMySQLDocker方式环境隔离弱多个服务共享系统环境强每个容器独立版本管理手动安装卸载容易残留镜像版本清晰切换方便迁移复现需要重新配环境拷贝docker-compose.yml即可性能开销较低进程直接跑在系统上有一定开销尤其磁盘读写资源占用按需分配Docker Desktop本身占用较高运维复杂度要管理多个服务docker-compose统一管理如果你是个人的小型项目或者服务器配置一般传统方式足够如果项目依赖很多或者需要在多台机器上快速部署用Docker。这两种方案不是互斥的很多人先传统方式跑通了后来嫌环境复杂才切Docker切换成本也不高。7. 部署后的故障排查链路与几条压箱底的经验7.1 最常见的五个部署失败场景Windows服务器上部署JavaWeb项目失败场景翻来覆去就那么几个我列个对照表遇到问题直接按表查。现象可能原因排查方式服务已启动但外网访问超时云安全组未放行或Windows防火墙未放行先telnet公网IP 8080再查安全组和防火墙localhost能访问但局域网IP不行程序绑定了127.0.0.1检查server.address配置改为0.0.0.0启动报数据库连接失败数据库未启动、账号不允许远程、密码错、驱动版本不匹配连接串在本地用数据库客户端测试页面中文乱码TomcatURIEncoding未设置、连接串缺characterEncoding、页面meta缺失统一使用UTF-8Tomcat URIEncoding改为UTF-8重启后项目全丢了没注册Windows服务cmd窗口关闭进程被终止用WinSW注册服务启动类型设为自动7.2 一套标准的排查链路部署失败后别乱试按顺序执行下面的排查效率最高。第一步确认进程在不在。命令行执行tasklist | findstr java如果输出为空说明Java进程没起来去看程序日志。第二步确认进程变绿了但端口没监听。执行netstat -ano | findstr 8080没有任何输出说明程序没绑定这个端口要么配置文件里server.port不是8080要么启动报错之前就退出了。第三步确认端口监听没问题但本机访问不了。在服务器上用浏览器打开http://localhost:8080能打开说明应用正常问题在网络层打不开说明应用本身有问题去看Tomcat的catalina日志或Spring Boot的启动日志。第四步本机能打开但外网不行。先telnet 公网IP 8080不通就挨个检查Windows防火墙、云安全组通了再看是不是域名解析或HTTPS证书配置问题。这四步走完90%的问题都能定位。关键是每一步要记录结果不要靠感觉猜测否则很可能绕着圈子浪费时间。7.3 几条压箱底的经验都是实操换来的教训Windows服务器不比Linux系统更新、补丁安装频率高每次更新完都可能重启服务器。如果Java进程没有做成服务重启后不会自动拉起这就是很多项目跑着跑着突然数据收集日志断了、网页打不开的原因。我现在的习惯是不管jar包项目还是Tomcat全部注册成Windows服务并且把服务的恢复策略改成“失败后自动重启”。在服务属性里能找到重启服务、延迟重启时间都设好Java进程崩溃了系统会自动拉起来。关于编码Windows默认使用GBK和Linux的UTF-8不一致。部署JavaWeb项目时如果发现中文乱码先检查三处数据库连接串有没有加characterEncodingutf8Tomcat的server.xml里Connector有没有配URIEncodingUTF-8项目本身的代码和页面文件是不是UTF-8编码。这三处一致了乱码问题基本绝迹。关于数据库密码不要写死在配置文件里然后随手传到服务器。至少把密码放到Spring Boot的application-prod.yml外置配置里文件权限设置成只有管理员可读写。更稳妥的方式是使用环境变量配置项里写${DB_PASSWORD}启动服务前在系统环境变量里设置好。这样即使配置文件泄露密码也不会跟着暴露。最后每次部署前备份现有版本。我会在D盘建一个backup目录把上一个能正常运行的war包或jar包、数据库导出文件放到里面用日期命名。一旦新版本出问题十分钟内就能回滚到旧版。这套习惯救过我太多次。最后再分享一个小技巧我在Windows服务器上部署JavaWeb项目积累的一个小习惯是把所有部署相关的脚本和配置文件统一放在D:\app\scripts目录包括Windows服务的XML配置、Nginx的conf副本、计划任务的bat脚本。这样服务器哪怕完全重装我按照scripts目录里的文件一步步操作半小时内就能复现整套环境。这个目录本身就是这台服务器最完整的“部署文档”。