linux学习 作者: typecho 时间: 2026-05-18 分类: 默认分类 # Linux 工程够用版学习讲义 基于项目中的学习路线整理。你的 Linux 学习目标不是成为“纯运维”,而是把 Linux 作为工程工具,用来支撑服务器部署、系统联调、测试平台搭建、Docker/Nginx 部署、日志排障和交付现场问题处理。 一句话定位: > 你要学的是“能把服务稳定跑起来、出问题能定位、能写进项目和简历”的 Linux,而不是内核、驱动、编译器、进程调度那种底层路线。 --- ## 1. 这条路线里 Linux 的位置 项目路线的主线是: > 通信/射频背景 + Linux/Docker/Nginx 部署能力 + Python 数据处理/测试平台能力 所以 Linux 在这里有三个作用。 第一,它是服务器操作环境。你以后做 Docker 部署、Nginx 反向代理、FastAPI 平台、Ollama/OpenWebUI 私有化部署,基本都会落到 Linux 服务器上。 第二,它是排障工具箱。服务访问不了、端口被占用、磁盘满了、权限不对、进程挂了、日志报错、Nginx 502、HTTPS 证书异常,这些都要靠 Linux 命令定位。 第三,它是面试和项目表达能力。你不需要说“精通 Linux 内核”,但要能说清楚“我如何在服务器上部署服务、查看日志、定位端口、处理权限、设置开机自启、排查资源占用”。 你应该避免的误区: - 不要一开始钻 Linux 内核源码。 - 不要把 Shell 高级编程当主线。 - 不要花太多时间背冷门命令。 - 不要只看视频不操作服务器。 - 不要把目标定成低端运维,而要定成“工程交付 + 部署排障 + 测试平台落地”。 你应该建立的能力: - 会连接服务器。 - 会管理文件和目录。 - 会理解权限。 - 会安装软件和管理服务。 - 会看进程、端口、磁盘、内存。 - 会看日志。 - 会排查一个 Web 服务为什么访问不了。 - 会为 Docker、Nginx、Python Web 服务提供 Linux 基础环境。 --- ## 2. 推荐学习顺序 不要按“Linux 大百科”的顺序学。建议按工程场景学。 ### 阶段 1:先会登录服务器和安全操作 目标: - 能用 SSH 登录服务器。 - 能用 SCP/SFTP 传文件。 - 知道自己当前在哪个目录。 - 知道哪些命令危险。 - 知道 root 用户和普通用户的区别。 必须掌握: ```bash ssh scp pwd whoami hostname date clear exit sudo ``` ### 阶段 2:文件和目录操作 目标: - 能在服务器上找到文件。 - 能创建、复制、移动、删除文件。 - 能查看配置文件和日志文件。 - 能编辑简单配置。 必须掌握: ```bash ls cd mkdir touch cp mv rm cat less head tail find du vim nano ``` ### 阶段 3:权限和用户 目标: - 知道为什么脚本不能执行。 - 知道为什么 Nginx 访问文件时报 403。 - 知道为什么 Docker 或服务没有权限写目录。 必须掌握: ```bash chmod chown id groups useradd passwd su sudo ``` ### 阶段 4:进程、资源和端口 目标: - 能判断服务有没有启动。 - 能找到占用端口的程序。 - 能看 CPU、内存、磁盘是否异常。 - 能停止异常进程。 必须掌握: ```bash ps top htop free -h df -h du -sh ss -tunlp lsof kill ``` ### 阶段 5:服务管理和日志 目标: - 能启动、停止、重启服务。 - 能设置服务开机自启。 - 能实时看日志。 - 能根据日志判断服务失败原因。 必须掌握: ```bash systemctl journalctl tail -f grep ``` ### 阶段 6:网络连通性和 Web 排障 目标: - 能判断域名是否解析正确。 - 能判断服务器是否能访问外网。 - 能判断本机服务是否正常响应。 - 能初步排查 Nginx 502/403/404。 必须掌握: ```bash ping curl ip addr ip route ss -tunlp dig nslookup traceroute ``` ### 阶段 7:和 Docker/Nginx/Python 项目结合 目标: - 会给项目创建目录。 - 会保存配置文件。 - 会查看容器日志和宿主机日志。 - 会判断问题是在 Linux、Docker、Nginx 还是应用代码。 必须掌握的工程动作: - 创建项目目录:`/opt/project-name` - 保存数据目录:`/data/project-name` - 保存日志目录:`/var/log/project-name` - 用 `systemctl` 管理 Nginx。 - 用 `journalctl` 和 `docker logs` 找错误。 - 用 `ss -tunlp` 看端口。 - 用 `curl` 本机自测接口。 --- ## 3. Linux 文件系统:先理解这些目录 你不需要背所有目录,但要知道常见目录的意义。 ```text / 根目录,所有路径从这里开始 /home 普通用户家目录 /root root 用户家目录 /etc 系统和服务配置文件 /var/log 日志目录 /var/www 常见网站文件目录 /opt 第三方项目或自部署项目目录 /usr/bin 常用命令程序 /usr/local 用户自己安装的软件常放这里 /tmp 临时文件目录 /data 常见自定义数据目录,不是所有系统默认都有 /proc 进程和系统状态的虚拟文件系统 ``` 工程上你最常接触的是: - `/etc/nginx/`:Nginx 配置。 - `/var/log/nginx/`:Nginx 访问日志和错误日志。 - `/opt/`:部署项目。 - `/home/用户名/`:普通用户文件。 - `/root/`:root 用户文件。 - `/tmp/`:临时测试文件。 路径有两种写法。 绝对路径: ```bash /etc/nginx/nginx.conf /opt/rf-platform/docker-compose.yml ``` 相对路径: ```bash ./docker-compose.yml ../logs/app.log ``` 建议你在服务器上操作配置文件时,尽量用绝对路径,减少“我到底在哪个目录”的混乱。 --- ## 4. SSH:连接服务器的第一步 SSH 是远程登录 Linux 服务器的基础。 基本登录: ```bash ssh 用户名@服务器IP ``` 指定端口: ```bash ssh -p 22 用户名@服务器IP ``` 使用密钥登录: ```bash ssh -i ~/.ssh/id_rsa 用户名@服务器IP ``` 第一次登录时会看到类似提示: ```text Are you sure you want to continue connecting? ``` 输入 `yes` 即可。它的意思是把这台服务器的指纹加入本机信任列表。 常见问题: ### 连接超时 可能原因: - 服务器没开机。 - IP 写错。 - 安全组没有开放 22 端口。 - 服务器防火墙阻止了 SSH。 - 本地网络访问不到服务器。 排查: ```bash ping 服务器IP ``` 如果 ping 不通,不一定代表服务器坏了,有些云服务器默认禁 ping。继续看端口是否能连。 ```bash ssh -v 用户名@服务器IP ``` `-v` 会输出更详细的连接过程。 ### Permission denied 可能原因: - 用户名错。 - 密码错。 - 密钥错。 - 服务器禁用了密码登录。 - 密钥权限太宽。 密钥权限可以这样修: ```bash chmod 600 ~/.ssh/id_rsa ``` ### 连接上以后第一件事 建议执行: ```bash whoami pwd hostname ip addr df -h free -h ``` 你要知道: - 我是谁。 - 我在哪。 - 我连的是哪台机器。 - 这台机器的 IP 是什么。 - 磁盘是否快满。 - 内存是否够用。 --- ## 5. SCP:在本地和服务器之间传文件 从本地传到服务器: ```bash scp ./app.py 用户名@服务器IP:/opt/rf-platform/ ``` 从服务器下载到本地: ```bash scp 用户名@服务器IP:/var/log/nginx/error.log ./ ``` 传目录要加 `-r`: ```bash scp -r ./rf-platform 用户名@服务器IP:/opt/ ``` 指定 SSH 端口: ```bash scp -P 2222 ./file.txt 用户名@服务器IP:/tmp/ ``` 注意:`ssh` 指定端口是小写 `-p`,`scp` 指定端口是大写 `-P`。 项目里常见用途: - 上传 `docker-compose.yml`。 - 上传 Nginx 配置。 - 下载日志给别人分析。 - 上传测试数据文件,比如 `.csv`、`.s2p`。 --- ## 6. 文件查看:别一上来就 vim 看文件内容: ```bash cat 文件名 ``` 适合小文件。不适合大日志。 分页看文件: ```bash less 文件名 ``` 常用操作: - `Space` 下一页。 - `b` 上一页。 - `/关键词` 搜索。 - `n` 下一个匹配。 - `q` 退出。 看前几行: ```bash head 文件名 head -n 50 文件名 ``` 看后几行: ```bash tail 文件名 tail -n 100 文件名 ``` 实时看日志: ```bash tail -f /var/log/nginx/error.log ``` 实时看最近 200 行再持续追踪: ```bash tail -n 200 -f /var/log/nginx/error.log ``` 工程建议: 排查服务时不要盲目改配置。先看日志,再改配置,再重启服务,再继续看日志。 --- ## 7. 文件操作:创建、复制、移动、删除 查看当前目录: ```bash pwd ``` 列出文件: ```bash ls ls -l ls -la lh -lh ``` 如果你输入 `lh -lh` 报错,说明系统没有 `lh` 这个别名。标准命令是: ```bash ls -lh ``` `ls -lh` 的意思: - `-l`:长格式显示。 - `-h`:human readable,用 KB/MB/GB 显示大小。 进入目录: ```bash cd /opt cd .. cd ~ cd - ``` 创建目录: ```bash mkdir logs mkdir -p /opt/rf-platform/logs ``` `-p` 表示父目录不存在也一起创建。 创建空文件: ```bash touch app.log ``` 复制文件: ```bash cp nginx.conf nginx.conf.bak ``` 复制目录: ```bash cp -r rf-platform rf-platform-bak ``` 移动或重命名: ```bash mv old.conf new.conf mv app.py /opt/rf-platform/ ``` 删除文件: ```bash rm app.log ``` 删除目录: ```bash rm -r logs ``` 特别谨慎: ```bash rm -rf / rm -rf * rm -rf /opt/* ``` `rm -rf` 没有回收站。你现在阶段只在明确知道路径时使用。 安全习惯: 删除前先 `pwd` 和 `ls`。 ```bash pwd ls -la rm -r ./logs-old ``` --- ## 8. 查找文件和内容 按文件名查找: ```bash find /opt -name "docker-compose.yml" find /etc -name "*nginx*" ``` 按目录大小排查磁盘占用: ```bash du -sh /var/log du -sh /opt/* ``` 查找文件内容: ```bash grep "error" app.log grep -i "error" app.log grep -n "listen" /etc/nginx/nginx.conf grep -r "server_name" /etc/nginx/ ``` 参数含义: - `-i`:忽略大小写。 - `-n`:显示行号。 - `-r`:递归查找目录。 日志中过滤错误: ```bash grep -i "error" /var/log/nginx/error.log grep -i "permission denied" /var/log/nginx/error.log ``` 实时日志中筛选关键词: ```bash tail -f app.log | grep --line-buffered "ERROR" ``` 如果你只记一个思路: > 文件找不到用 `find`,内容找不到用 `grep`,日志太长用 `tail` 和 `less`。 --- ## 9. Vim:只掌握够改配置的部分 你不需要一开始学成 Vim 高手。够用就行。 打开文件: ```bash vim /etc/nginx/nginx.conf ``` 进入编辑模式: ```text i ``` 保存退出: ```text Esc :wq Enter ``` 不保存退出: ```text Esc :q! Enter ``` 只保存: ```text Esc :w Enter ``` 搜索: ```text /server_name ``` 跳到下一处: ```text n ``` 显示行号: ```text :set nu ``` 工程建议: 改配置前先备份: ```bash cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak ``` 改完先检查配置: ```bash nginx -t ``` 再重启: ```bash systemctl reload nginx ``` --- ## 10. 用户、root 和 sudo Linux 里常见两类用户: - root:最高权限用户。 - 普通用户:日常登录用户。 查看当前用户: ```bash whoami ``` 查看用户 ID 和所属组: ```bash id ``` 临时用管理员权限执行命令: ```bash sudo systemctl restart nginx ``` 切换到 root: ```bash su - ``` 或者: ```bash sudo -i ``` 不建议长期用 root 乱操作。工程现场常见事故很多来自 root 下误删文件、误改权限。 如果普通用户没有 sudo 权限,会看到类似: ```text user is not in the sudoers file ``` 这说明当前用户不能执行管理员操作,需要 root 或管理员配置权限。 --- ## 11. 权限:理解 rwx 就够用一大半 查看权限: ```bash ls -l ``` 你会看到类似: ```text -rw-r--r-- 1 root root 1024 May 18 app.conf drwxr-xr-x 2 www www 4096 May 18 static ``` 第一列含义: ```text -rw-r--r-- ``` 第一个字符: - `-`:普通文件。 - `d`:目录。 - `l`:软链接。 后面 9 个字符分三组: ```text rw- r-- r-- 用户 组 其他人 ``` 权限含义: - `r`:read,读。 - `w`:write,写。 - `x`:execute,执行。 常见权限数字: - `7 = rwx` - `6 = rw-` - `5 = r-x` - `4 = r--` 常用命令: ```bash chmod +x deploy.sh chmod 644 app.conf chmod 755 /opt/rf-platform chown -R www-data:www-data /var/www/html ``` 常见场景: ### 脚本不能执行 现象: ```text Permission denied ``` 处理: ```bash chmod +x deploy.sh ./deploy.sh ``` ### Nginx 403 可能原因: - 文件不存在。 - Nginx 用户没有读取权限。 - 目录没有执行权限。 - 配置的 root/alias 路径不对。 排查: ```bash ls -ld /var/www ls -ld /var/www/html ls -l /var/www/html tail -n 100 /var/log/nginx/error.log ``` ### 服务无法写日志 可能原因: - 日志目录不存在。 - 服务运行用户没有写权限。 处理思路: ```bash mkdir -p /var/log/rf-platform chown -R appuser:appuser /var/log/rf-platform ``` 不要一遇到权限问题就 `chmod 777`。这会让所有人可读、可写、可执行,安全性很差。学习阶段可以临时验证,但正式项目不要这样写进文档。 --- ## 12. 软件安装:知道不同发行版的包管理器 Ubuntu/Debian 常用: ```bash apt update apt install nginx apt remove nginx ``` CentOS/RHEL/Rocky 常用: ```bash yum install nginx dnf install nginx ``` 查看系统版本: ```bash cat /etc/os-release ``` 更新软件源: ```bash sudo apt update ``` 安装常用工具: ```bash sudo apt install -y curl wget vim git unzip htop nginx ``` 注意: - `apt update` 是更新软件列表。 - `apt upgrade` 是升级已安装软件。 - 服务器生产环境不要随手全量升级,先确认影响。 --- ## 13. 进程:服务到底有没有在跑 查看进程: ```bash ps aux ``` 筛选进程: ```bash ps aux | grep nginx ps aux | grep python ``` 动态查看资源: ```bash top ``` 如果有 `htop`,更好用: ```bash htop ``` 看某个进程的 PID: ```bash ps aux | grep uvicorn ``` 结束进程: ```bash kill PID ``` 强制结束: ```bash kill -9 PID ``` 不要一开始就 `kill -9`。普通 `kill` 会给程序一个正常退出机会,`kill -9` 是强制终止,可能导致文件未写完、状态异常。 工程场景: FastAPI 项目访问不了,你可以先看进程: ```bash ps aux | grep uvicorn ``` 如果没有进程,再看启动脚本或 systemd 服务日志。 --- ## 14. CPU、内存和磁盘 查看内存: ```bash free -h ``` 关注: - `total`:总内存。 - `used`:已使用。 - `available`:可用。 Linux 会用一部分内存做缓存,所以不要只看 `used`,更要看 `available`。 查看磁盘: ```bash df -h ``` 关注: - `/` 根分区是否快满。 - `/var` 或 `/data` 是否快满。 查看目录占用: ```bash du -sh /var/log du -sh /var/lib/docker du -sh /opt/* ``` 常见磁盘满原因: - Docker 镜像和容器日志过多。 - Nginx 日志长期不清理。 - 应用上传文件没有限制。 - 数据库备份堆积。 初步排查: ```bash df -h du -sh /var/* du -sh /var/log/* du -sh /var/lib/docker/* ``` 注意: 不要随便删除 `/var/lib/docker`。这可能破坏 Docker 数据。先用 Docker 自己的命令查看和清理。 --- ## 15. 端口:服务是否在监听 查看监听端口: ```bash ss -tunlp ``` 参数含义: - `-t`:TCP。 - `-u`:UDP。 - `-n`:不解析成域名,直接显示数字。 - `-l`:只看监听状态。 - `-p`:显示进程信息。 查看 80 端口: ```bash ss -tunlp | grep ':80' ``` 查看 443 端口: ```bash ss -tunlp | grep ':443' ``` 查看 FastAPI 常用 8000 端口: ```bash ss -tunlp | grep ':8000' ``` 如果没有 `ss`,可尝试: ```bash netstat -tunlp ``` 但新系统更推荐 `ss`。 端口排障思路: 1. 服务是否启动。 2. 服务是否监听正确端口。 3. 服务监听的是 `127.0.0.1` 还是 `0.0.0.0`。 4. 防火墙或安全组是否放行。 5. Nginx 是否代理到正确端口。 `127.0.0.1:8000` 表示只允许本机访问。 `0.0.0.0:8000` 表示监听所有网卡,外部也可能访问,前提是防火墙和安全组允许。 --- ## 16. curl:服务器自测神器 `curl` 用来从命令行发 HTTP 请求。 访问首页: ```bash curl http://127.0.0.1:8000 ``` 查看响应头: ```bash curl -I http://example.com ``` 显示详细连接过程: ```bash curl -v http://127.0.0.1:8000 ``` 测试 POST 接口: ```bash curl -X POST http://127.0.0.1:8000/api/analyze ``` 带 JSON: ```bash curl -X POST http://127.0.0.1:8000/api/analyze \ -H "Content-Type: application/json" \ -d '{"file":"test.csv"}' ``` 常见判断: - `Connection refused`:端口没有服务监听,或服务没启动。 - `Connection timed out`:网络不通、防火墙、安全组或服务无响应。 - `404`:服务通了,但路径不对。 - `502`:Nginx 通了,但后端服务异常或代理地址错。 - `403`:权限或访问规则问题。 项目排障中非常推荐本机先测: ```bash curl -v http://127.0.0.1:8000 ``` 如果本机都不通,先别怀疑域名和 HTTPS,先把应用服务跑起来。 --- ## 17. systemctl:服务管理核心 查看服务状态: ```bash systemctl status nginx ``` 启动服务: ```bash sudo systemctl start nginx ``` 停止服务: ```bash sudo systemctl stop nginx ``` 重启服务: ```bash sudo systemctl restart nginx ``` 重新加载配置: ```bash sudo systemctl reload nginx ``` 设置开机自启: ```bash sudo systemctl enable nginx ``` 取消开机自启: ```bash sudo systemctl disable nginx ``` 看是否开机自启: ```bash systemctl is-enabled nginx ``` 看是否正在运行: ```bash systemctl is-active nginx ``` 常见服务: ```bash systemctl status nginx systemctl status docker systemctl status ssh ``` `reload` 和 `restart` 区别: - `reload`:重新加载配置,尽量不中断服务。 - `restart`:停止后重新启动,可能有短暂中断。 Nginx 改配置后常用: ```bash sudo nginx -t sudo systemctl reload nginx ``` 先 `nginx -t` 检查配置,再 reload。 --- ## 18. journalctl:看 systemd 服务日志 查看某个服务日志: ```bash journalctl -u nginx ``` 看最近 100 行: ```bash journalctl -u nginx -n 100 ``` 实时追踪: ```bash journalctl -u nginx -f ``` 看今天日志: ```bash journalctl -u nginx --since today ``` 看指定时间: ```bash journalctl -u nginx --since "2026-05-18 10:00:00" ``` 如果服务启动失败: ```bash systemctl status 服务名 journalctl -u 服务名 -n 100 ``` 重点看: - 配置文件路径是否错误。 - 端口是否被占用。 - 权限是否不足。 - 环境变量是否缺失。 - 可执行文件路径是否不存在。 --- ## 19. 日志思维:问题不是猜出来的 工程上排障最重要的习惯: > 先拿证据,再做判断。 常见日志位置: ```text /var/log/nginx/access.log /var/log/nginx/error.log /var/log/syslog /var/log/messages /var/log/auth.log ``` Ubuntu 常见系统日志: ```bash tail -f /var/log/syslog ``` CentOS/RHEL 常见系统日志: ```bash tail -f /var/log/messages ``` Nginx 错误日志: ```bash tail -f /var/log/nginx/error.log ``` Nginx 访问日志: ```bash tail -f /var/log/nginx/access.log ``` 日志里你要关注: - `error` - `failed` - `permission denied` - `connection refused` - `no such file or directory` - `address already in use` - `upstream timed out` - `connect() failed` 排障模板: ```bash systemctl status nginx journalctl -u nginx -n 100 tail -n 100 /var/log/nginx/error.log ss -tunlp | grep ':80' curl -I http://127.0.0.1 ``` --- ## 20. 网络基础:够部署排障即可 查看 IP: ```bash ip addr ``` 查看路由: ```bash ip route ``` 测试网络连通: ```bash ping 8.8.8.8 ping baidu.com ``` 如果 IP 能 ping 通,域名 ping 不通,可能是 DNS 问题。 查看 DNS 解析: ```bash nslookup example.com dig example.com ``` 跟踪路由: ```bash traceroute example.com ``` 如果没有 `traceroute`,Ubuntu 可安装: ```bash sudo apt install traceroute ``` Web 服务访问链路: ```text 浏览器 -> 域名 DNS -> 云服务器公网 IP -> 安全组/防火墙 -> Nginx 80/443 -> 后端服务 8000/其他端口 -> 应用代码 -> 数据文件/数据库 ``` 排查时要一层层确认。 --- ## 21. 防火墙和云安全组 很多初学者会忽略:服务器内部开放端口,不代表外网能访问。 需要同时满足: - 服务监听了端口。 - Linux 防火墙放行。 - 云厂商安全组放行。 - Nginx 配置正确。 - 域名解析正确。 Ubuntu 常见防火墙 UFW: ```bash sudo ufw status sudo ufw allow 80 sudo ufw allow 443 sudo ufw allow 22 ``` CentOS/RHEL 常见 firewalld: ```bash sudo firewall-cmd --state sudo firewall-cmd --list-all sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload ``` 云服务器还要去控制台安全组开放: - SSH:22 - HTTP:80 - HTTPS:443 - 测试服务端口:如 8000,建议只临时开放 正式项目建议: - 外部只开放 80/443。 - 后端 8000 只监听本机 `127.0.0.1`。 - 由 Nginx 反向代理到后端。 --- ## 22. Nginx 相关 Linux 基础 虽然 Nginx 是下一阶段重点,但 Linux 部分要先会这些。 配置目录常见位置: ```text /etc/nginx/nginx.conf /etc/nginx/conf.d/ /etc/nginx/sites-available/ /etc/nginx/sites-enabled/ ``` 日志目录: ```text /var/log/nginx/access.log /var/log/nginx/error.log ``` 检查配置: ```bash sudo nginx -t ``` 重新加载: ```bash sudo systemctl reload nginx ``` 查看状态: ```bash systemctl status nginx ``` 常见 502 排查: ```bash tail -n 100 /var/log/nginx/error.log ss -tunlp | grep ':8000' curl -v http://127.0.0.1:8000 ``` 如果日志里有: ```text connect() failed (111: Connection refused) while connecting to upstream ``` 通常说明后端端口没有服务在监听,或者 Nginx 代理地址写错。 常见 403 排查: ```bash tail -n 100 /var/log/nginx/error.log ls -ld /var/www/html ls -l /var/www/html ``` 常见 404 排查: ```bash grep -n "root" /etc/nginx/nginx.conf grep -n "location" /etc/nginx/nginx.conf ``` --- ## 23. Docker 相关 Linux 基础 Docker 本身是下一阶段,但 Linux 要先帮你理解几个点。 Docker 数据常见位置: ```text /var/lib/docker ``` Docker 服务: ```bash systemctl status docker sudo systemctl start docker sudo systemctl enable docker ``` 普通用户执行 docker 报权限问题: ```text permission denied while trying to connect to the Docker daemon socket ``` 常见处理: ```bash sudo usermod -aG docker 当前用户名 ``` 然后重新登录 SSH。 不要直接乱改 `/var/run/docker.sock` 权限。 查看 Docker 占用磁盘: ```bash du -sh /var/lib/docker ``` 清理前先看: ```bash docker system df ``` 项目目录建议: ```text /opt/rf-platform/docker-compose.yml /opt/rf-platform/.env /opt/rf-platform/nginx/ /opt/rf-platform/data/ /opt/rf-platform/logs/ ``` Linux 要负责把这些目录权限、路径、磁盘空间管理好。 --- ## 24. 环境变量和 PATH 查看环境变量: ```bash env ``` 查看某个变量: ```bash echo $PATH ``` `PATH` 是系统查找命令的位置列表。 比如你输入: ```bash python3 ``` 系统会到 `PATH` 里的目录挨个找有没有 `python3`。 临时设置变量: ```bash export APP_ENV=production ``` 当前终端关闭后失效。 写入 shell 配置: ```bash vim ~/.bashrc ``` 或: ```bash vim ~/.zshrc ``` 让配置生效: ```bash source ~/.bashrc ``` systemd 服务里的环境变量要单独配置,不能只依赖你当前终端里的 `export`。 --- ## 25. 压缩和解压 常见压缩包: ```text .zip .tar .tar.gz .tgz ``` 解压 zip: ```bash unzip file.zip ``` 打包目录: ```bash tar -czvf project.tar.gz project/ ``` 解压: ```bash tar -xzvf project.tar.gz ``` 只查看压缩包内容: ```bash tar -tzf project.tar.gz ``` 项目用途: - 打包部署文件。 - 备份配置和日志。 - 上传测试数据。 备份 Nginx 配置: ```bash tar -czvf nginx-conf-backup.tar.gz /etc/nginx ``` --- ## 26. 软链接:Nginx 配置常见 软链接类似快捷方式。 创建软链接: ```bash ln -s /etc/nginx/sites-available/rf-platform.conf /etc/nginx/sites-enabled/rf-platform.conf ``` 查看软链接: ```bash ls -l /etc/nginx/sites-enabled/ ``` 会看到: ```text rf-platform.conf -> /etc/nginx/sites-available/rf-platform.conf ``` 删除软链接: ```bash rm /etc/nginx/sites-enabled/rf-platform.conf ``` 这通常不会删除原文件,只删除链接。 --- ## 27. 时间、时区和定时任务 查看时间: ```bash date ``` 查看时区: ```bash timedatectl ``` 设置时区为上海: ```bash sudo timedatectl set-timezone Asia/Shanghai ``` 定时任务用 cron。 编辑当前用户定时任务: ```bash crontab -e ``` 查看: ```bash crontab -l ``` 例子:每天凌晨 2 点执行备份脚本。 ```cron 0 2 * * * /opt/rf-platform/scripts/backup.sh ``` cron 常见坑: - PATH 很短,脚本里最好写绝对路径。 - 工作目录不一定是项目目录。 - 日志要重定向出来。 推荐写法: ```cron 0 2 * * * cd /opt/rf-platform && /bin/bash scripts/backup.sh >> /var/log/rf-platform/backup.log 2>&1 ``` --- ## 28. 一个标准 Web 服务排障流程 场景:你部署了 FastAPI 服务,浏览器访问不了。 ### 第一步:确认机器 ```bash hostname ip addr pwd ``` 确认自己没有连错服务器。 ### 第二步:确认磁盘和内存 ```bash df -h free -h ``` 磁盘满了,很多服务会异常。 ### 第三步:确认进程 ```bash ps aux | grep uvicorn ``` 如果进程不存在,服务没启动。 ### 第四步:确认端口 ```bash ss -tunlp | grep ':8000' ``` 如果没有监听,应用没有正常启动。 ### 第五步:本机 curl ```bash curl -v http://127.0.0.1:8000 ``` 本机不通,先查应用。 ### 第六步:查应用日志 ```bash journalctl -u rf-platform -n 100 tail -n 100 /opt/rf-platform/logs/app.log ``` 看是否缺依赖、路径错误、端口占用、权限不足。 ### 第七步:查 Nginx ```bash nginx -t systemctl status nginx tail -n 100 /var/log/nginx/error.log ``` 看是否代理错端口。 ### 第八步:查防火墙和安全组 ```bash sudo ufw status ``` 再去云厂商控制台看安全组。 这个流程可以写进项目 README,面试时也能讲。 --- ## 29. Nginx 502 的完整判断 502 的意思通常是:Nginx 找不到或连不上后端。 排查命令: ```bash tail -n 100 /var/log/nginx/error.log ss -tunlp | grep ':8000' curl -v http://127.0.0.1:8000 systemctl status nginx ``` 常见原因: - 后端服务没启动。 - 后端端口写错。 - 后端只监听了错误地址。 - Docker 端口映射错。 - Nginx 配置里的 upstream 写错。 - 后端启动慢或超时。 如果 Nginx 配置是: ```nginx proxy_pass http://127.0.0.1:8000; ``` 你就必须确认: ```bash curl -v http://127.0.0.1:8000 ``` 能在服务器本机访问。 如果后端在 Docker Compose 网络里,Nginx 也在容器里,代理地址可能应该是服务名,而不是 `127.0.0.1`。 --- ## 30. 权限问题的完整判断 场景:应用启动了,但上传文件失败。 可能报错: ```text Permission denied: '/opt/rf-platform/uploads/test.csv' ``` 排查: ```bash ls -ld /opt/rf-platform ls -ld /opt/rf-platform/uploads ps aux | grep uvicorn ``` 你要确认: - 应用以哪个用户运行。 - 上传目录属于谁。 - 目录是否有写权限。 处理: ```bash sudo mkdir -p /opt/rf-platform/uploads sudo chown -R appuser:appuser /opt/rf-platform/uploads sudo chmod 755 /opt/rf-platform/uploads ``` 如果是 Docker 容器,还要看 volume 映射后的宿主机目录权限。 --- ## 31. 端口冲突的完整判断 现象: ```text Address already in use ``` 排查: ```bash ss -tunlp | grep ':8000' ``` 假设输出显示 PID 是 1234。 查看进程: ```bash ps -p 1234 -f ``` 处理方式: - 改你的服务端口。 - 停掉占用端口的旧服务。 - 检查是否重复启动了同一个服务。 停止旧进程: ```bash kill 1234 ``` 如果是 systemd 服务: ```bash sudo systemctl stop 服务名 ``` 不要只 kill 进程而不查它是不是由 systemd 或 Docker 自动拉起,否则它可能马上又起来。 --- ## 32. 磁盘满的完整判断 现象: - 服务无法写日志。 - 数据上传失败。 - Docker 容器异常退出。 - 数据库报错。 排查: ```bash df -h du -sh /var/* du -sh /var/log/* du -sh /opt/* du -sh /var/lib/docker ``` 如果 `/var/log` 很大: ```bash ls -lh /var/log ``` 如果 Docker 很大: ```bash docker system df ``` 谨慎清理: ```bash docker image prune docker container prune ``` 更激进的: ```bash docker system prune ``` 执行前要确认不会删除仍需要的镜像、停止容器、缓存。 长期方案: - 配置日志轮转。 - 限制 Docker 日志大小。 - 项目上传目录设置清理策略。 - 数据库和文件备份分开存储。 --- ## 33. systemd 自定义服务:把 Python 项目管起来 如果你不用 Docker,也可以用 systemd 管理 FastAPI。 示例服务文件: ```ini [Unit] Description=RF Test Data Platform After=network.target [Service] User=appuser WorkingDirectory=/opt/rf-platform ExecStart=/opt/rf-platform/.venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` 保存为: ```text /etc/systemd/system/rf-platform.service ``` 加载配置: ```bash sudo systemctl daemon-reload ``` 启动: ```bash sudo systemctl start rf-platform ``` 开机自启: ```bash sudo systemctl enable rf-platform ``` 看状态: ```bash systemctl status rf-platform ``` 看日志: ```bash journalctl -u rf-platform -f ``` 面试表达: > 我将 FastAPI 服务配置为 systemd service,指定运行用户、工作目录、启动命令和自动重启策略,通过 journalctl 查看服务日志,配合 Nginx 反向代理对外提供 HTTPS 访问。 --- ## 34. 和射频测试平台项目怎么结合 你的差异化项目可以是: > 射频测试数据自动化分析与可视化平台 Linux 在项目里负责: - 创建部署目录。 - 管理上传数据目录。 - 管理日志目录。 - 启动 Python/FastAPI 服务。 - 配置 Nginx 反向代理。 - 查看端口和服务状态。 - 排查用户上传失败、页面打不开、服务异常退出等问题。 建议目录: ```text /opt/rf-platform/ app/ data/ uploads/ outputs/ logs/ docker-compose.yml README.md ``` 常用检查命令: ```bash cd /opt/rf-platform ls -la df -h free -h ss -tunlp curl -v http://127.0.0.1:8000 tail -n 100 logs/app.log ``` 项目 README 可以写: ```text 部署环境:Ubuntu Server 服务管理:Docker Compose / systemd 反向代理:Nginx 日志排查:journalctl、tail、docker logs 端口检查:ss -tunlp 资源检查:df -h、free -h、top ``` 这会比只写“熟悉 Linux”更有说服力。 --- ## 35. Linux 学习路线的 14 天安排 ### 第 1-2 天:SSH 和文件系统 练习: - 登录服务器。 - 查看系统版本。 - 熟悉 `/etc`、`/var/log`、`/opt`、`/home`。 - 用 `scp` 上传下载文件。 验收: ```bash ssh 用户名@服务器IP cat /etc/os-release pwd ls -la /var/log scp ./test.txt 用户名@服务器IP:/tmp/ ``` ### 第 3-4 天:文件操作和 vim 练习: - 创建项目目录。 - 复制、移动、删除测试文件。 - 用 vim 修改配置。 - 改配置前备份。 验收: ```bash mkdir -p /opt/demo/logs cp demo.conf demo.conf.bak vim demo.conf ``` ### 第 5-6 天:权限 练习: - 看懂 `ls -l`。 - 修改脚本执行权限。 - 修改目录所属用户。 - 模拟上传目录不可写问题。 验收: ```bash chmod +x deploy.sh chown -R appuser:appuser /opt/demo/uploads ls -ld /opt/demo/uploads ``` ### 第 7-8 天:进程、端口、资源 练习: - 启动一个 Python HTTP 服务。 - 查看进程。 - 查看端口。 - 用 curl 测试。 验收: ```bash python3 -m http.server 8000 ps aux | grep python ss -tunlp | grep ':8000' curl -I http://127.0.0.1:8000 ``` ### 第 9-10 天:systemctl 和 journalctl 练习: - 安装 Nginx。 - 启动、停止、重载 Nginx。 - 查看 Nginx 日志。 验收: ```bash systemctl status nginx sudo nginx -t sudo systemctl reload nginx journalctl -u nginx -n 50 ``` ### 第 11-12 天:网络和 Web 排障 练习: - 用 curl 判断服务是否正常。 - 用 ss 查端口。 - 制造一个端口不通问题并排查。 - 看 Nginx 访问日志和错误日志。 验收: ```bash curl -v http://127.0.0.1 tail -n 50 /var/log/nginx/access.log tail -n 50 /var/log/nginx/error.log ``` ### 第 13-14 天:小项目部署复盘 练习: - 部署一个最小 Web 服务。 - 用 Nginx 代理。 - 写部署 README。 - 写排障记录。 验收: - README 里有部署步骤。 - README 里有常见问题排查。 - 能解释每条命令为什么用。 --- ## 36. 必背命令清单 连接和身份: ```bash ssh 用户名@服务器IP scp 本地文件 用户名@服务器IP:/远程路径 whoami pwd hostname sudo 命令 ``` 文件目录: ```bash ls -la cd /path mkdir -p /path cp 源 目标 mv 源 目标 rm 文件 cat 文件 less 文件 tail -n 100 文件 tail -f 文件 find /path -name "文件名" grep -r "关键词" /path ``` 权限: ```bash ls -l chmod +x script.sh chmod 755 dir chmod 644 file chown -R user:group dir ``` 资源: ```bash ps aux top free -h df -h du -sh /path ``` 端口和网络: ```bash ss -tunlp curl -v http://127.0.0.1:8000 ping IP或域名 ip addr ip route ``` 服务和日志: ```bash systemctl status 服务名 systemctl start 服务名 systemctl stop 服务名 systemctl restart 服务名 systemctl reload 服务名 systemctl enable 服务名 journalctl -u 服务名 -n 100 journalctl -u 服务名 -f ``` --- ## 37. 面试怎么讲 Linux 不要说: > 我熟悉 Linux。 这句话太空。 可以说: > 我主要掌握 Linux 服务器部署和排障相关能力,包括 SSH 登录、文件和权限管理、systemd 服务管理、journalctl 日志查看、端口监听排查、磁盘和内存检查,以及 Nginx/Docker 部署中常见的 502、403、端口冲突、权限不足等问题定位。 如果面试官问:“服务访问不了你怎么排查?” 可以答: > 我会先确认是否连对服务器,然后检查资源状态,比如 `df -h` 和 `free -h`。接着用 `ps aux` 或 `systemctl status` 看服务是否运行,用 `ss -tunlp` 看端口是否监听,再用 `curl -v http://127.0.0.1:端口` 在服务器本机测试。如果本机服务正常,再看 Nginx 配置和错误日志,比如 `nginx -t`、`tail -n 100 /var/log/nginx/error.log`。最后再确认防火墙和云安全组是否开放。 如果面试官问:“Nginx 502 怎么查?” 可以答: > 502 通常是 Nginx 连不上后端。我会先看 `/var/log/nginx/error.log`,再确认 upstream 配置的端口是否有服务监听,用 `ss -tunlp | grep 端口`,然后用 `curl` 直接访问后端。如果后端没起来,就看应用日志或 `journalctl -u 服务名`。如果后端在 Docker 里,还要确认端口映射和容器网络。 如果面试官问:“权限问题怎么查?” 可以答: > 我会用 `ls -l` 和 `ls -ld` 看文件及父目录权限,确认服务运行用户是谁,再判断是否有读写执行权限。比如 Nginx 403 可能不是文件没有读权限,而是父目录没有执行权限。处理时我会优先用 `chown` 调整属主和 `chmod 755/644` 设置合理权限,不会直接用 `chmod 777` 作为正式方案。 --- ## 38. 简历怎么写 Linux 技能栏可以写: ```text Linux:熟悉服务器常用命令、文件/权限管理、systemd 服务管理、journalctl 日志排查、端口与资源监控,能够完成 Web 服务部署和常见故障定位。 ``` 项目里可以写: ```text 在 Ubuntu Server 上完成 FastAPI 服务部署,使用 systemd/Docker Compose 管理服务进程,结合 Nginx 反向代理对外提供访问;通过 ss、curl、journalctl、tail 等命令排查端口占用、502、权限不足和日志异常问题。 ``` 更贴合你的路线可以写: ```text 面向射频测试数据分析平台,搭建 Linux 服务器运行环境,规划上传数据、分析结果和日志目录,配置服务自启动和反向代理,并编写部署与故障排查文档。 ``` --- ## 39. 不需要优先学的内容 这些不是不能学,而是你现在不该优先投入大量时间: - Linux 内核源码。 - 驱动开发。 - 进程调度算法。 - 高级 Shell 编程。 - awk/sed 特别复杂的写法。 - iptables 深度规则。 - Kubernetes 大规模集群。 - Prometheus/Grafana 全套监控体系。 - 高可用数据库运维。 等你完成 Linux + Docker + Nginx + Python 测试平台项目以后,再按岗位需要补。 --- ## 40. 最小实战任务 完成下面这个任务,你的 Linux 入门就不是纸上谈兵。 任务:在 Linux 服务器上部署一个最小 Web 服务。 要求: 1. 用 SSH 登录服务器。 2. 创建 `/opt/linux-demo`。 3. 上传一个简单 HTML 或 Python Web 服务。 4. 启动服务监听 8000。 5. 用 `ss -tunlp` 确认端口。 6. 用 `curl` 本机访问。 7. 配 Nginx 反向代理到 8000。 8. 用 `nginx -t` 检查配置。 9. 用 `systemctl reload nginx` 生效。 10. 查看访问日志和错误日志。 11. 故意制造一个错误端口,观察 502。 12. 写下排障过程。 你最终要能输出一份 README: ```text 部署环境 部署步骤 常用命令 日志位置 常见故障 排查流程 ``` 这份 README 就是你从“看过 Linux”变成“用过 Linux 做工程”的证明。 --- ## 41. 最后总结 你在这条路线里学 Linux,核心不是命令数量,而是工程闭环: ```text 连接服务器 -> 上传项目 -> 配置目录和权限 -> 启动服务 -> 检查端口 -> 配置 Nginx -> 查看日志 -> 定位故障 -> 写成部署文档 ``` 只要你能把这套流程做熟,再接 Docker、Nginx、Python/FastAPI、射频测试数据平台,就会形成一条很清晰的能力线: > 我懂通信/射频业务,也能把测试数据平台部署到 Linux 服务器。 > 我也能排查服务运行中的常见问题。 这就是项目路线里 Linux 最应该学成的样子。 标签: none