【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程

📅 发布时间:2026/7/6 18:57:38 👁️ 浏览次数:
【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程
前言在搭建前后端分离项目本地部署环境时遇到了经典的“Nginx代理访问404”问题Spring Boot后端8106端口启动正常Nginx看似启动成功但访问localhost始终返回404甚至出现bind() to 0.0.0.0:80 failed (10013)启动报错。经过多轮排查最终定位了端口占用、配置路径、进程重启三大核心坑点。本文将完整还原排查过程与解决方案希望能帮到同样踩坑的小伙伴少走弯路。关键在于通过查看nginx-1.28.0\logs\error.log的日志发现了是端口占用问题。一、问题背景项目环境后端Spring Boot 2.6.2运行端口8106接口前缀/app/前端静态资源打包后存放于D:\reference-project\package\front\nginx-1.28.0\html\public代理Nginx 1.28.0Windows版计划代理前端静态资源后端接口目标访问localhost打开前端页面且前端能正常调用后端接口异常现象Spring Boot后端日志正常访问http://localhost:8106/app/xxx能正常返回接口数据Nginx启动时提示bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)强行启动Nginx后访问localhost返回HTTP Error 404. The requested resource is not found.确认public目录下存在index.html排除静态资源缺失问题。二、核心排查过程按优先级排序步骤1验证静态资源有效性排除基础问题首先确认前端静态资源路径无误打开文件资源管理器核对路径D:\reference-project\package\front\nginx-1.28.0\html\public下存在index.html、static等核心文件排除“文件缺失导致404”的基础问题。步骤2定位Nginx启动报错核心原因——80端口被系统占用通过netstat -ano | findstr :80命令查看端口占用发现[::]:80的监听进程PID为4这是Windows的System系统进程。关键知识点PID 4 占用80端口的本质PID 4对应的是Windows内核级的HTTP.sys驱动Windows HTTP服务该服务支撑IIS、网络打印机共享、WinRM远程管理等功能会默认占用80端口。此时直接启动Nginx监听80端口必然触发10013权限禁止错误。步骤3修改端口后仍404——排查配置与重启问题将Nginx监听端口改为8080后访问localhost:8080仍报404核心原因有二配置未生效仅修改端口未使用绝对路径配置静态资源且未彻底重启Nginx访问地址错误改端口后未在浏览器中添加端口号仍访问localhost默认80端口。三、终极解决方案可直接复制落地结合本次问题最终采用**“修改Nginx配置 彻底重启进程 验证端口访问”**的方案兼顾开发便利性与系统服务安全性不停止Windows HTTP服务。方案1修改Nginx核心配置nginx.conf打开nginx-1.28.0\conf\nginx.conf替换server块配置重点解决静态资源路径、端口冲突、SPA路由、接口代理四大问题# Nginx核心配置适配Windows本地开发 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 核心服务配置 server { listen 8080; # 避开80端口冲突改为8080 server_name localhost; charset utf-8; # 1. 前端静态资源代理关键可使用绝对路径 root D:/reference-project/package/front/nginx-1.28.0/ location / { root html/public; index index.html index.htm; try_files $uri $uri/ /index.html; # 支持SPA路由刷新避免子路径404 } # 2. 后端接口代理匹配前端请求前缀/app/ location /app/ { proxy_pass http://localhost:8106/app/; # 代理到Spring Boot后端 proxy_redirect off; # 传递请求头解决后端获取客户端IP、Host异常问题 proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 错误页面配置 error_page 500 502 503 504 /50x.html; location /50x.html { root html; } } }方案2管理员权限彻底重启Nginx避免进程残留Windows下Nginx进程易残留导致新配置无法生效必须以管理员身份执行以下命令# 1. 进入Nginx安装目录cdD:\reference-project\package\hzb-front\nginx-1.28.0# 2. 强制杀死所有Nginx进程核心避免残留taskkill /f /im nginx.exe# 3. 重新启动Nginxnginx方案3验证部署结果前端页面验证浏览器访问http://localhost:8080成功加载前端页面后端接口验证前端调用接口如/app/user/info能正常获取后端返回数据日志验证查看nginx-1.28.0\logs\error.log无任何报错信息说明部署成功。四、拓展补充两种端口解决方案对比解决方案操作方式适用场景优缺点改Nginx端口本文方案将监听端口改为8080/8090等本地开发、无需使用80端口优点不影响系统服务缺点访问需加端口号释放80端口停止Windows HTTP服务net stop http生产部署、必须使用80端口优点可直接访问localhost缺点可能影响IIS、网络打印机等功能提示本地开发优先选择“改Nginx端口”生产环境若需使用80端口可先评估系统服务依赖再执行net stop http停止服务。五、Windows下Nginx本地部署核心避坑点路径坑Windows下配置root必须使用绝对路径/或\\分隔相对路径易因启动目录不同导致文件找不到端口坑1024以下端口如80需管理员权限且易被系统服务占用开发建议使用8080/8888等端口重启坑修改配置后必须先taskkill强制杀死进程再启动仅用nginx -s reload可能因进程残留失效SPA坑前端为Vue/React等单页应用时必须添加try_files $uri $uri/ /index.html;否则路由刷新会404。六、总结本次404问题的核心逻辑是80端口被系统占用 → Nginx启动失败/配置未生效 → 静态资源无法被正确代理 → 访问报404。注文档部分内容由 AI 生成