一、Linux 各目录详解
Linux 遵循 FHS(文件系统层次标准),根目录 / 是起点。
表格
| 目录 | 作用 |
|---|---|
/ |
根目录,所有目录的父目录 |
/bin |
基础用户命令(ls、cp、cat 等),单用户模式也可用 |
/sbin |
系统管理员命令(reboot、fdisk) |
/boot |
系统启动文件:内核、grub 引导程序,不要随意删 |
/dev |
设备文件,硬件抽象:/dev/sda磁盘、/dev/null黑洞、/dev/tty终端 |
/etc |
系统全局配置文件passwd 用户、hosts 主机名、nginx 配置、环境变量 profile |
/home |
普通用户家目录,/home/xxx,用户私有数据 |
/lib /lib64 |
系统依赖库文件,64 位程序库放 lib64 |
/media |
自动挂载的移动介质:U 盘、光盘 |
/mnt |
临时手动挂载目录,挂载磁盘、共享盘 |
/opt |
第三方大型软件安装目录(推荐 Java、中间件放这里) |
/proc |
虚拟文件系统,内存映射,查看进程信息/proc/pid,不占磁盘 |
/root |
root 超级管理员家目录,不在 /home 下 |
/run |
运行时临时文件,进程 pid、socket 文件,重启清空 |
/srv |
服务器服务数据,web、ftp 服务存放数据 |
/tmp |
临时目录,重启自动清理,放临时文件 |
/usr |
用户级程序:/usr/bin、/usr/lib、/usr/share 文档,系统预装软件 |
/var |
动态可变数据 :日志/var/log、数据库、缓存、pid 文件 |
重点记忆:
- 配置:
/etc- 日志:
/var/log- 第三方软件:
/opt- 用户家目录:
/home- 临时文件:
/tmp
二、两台服务器之间传输文件(实操步骤)
前提:两台机器网络互通,ssh 端口默认 22,防火墙放行
方式 1:scp(简单,小文件)
# 本地文件传到远程服务器
scp 本地文件 用户名@远程IP:远程路径
scp /opt/app.jar root@192.168.1.101:/opt/
# 远程文件下载到本地
scp root@192.168.1.101:/opt/app.jar /opt/
# 传输文件夹加 -r
scp -r /opt/backend root@192.168.1.101:/opt/
方式 2:rsync(生产推荐,增量同步,断点续传)
# 上传目录,保留权限,增量同步
rsync -avz /opt/backend/ root@192.168.1.101:/opt/backend/
# 参数说明:a归档、v详情、z压缩传输
免密登录(推荐,避免每次输密码)
- 本地生成密钥:
ssh-keygen(一路回车) - 推送公钥到远端:
ssh-copy-id root@192.168.1.101 - 之后 scp/rsync 不再需要密码
备选:sftp 交互式传输
sftp root@192.168.1.101
put 本地文件 #上传
get 远程文件 #下载
三、日志文件从尾部定位(tail 系列,生产最常用)
1. 查看文件末尾,默认最后 10 行
tail app.log
2. 指定查看最后 200 行
tail -n 200 app.log
3. 实时滚动监控日志(最常用,类似持续刷新)
tail -f app.log
# 追踪文件描述符;文件被logrotate切割后会断
tail -F app.log
# -F:文件改名切割后自动重新追踪,生产首选
4. 结合 grep 过滤,尾部实时检索关键词
tail -F app.log | grep -i "error"
5. 查看大文件,从尾部向上搜索(less)
less app.log
# 输入 G 跳到文件末尾;?关键词 向上搜索
实操技巧:日志很大时不要直接 cat,会刷屏耗 IO;优先 tail/less。
四、规范使用 Linux 文件系统(规范 + 实操)
1. 目录规划规范(生产推荐)
/opt/
├── java/ # jdk
├── backend/ # Java后端应用
├── frontend/ # 前端静态资源
├── scripts/ # 启停脚本
└── logs/ # 应用独立日志(不要全丢/var/log)
/data/ # 业务数据、上传文件(单独挂载数据盘)
/tmp # 临时文件,禁止存放业务持久数据
2. 权限规范
-
应用禁止直接用 root 运行,新建普通用户部署应用
useradd appuser
chown -R appuser:appuser /opt/backend
chmod 755 /opt/backend
chmod 644 *.jar # jar文件不需要执行权限
原则:最小权限原则,目录 755,普通文件 644,脚本 700
3. 磁盘与挂载规范
- 业务数据单独挂载独立磁盘分区到
/data,防止日志打满根分区 - 定期清理 /tmp,设置 tmp 自动清理
- 日志开启 logrotate 轮转,防止日志占满磁盘
4. 文件命名规范
- 不要中文、空格、特殊字符
& * ? - 脚本后缀
.sh,日志.log,备份加时间戳app-20261020.jar
5. 禁止操作
- 不要随意
chmod 777 - 不要在
/root下放业务程序 - 不要把业务日志写入
/tmp长期保存
五、环境变量配置(3 种级别,实操)
优先级:临时 shell > 用户级 > 全局
1. 临时环境变量(当前 shell 生效,重启终端失效)
export JAVA_HOME=/opt/java/jdk17
echo $JAVA_HOME
2. 用户级环境变量(只对当前用户生效,推荐部署用户)
编辑用户家目录 .bashrc 或者 .bash_profile
vi ~/.bashrc
# 添加内容
export JAVA_HOME=/opt/java/jdk17
export PATH=$PATH:$JAVA_HOME/bin
生效:
source ~/.bashrc
3. 全局环境变量(所有用户生效,需要 root)
vi /etc/profile
# 末尾添加
export JAVA_HOME=/opt/java/jdk17
export PATH=$PATH:$JAVA_HOME/bin
生效:
source /etc/profile
验证:
java -version
补充:systemd 服务读取环境变量不会读取 bash 的 profile,需要在 service 文件里单独配置 Environment=xxx
六、Java 应用部署 & 运维完整实操
环境:JDK17 SpringBoot 后端 + Nginx 前端静态资源
步骤 1:安装 JDK
-
上传 jdk 压缩包到
/opt -
解压
mkdir -p /opt/java
tar -zxvf jdk-17-linux-x64.tar.gz -C /opt/java/ -
配置环境变量(上面第五节)
-
校验:
java -version
步骤 2:代码上传
- 后端:将打包好的
app.jar上传到/opt/backend - 前端:打包 dist 静态资源上传到
/opt/frontend
用 scp /rysnc 上传,参考第二节
步骤 3:Nginx 部署前端 + 端口开通
-
安装 nginx
CentOS/Rocky
yum install nginx -y
Ubuntu
apt install nginx -y
-
nginx 配置
/etc/nginx/conf.d/frontend.confserver {
listen 80;
server_name 你的IP;
root /opt/frontend;
index index.html;
# 反向代理后端接口
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
}
} -
检查配置 & 重载 nginx
nginx -t
systemctl reload nginx -
防火墙放行端口
firewalld(CentOS/Rocky)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload查看放行端口
firewall-cmd --list-ports
云服务器额外需要在云厂商安全组放行端口
步骤 4:后端 SpringBoot 启停脚本(/opt/scripts/app.sh)
#!/bin/bash
APP_NAME="/opt/backend/app.jar"
LOG_FILE="/opt/logs/app.log"
case $1 in
start)
nohup java -jar $APP_NAME > $LOG_FILE 2>&1 &
echo "启动成功,pid=$!"
;;
stop)
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ];then
kill -15 $pid
sleep 3
echo "已停止"
else
echo "应用未运行"
fi
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ];then
echo "运行中,pid:$pid"
else
echo "已停止"
fi
;;
*)
echo "用法: $0 start|stop|restart|status"
;;
esac
授权:
chmod +x /opt/scripts/app.sh
# 使用
/opt/scripts/app.sh start
/opt/scripts/app.sh stop
/opt/scripts/app.sh restart
生产推荐:改用 systemd 托管,比 nohup 更稳定,崩溃自动重启
/etc/systemd/system/app.service
[Unit]
Description=Java Backend App
After=network.target
[Service]
User=appuser
WorkingDirectory=/opt/backend
ExecStart=/opt/java/jdk17/bin/java -jar app.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
# 加载、开机自启
systemctl daemon-reload
systemctl start app
systemctl enable app
systemctl status app
步骤 5:日志管理
-
应用日志目录:
/opt/logs,不要写在 jar 同目录 -
使用 logrotate 日志轮转,防止日志无限膨胀 新建
/etc/logrotate.d/app/opt/logs/app.log {
daily
rotate 10
compress
missingok
copytruncate
}
含义:按天切割,保留 10 份,压缩;copytruncate 不重启应用切割日志
- 查看日志:
tail -F /opt/logs/app.log
步骤 6:运维常用检查命令
# 查看端口监听
netstat -tlnp
ss -tlnp
# 查看进程
ps -ef | grep java
# 查看磁盘
df -h
# 查看内存
free -h
# 查看CPU
top
运维检查清单(上线前)
- JDK 版本正常,环境变量生效
- 端口防火墙 / 安全组放行
- 应用使用普通用户运行,非 root
- 日志轮转配置完成
- 应用设置开机自启(systemd)
- 目录权限正确,不使用 777
- 免密传输配置,方便后续发布