把JavaWeb项目部署到服务器,说白了就三步:装好JDK和Tomcat(或直接打jar包)、把项目传上去、放行端口配好域名反向代理,流程不复杂,真正卡人的往往是权限、端口和内存这些细节,下面按真实操作顺序拆开讲,照着做基本能一次跑通。
先想清楚:你的项目到底以什么形态跑起来
这一步定错,后面全是返工。
打war包还是打jar包
Spring Boot项目默认打成可执行jar,内置Tomcat,服务器上只要一个Java环境就能跑,传统SSM项目一般打war包,需要外部Tomcat容器来解压部署。
- jar包:
mvn clean package,产物在target/目录,启动命令java -jar xxx.jar - war包:
pom.xml里packaging写成war,产物丢进Tomcat的webapps/目录即可自动解压
一个容易踩的坑:Spring Boot打war包时要排除内置Tomcat(provided作用域),否则和外部Tomcat的类加载器打架,启动直接报冲突。
服务器环境三件套
不管哪种形态,服务器上这三样得有:JDK、数据库(MySQL居多)、Web容器或运行时。
| 组件 | 推荐版本 | 检查命令 |
|---|---|---|
| JDK | 17 LTS 或 8 | java -version |
| MySQL | 0 | systemctl status mysqld |
| Tomcat | 9 / 10 | ps -ef \| grep tomcat |
| Nginx | 稳定版 | nginx -v |
版本别乱配,Tomcat 10默认切到Jakarta EE命名空间,老项目用的还是javax.servlet,硬上Tomcat 10会报类找不到,行业共识认为,存量SSM项目留在Tomcat 8.5或9上最省心。
JavaWeb项目怎么部署到云服务器上
买好服务器之后,先把最基础的连通性打通,再谈部署。
Linux服务器部署JavaWeb项目详细步骤
以CentOS/Ubuntu云服务器为例,走一遍完整路径。
第一步,连上去并装环境。
ssh root@你的公网IP # CentOS yum install -y java-17-openjdk-devel # Ubuntu apt install -y openjdk-17-jdk java -version
第二步,装Tomcat(war包项目才需要)。
wget https://dlcdn.apache.org/tomcat/tomcat-9/.../apache-tomcat-9.x.tar.gz tar -zxvf apache-tomcat-9.x.tar.gz -C /opt/ /opt/apache-tomcat-9.x/bin/startup.sh
浏览器访问http://公网IP:8080,能看到那只猫就说明容器活了。
第三步,上传项目。
scp target/你的项目.war root@公网IP:/opt/apache-tomcat-9.x/webapps/
Tomcat检测到war包会自动解压部署,如果是jar包,用nohup java -jar app.jar > app.log 2>&1 &后台跑起来。
第四步,放行端口。 云厂商的安全组要开8080(临时调试)和80/443(正式访问),服务器本地防火墙也要开:
firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
业内专家指出,新手部署失败里相当一部分不是代码问题,而是安全组没放行本地curl通、外网打不开,先查这一层。
用宝塔面板部署是不是更省事
两者对比一下:
- 命令行部署:可控性强,出问题知道在哪一层,适合长期维护
- 宝塔面板部署:图形化装JDK、Tomcat、MySQL,上传文件靠拖拽,适合不熟悉Linux的人
但面板会多占内存,2G小机器上跑面板+Tomcat+MySQL会比较吃力,要是服务器配置本来就低,老老实实敲命令反而更稳。
简米云、酷番云这类国内服务器部署JavaWeb项目要注意什么
- 备案:用域名走80端口对外访问,域名得先完成ICP备案,否则会被拦截
- 地域选择:用户主要在国内就选国内节点,延迟低;面向海外选香港或新加坡
- 系统镜像:优先选纯净的CentOS或Ubuntu,别选带一堆预装软件的镜像
域名、Nginx反向代理和开机自启
项目在8080跑通了,接下来是正式化。
配Nginx反向代理
让用户访问80/443,Nginx转发到8080,顺便干掉端口号:
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;
}
}
HTTPS用certbot --nginx -d yourdomain.com一条命令申请免费证书,比手动配置省事。
让服务开机自启
手动startup.sh启动的进程,服务器一重启就没了,生产环境建议写systemd服务:
[Unit] Description=myapp After=network.target [Service] ExecStart=/usr/bin/java -jar /opt/app/app.jar Restart=always [Install] WantedBy=multi-user.target
systemctl enable myapp之后,重启机器也不用手动拉起来。
部署服务器一年要花多少钱
这是绕不开的现实问题,按配置分档:
| 场景 | 配置 | 大致年费 |
|---|---|---|
| 个人练手、课程作业 | 轻量应用服务器 2核2G | 百元级 |
| 小型生产环境 | 2核4G + 独立数据库 | 千元以内 |
| 中等流量业务 | 4核8G + 云数据库 + 负载均衡 | 数千元 |
新用户首年优惠力度大,第二年续费会明显上涨,续费前记得比价,域名几十元一年,SSL证书用免费的够用。
部署完就结束了吗?这些坑得提前避开
- 内存不足:2G机器跑Tomcat+MySQL+面板,JVM默认堆可能吃掉大半内存,加
-Xms512m -Xmx1024m限制一下 - 时区不对:容器或JVM时区默认UTC,日志时间全差8小时,启动参数加
-Duser.timezone=Asia/Shanghai - 中文乱码:数据库连接串记得带
characterEncoding=utf8,MySQL建库时就指定utf8mb4 - 日志无限膨胀:
nohup的输出文件不切割,跑几个月能把磁盘塞满,配个logrotate或者直接用logback按天切 - 数据库密码写死在配置里:换成环境变量注入,别把生产密码提交到Git
关于JavaWeb项目部署服务器的常见问题
部署后外网打不开,本地curl却正常,怎么回事?
按顺序查三层:云厂商安全组是否放行端口、服务器本地防火墙(firewalld/ufw)是否放行、Nginx是否真的监听在80,三层都通还不行的,看Tomcat的catalina.out有没有启动报错。
已有宝塔面板的服务器,还能手动装Tomcat吗?
可以,但别和面板装的版本抢端口,手动装的话换个端口,比如8081,Nginx里转发指向新端口就行,两套环境并存容易出现JAVA_HOME指向不一致的问题,装完用which java和echo $JAVA_HOME确认一遍。
小项目有必要用Docker部署吗?
看项目数量,单个项目、依赖简单,直接装环境更快;多个项目、环境需求互相冲突,Docker能省掉大量版本打架的麻烦,近年来容器化部署在中小团队里的接受度明显提高,但学习成本也是实打实的,先把命令行部署跑通再考虑容器并不吃亏。
把环境装对、端口放行、反向代理配好、服务设成开机自启,一套JavaWeb项目的生产部署就算闭环了,剩下的优化,都是在这个稳定底座上做加法。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/782398.html


