前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版

Linux与Docker系统运维总结 从命令排查到上线部署

首页2022-06-30 15:32:41Back-End
LinuxDocker运维

前端做到一定阶段,总有那么一天,项目要上线,运维排不开,一台空的 CentOS 和一串 root 密码直接甩到你手上。ssh 上去之后才发现,装 Node、配 Nginx、开端口、看进程、翻日志,每一步都得自己来。我这几年陆陆续续把踩过的命令和部署流程记在一个文件里,越攒越多,干脆整理成这篇。

这篇不按「命令字母顺序」排,而是按「什么场景下你会用到这组命令」排。从最基础的文件权限,到 Nginx 反向代理和负载均衡,再到 Docker 的镜像容器网络,你可以当手册翻,出问题的时候直接跳到对应那节。

在本篇文章中,我们将从浅入深,和大家一起学习以下知识:

  • Linux 的定位,以及为什么服务器基本都是 CentOS 和 Ubuntu
  • 文件、目录、权限这组命令,以及 rwx 和 755 到底在说什么
  • 软件安装的三条路,rpm、yum 和源码编译分别什么时候用
  • 服务器变慢或者端口不通时,top、ps、netstat、df 的排查顺序
  • systemctl 管服务,firewalld 和 SELinux 管端口
  • ssh 别名、免密登录和连接保活,把每天的登录成本降下来
  • 环境变量、printenv 与前端最常用的 NODE_ENV 写法
  • 用 rsync 替代 cp,本地和远程都能用
  • MongoDB、MySQL、Redis 的裸机安装与远程连接配置
  • Nginx + Node 的反向代理、多站点、负载均衡与 HTTPS 配置
  • Docker 的镜像、容器、仓库三个核心概念
  • 用 Docker 跑 Node、Nginx、MySQL、Redis、MongoDB
  • Dockerfile 指令详解与自动部署 Node 程序
  • Docker 的四种网络模式与容器互通

# 一、先把 Linux 这套东西的定位说清楚

很多前端第一次登服务器会有点懵,因为平时用的是 macOS 或者 Windows,图形界面点两下就完事。到了服务器上,只剩一个黑框和一个闪烁的光标。

Linux 是一套开源操作系统,它有稳定、消耗资源小、功能很强、安全性高等特点,让它在服务器领域有庞大的用户群体。它跑起来不需要占用几个 G 内存去画界面,同样一台 2 核 4G 的机器,装 Windows Server 可能开机就吃掉一半资源,装 CentOS 剩下的几乎全能给你的应用用。这是它在服务器上统治多年的直接原因。

目前市面上较知名的发行版有 RedHat、Ubuntu、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。发行版之间的差异主要在包管理器和默认软件版本上,内核是同一套。

常见的服务器操作系统主要有 CentOS、Ubuntu、Debian,本文写作时 CentOS 市场占有率第一。这里要补一句,CentOS 8 已于 2021 年底停止维护,CentOS 7 也在 2024 年 6 月结束生命周期,官方推荐的迁移路径是 CentOS Stream、Rocky Linux 或 AlmaLinux。本文所有命令写的是 CentOS 7 那一套(yum、firewalld、systemctl),迁移到 Rocky Linux 之后 yum 会变成 dnf,其余用法基本不变,yum 也仍然被保留为软链接。

顺着上面聊,Ubuntu 那条线用的是 apt 系列,命令名不同但思路完全一样,看懂一边基本能推另一边。

# 二、文件、目录与权限,登上服务器最先用到的一组命令

刚 ssh 上一台陌生的服务器,你要做的第一件事其实是搞清楚自己在哪、有什么、能动什么。这一节的命令使用频率最高,闭着眼睛也得能敲出来。

# 2.1 上机第一分钟要敲的几条命令

先看方向感这几条。pwd 告诉你人在哪个目录,ls 告诉你这个目录里有什么,cd 负责走位。

init 0        # 关机
init 6        # 重启

ls            # 列出当前目录下的文件
ls -l         # 长格式,带权限、属主、大小、时间
ll            # 大多数发行版给 ls -l 配的别名

cd /root      # 切换目录
pwd           # 查看当前路径
@前端进阶之旅: 代码已经复制到剪贴板

还有两个快捷键得先记住,不然容易卡住。ctrl + c 中断当前程序,ctrl + l(等价于 clear)清屏。很多人第一次跑 ping 或者 tail -f 之后不知道怎么退出,就是不知道有 ctrl + c。

ifconfig            # 查看网卡信息(Linux)
ipconfig            # Windows 下的对应命令

ping 127.0.0.1      # 看网络是否通畅
@前端进阶之旅: 代码已经复制到剪贴板

这里有个坑要注意。ifconfig 属于 net-tools 包,很多精简版镜像默认不装,敲下去会提示 command not found,要么 yum install -y net-tools 补上,要么直接用现在更推荐的 ip addr,后者是 iproute2 提供的,基本所有发行版都自带。ipconfig 是 Windows 的命令,Linux 上没有,别记混了。

至于 ping 127.0.0.1,它 ping 的是本机回环地址,通只能说明本机 TCP/IP 协议栈没坏,不代表能上外网。想验证外网,ping 一个公网地址更实在。

# 2.2 创建用户与修改密码

生产机上不建议什么都用 root 跑。给应用单独开一个用户,权限出问题时炸不到整台机器。

useradd zhangsan        # 添加用户
passwd zhangsan         # 设置密码,回车后交互式输入两次
userdel -rf zhangsan    # 删除用户
@前端进阶之旅: 代码已经复制到剪贴板

userdel 的两个参数分别是,-r 递归删除该用户目录下面的文件以及子目录下的文件,-f 强制删除。不加 -r 的话用户没了但 /home/zhangsan 还留着,久了机器上全是孤儿目录。

# 2.3 文件管理

日常改配置、看日志,来回就是这几条。

touch file            # 创建文件
rm -rf file           # 删除文件
mv file1 file11       # 修改文件名
cat file1             # 查看文件内容
cp file2 file22       # 复制文件
mv file1 file11       # 移动文件(同一条命令,改名和移动是一回事)
vi file1              # 编辑文件
@前端进阶之旅: 代码已经复制到剪贴板

rm 的两个参数要单独说一下,-r 是递归删除目录下面文件以及子目录下文件,-f 是强制删除,忽略不存在的文件,从不给出提示。

rm -rf 在服务器上是真能删掉你整个职业生涯的命令,敲之前先 pwd 一下确认路径,别在 / 下面手滑。

批量创建和删除用花括号展开,测试环境造数据很方便。

touch file{1..10}       # 一次创建 file1 到 file10
rm -rf file{1..10}      # 一次删掉
@前端进阶之旅: 代码已经复制到剪贴板

日志文件动辄几百兆,cat 整个刷屏没意义,只看头尾就行。

cat file1 | head -3     # 查看文件前 3 行
cat file1 | tail -3     # 查看文件后 3 行
@前端进阶之旅: 代码已经复制到剪贴板

补一句实战用法,排查线上问题时最常用的其实是 tail -f 日志文件,它会挂在那里持续输出新增内容,你在浏览器点一下,日志立刻滚出来,比反复 cat 高效得多。

# 2.4 在服务器上找文件和找内容

这是两件事,很多人会搞混。找文件名用 find,找文件里的内容用 grep。

find / -name httpd.conf     # 从根目录开始,查找文件名为 httpd.conf 的文件
find 目录 -name 文件名        # 通用格式
@前端进阶之旅: 代码已经复制到剪贴板

find / 会扫全盘,机器上文件多的时候要等一会儿,能缩小范围就缩小,比如 find /etc -name '*.conf'。

找内容这块,典型场景是「我知道 httpd.conf 里有个 listen 配置,但不知道在第几行」。

cat httpd.conf | grep listen           # 找出含 listen 的行
cat httpd.conf | grep -i listen        # 忽略大小写
@前端进阶之旅: 代码已经复制到剪贴板

原文这里写过 grep -ignore listen 这种形式,实测在 GNU grep 上会报 invalid option,正确的长选项是 --ignore-case,短选项就是 -i。另外 cat 文件 | grep 关键字 多起了一个进程,直接 grep -i listen httpd.conf 效果一样且更省。

如果已经在 vi 里面了,就用 vi 自带的搜索。

vi httpd.conf
# 然后输入 /Listen 回车,跳到第一处匹配
# 按 n 跳下一个,按 N 跳上一个
@前端进阶之旅: 代码已经复制到剪贴板

n 和 N 的方向别记反了,小写往下,大写往上。

# 2.5 目录管理

mkdir dir1 dir2 dir3        # 一次创建多个目录
rm -rf dir1 dir2            # 删除目录
rm -rf dir*                 # 删除所有以 dir 开头的文件和目录
mv dir1 dir11               # 重命名目录或移动目录
ls                          # 查看目录
ll                          # 长格式查看
@前端进阶之旅: 代码已经复制到剪贴板

rm -rf 的 -r 依然是递归删除目录下面文件以及子目录下文件,-f 依然是强制删除,忽略不存在的文件,从不给出提示。带通配符的那条尤其危险,rm -rf dir * 中间多打一个空格,就变成删掉当前目录下所有东西了。

部署时经常要一次性建出好几层目录,一个个 mkdir 太慢。

mkdir -p a/b/c/d/e/f/g      # 递归创建多层级目录,中间不存在的自动补
tree a                      # 递归查看目录结构
yum install tree -y         # tree 命令不存在的话需要先装
cp -rf wwwroot/ mywwwroot/  # 复制目录
@前端进阶之旅: 代码已经复制到剪贴板

mkdir -p 还有个附带好处,目录已存在时它不会报错,写在部署脚本里很省心。

# 2.6 打包压缩,zip、tar.gz、tar 和 xz

前端把 dist 传到服务器、或者从服务器上把日志拉回来分析,第一步都是打包。这几种格式在 Linux 上的地位不一样,用错场合会很难受。

zip 的好处是 Windows 那边双击就能开,跨系统传文件优先选它。

yum install -y unzip zip        # 安装 zip 解压软件

zip -r public.zip public        # -r 递归,把指定目录下的所有子目录以及文件一起处理
unzip public.zip                # 解压到当前目录
unzip public.zip -d dir         # 解压到指定目录 dir
unzip -l public.zip             # 只看包里有什么,不解压
@前端进阶之旅: 代码已经复制到剪贴板

unzip -l 这个习惯值得养成。拿到一个来路不明的压缩包,先列一下内容再解,免得它没有顶层目录,一解压把当前目录糊得到处都是文件。

gz 这条线是 Linux 上的默认选择,源代码分发基本都是 .tar.gz。这里要先分清 tar 和 gz 是两件事。Linux 下最常用的打包程序就是 tar 了,使用 tar 程序打出来的包我们常称为 tar 包,tar 包文件的命名通常都是以 .tar 结尾的。生成 tar 包后,就可以用其它的程序来进行压缩,所以先讲 tar 命令的基本用法。

tar czvf public.tar.gz public   # 制作 gz 包
tar xzvf public.tar.gz          # 解压 gz 包
tar tf public.tar.gz            # 查看 gz 包内容
@前端进阶之旅: 代码已经复制到剪贴板
fe
  • 一、先把 Linux 这套东西的定位说清楚
  • 二、文件、目录与权限,登上服务器最先用到的一组命令
    • 2.1 上机第一分钟要敲的几条命令
    • 2.2 创建用户与修改密码
    • 2.3 文件管理
    • 2.4 在服务器上找文件和找内容
    • 2.5 目录管理
    • 2.6 打包压缩,zip、tar.gz、tar 和 xz
    • 2.7 alias 别名管理
    • 2.8 用户与用户组
    • 2.9 权限管理,rwx 与 755 到底在说什么
  • 三、软件安装的三条路,rpm、yum 与源码编译
    • 3.1 rpm 安装、卸载与查找
    • 3.2 yum 安装、卸载与查询
    • 3.3 用 yum 装 Nginx
    • 3.4 源码编译安装
  • 四、服务器变慢或者端口不通时的排查顺序
    • 4.1 top,一屏看完整机状态
    • 4.2 谁登录过这台机器
    • 4.3 查看进程
    • 4.4 关闭进程
    • 4.5 查看端口
    • 4.6 查看硬盘
  • 五、服务与端口,systemctl 管进程,firewalld 管出入口
    • 5.1 systemctl 管理服务
    • 5.2 firewalld 防火墙
    • 5.3 SELinux
  • 六、把每天的登录成本降下来,ssh 别名、免密与保活
    • 6.1 登录服务器,ssh
    • 6.2 配置别名快速登录,ssh-config
    • 6.3 免密登录,public-key 与 ssh-copy-id
    • 6.4 保持连接,防止断掉
  • 七、环境变量,从 printenv 到前端最常用的 NODE_ENV
  • 八、用 rsync 替代 cp
  • 九、数据库与中间件的裸机安装
    • 9.1 MongoDB 4.x 的安装配置
      • 远程连接 mongodb
      • MongoDB 4.x 卸载
    • 9.2 MySQL 安装配置
      • 改密码这一步最容易卡住
      • 远程管理 mysql
    • 9.3 安装 Redis
  • 十、Nginx + Node 部署,一台机器撑起多个站点
    • 10.1 搭建 Node.js 生产环境
    • 10.2 用 pm2 管理 Node 进程
    • 10.3 安装 Nginx
    • 10.4 配置反向代理
    • 10.5 相关防火墙配置
    • 10.6 多台服务器负载均衡
      • 负载均衡操作演示
    • 10.7 云服务器部署 Node 项目的完整流程
    • 10.8 nginx 配置 https
  • 十一、Docker 入门,先把它和虚拟机分清楚
    • 11.1 为什么要使用 Docker
    • 11.2 Mac 上搭建本地 Docker 环境
    • 11.3 docker 命令基础
    • 11.4 在 Linux 中安装 docker
    • 11.5 安装指定版本的 docker
    • 11.6 卸载 docker
    • 11.7 阿里云 Docker 镜像加速器
  • 十二、镜像、容器、仓库,Docker 的三个核心概念
    • 12.1 镜像
    • 12.2 容器
    • 12.3 仓库
    • 12.4 镜像相关命令
    • 12.5 容器相关命令
  • 十三、用 Docker 跑起常用服务
    • 13.1 安装 node
    • 13.2 安装 Nginx
    • 13.3 安装 mysql
    • 13.4 安装 redis
    • 13.5 安装 MongoDB
  • 十四、Dockerfile,把部署过程写成文件
    • 14.1 用 Dockerfile 构建一个 nginx 镜像
    • 14.2 Dockerfile 指令详解
    • 14.3 用 Dockerfile 构建 CentOS 并安装 net-tools
    • 14.4 用 Dockerfile 自动部署 Node.js 程序
  • 十五、Docker 网络,容器之间怎么通信
    • 15.1 docker network 命令
    • 15.2 Docker 网络的四种模式
    • 15.3 容器网络连接实操
  • 总结
  • 参考

← GraphQL+Koa2 搭建服务端 API 并用 Apollo 对接 Vue云开发CloudBase实践总结从CLI到Framework一键部署 →