linux部署web项目 昨天半夜,项目同事老张把war包扔我微信上,项目说测试环境崩了,项目让我赶紧看看。项目我ssh上去,项目发现tomcat进程都没了。项目这种事在linux上太常见——不是项目你代码写得不好,是项目你压根没把它当个正经服务来养。 部署web项目,项目本质上就三件事:放对地方、项目跑对命令、项目看对日志。项目但大多数人栽在第一步——把项目直接丢在root目录下,项目然后nohup java -jar xxx.jar &,项目完事。项目你猜怎么着?一关机,全没了。root用户跑服务,本身就是个定时炸弹。 正经做法是建个专用用户,比如www,然后把项目扔到/home/www/apps下。目录权限锁死,700,别人看都看不到。别嫌麻烦,你线上出事故的时候,这个隔离能救你命。 然后是启动方式。别用nohup了,那玩意儿是给临时任务用的。用systemd,写个service文件,比如这样: [Unit] Description=My Web App After=network.target [Service] User=www WorkingDirectory=/home/www/apps/myapp ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar myapp.jar Restart=always RestartSec=10 [Install] WantedBy=multi-user.target 扔到/etc/systemd/system/myapp.service,然后systemctl daemon-reload,systemctl enable --now myapp。这玩意儿的好处是,崩了自动重启,开机自动拉起。你半夜不用爬起来敲命令了。 端口占用也是个坑。你8080起不来,八成是有个僵尸进程占着。lsof -i:8080看看,然后kill -9。但更气人的是,你kill了还起不来,因为那进程是别人root起的,你当前用户没权限杀。所以回到第一条——用同一个用户跑服务,别混。 日志这块,我见过太多人用catalina.out或者nohup.out。那玩意儿越滚越大,最后硬盘满了,服务挂了。你要做的是把日志输出到固定文件,然后用logrotate去轮转。比如每天切一个文件,保留7天,压缩。配好之后,你只需要grep ERROR去查问题,而不是去翻一个10G的txt。 部署完了,验证别只curl一下首页就完事。你得测接口,测静态资源,测数据库连接。有一次我部署完,首页200,但登录接口500,查了半天是配置文件里的数据库IP写错了。这种低级错误,用curl -X POST带参数测一下就能发现。 最后说个没人提但特别重要的——回滚。你部署新版本,出问题了,要能快速切回旧版本。最简单的方式,别覆盖旧包,保留上次的jar或者war,启动脚本里做个软链。出问题就ln -sfn old.jar current.jar,然后重启。别跟我说你用git回滚,线上跑的是编译后的产物,不是源码。 linux部署web项目,真没那么多玄学。你把用户、目录、systemd、日志、回滚这五件事理顺了,剩下的都是业务问题。别信那些花里胡哨的容器编排,小项目一个jar包跑起来比什么都实在。等你用户量真上来了,再谈k8s不迟。 |