前端做到一定阶段,总有那么一天,项目要上线,运维排不开,一台空的 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 包内容