拿到一台新的云服务器,无论是公有云还是本地虚拟机、wsl,我都会做一套固定的初始化流程。这篇文章把步骤完整记录下来,顺便解释一些容易踩坑的地方。
一、创建用户
云厂商的默认账号不统一,阿里云通常是 root,腾讯云有时是 ubuntu。我的习惯是统一新建一个 work 用户来操作,不直接用 root。
# 创建用户,-m 自动建 home 目录,-s 指定 bash
useradd -m -s /bin/bash work
也可以用
useradd -m -s /bin/bash work一步到位,自动建 home 目录并设好 shell,不需要再手动改/etc/passwd。
二、赋予 sudo 权限
visudo # 推荐用 visudo,保存时会自动检查语法
在 root 那行下面加上:
% work ALL=(ALL) NOPASSWD: ALL
用
visudo而不是直接vim /etc/sudoers,写错语法会导致 sudo 整个失效,很麻烦。
三、配置 SSH 公钥登录
mkdir -p /home/work/.ssh
vim /home/work/.ssh/authorized_keys
# 把本地~/.ssh/id_rsa.pub 的内容粘贴进去
# 权限必须设对,否则 sshd 会拒绝
chown -R work:work /home/work/.ssh
chmod 700 /home/work/.ssh
chmod 600 /home/work/.ssh/authorized_keys
只需要把 ** 公钥 **(
id_rsa.pub)放到服务器,私钥(id_rsa)留在本地,不要复制到服务器上。
权限设置这两行不能省,
chmod 700和chmod 600如果缺失,sshd 会直接拒绝公钥登录,是新手最容易踩的坑。
四、初始化终端环境
这一步很多人会跳过,但配置好之后每天都在省时间。核心是两个配置文件:.bashrc 和 .inputrc。
.inputrc —— 让方向键有 “记忆”
创建 ~/.inputrc,写入以下内容:
set match-hidden-files off
"\ep": history-search-backward
"\e [A": history-search-backward
"\e [B": history-search-forward
立即生效:
bind -f ~/.inputrc
** 重点是中间这三行 **。默认情况下按 ↑ 是从最近一条历史往前翻。配置之后的效果是:
先输入命令的前缀,再按
↑,只在匹配前缀的历史里搜索。
比如输入 git,再按 ↑,只会在 git 开头的历史命令里循环,不会跳到其他命令。用一段时间后你会发现少打了很多字。

第一行 match-hidden-files off 是让 Tab 补全时不显示隐藏文件(.git、.env 之类),补全列表更干净。
.bashrc —— 终端基础配置
.bashrc 的内容比较长,挑几个最实用的说:
** 历史记录增强 **
export HISTCONTROL=ignoredups # 不记录连续重复的命令
export HISTTIMEFORMAT='% F % T ' # 历史命令显示时间戳
执行 history 时会看到每条命令的执行时间,排查问题时很有用。
** 高频 alias**
alias la='ls -Aalth' # 列全部文件,按时间排序,人类可读大小
alias tf='tail -f' # 看实时日志:tf /var/log/nginx/access.log
alias wget='wget -c' # 默认断点续传
alias grep='grep --color=always'
alias vi='vim'
alias vih='sudo vim /etc/hosts' # 快速编辑 hosts
alias rscp='rsync -v -P -e ssh' # 带进度条的 scp
** 时间戳互转 **(对接接口、查日志时常用)
# 日期转uninx时间戳毫秒
function _dt2um() {
local args=$*
if [[ "Darwin" == $os ]] || [[ "FreeBSD" == $os ]]
then
um=`date -j -f "%Y-%m-%d %H:%M:%S" "$args" "+%s"`
else
um=`date +%s -d "$args"`
fi
um=$((um * 1000))
echo $um
}
alias dt2um=_dt2um
# uninx时间戳毫秒转日期
function _um2dt() {
local um=$1
um=$((um / 1000))
if [[ "Darwin" == $os ]] || [[ "FreeBSD" == $os ]]
then
echo `date -r "$um" +"%Y-%m-%d %H:%M:%S"`
else
echo `date -d @"$um" +"%Y-%m-%d %H:%M:%S"`
fi
}
alias um2dt=_um2dt
dt2um "2024-06-01 12:00:00" # → 1717214400000
um2dt 1717214400000 # → 2024-06-01 12:00:00
** 提示符显示 Git 分支 **
## Parses out the branch name from .git/HEAD:
find_git_branch () {
local dir=. head
until [ "$dir" -ef / ]; do
if [ -f "$dir/.git/HEAD" ]; then
head=$(< "$dir/.git/HEAD")
if [[ $head = ref:\ refs/heads/* ]]; then
git_branch=" → ${head#*/*/}"
elif [[ $head != '' ]]; then
git_branch=" → (detached)"
else
git_branch=" → (unknow)"
fi
return
fi
dir="../$dir"
done
git_branch=''
}
PROMPT_COMMAND="find_git_branch; $PROMPT_COMMAND"
配置之后,进入 git 仓库时提示符会自动显示当前分支名,效果类似:
[work@hostname:/your/project] → main#
``
---
## 五、安装必要软件包
```bash
sudo apt update && sudo apt upgrade -y
# 编译工具链
sudo apt install -y build-essential
# 常用库(编译 nginx 等会用到)
sudo apt install -y libpcre3-dev libssl-dev zlib1g-dev libxslt1-dev
# 运维日常工具
sudo apt install -y git curl wget jq htop tree unzip net-tools lsof rsync silversearcher-ag ctags
![]()
build-essential已包含 gcc、g++、make 等,比单独安装更规范,后续编译其他软件也会用到。
六、安装 Go
前往 golang官网 查看当前稳定版本号,替换下面的版本字符串。
# 下载并解压到 /work/service
sudo mkdir -p /work/service/work/go
wget golang官网/dl/go1.22.4.linux-amd64.tar.gz
sudo tar -C /work/service -xzf go1.22.4.linux-amd64.tar.gz
sudo chown -R work:work /work/go
rm go1.22.4.linux-amd64.tar.gz
在 ~/.bashrc 末尾添加环境变量:
export GOPROXY=选择一个稳定的代理地址
export PATH=$PATH:/work/service/go/bin
export GOPATH=/work/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
source ~/.bashrc
go version # 验证
七、安装 Node.js 与 Yarn
安装前先去 nodejs官网 确认当前 Active LTS 的版本号,再替换脚本里的数字。Node.js 只有偶数版本才会进入长期支持(LTS),生产环境不要装奇数版。
截至本文写作时,当前 LTS 是 Node.js 24。
curl -fsSL NODEJS官网/setup_24.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v && npm -v # 验证
npm install -g yarn
Node.js 只有偶数版本才会进入 LTS(长期支持),奇数版本生命周期很短,生产环境只装偶数版。
八、安装 Nginx
Ubuntu 自带源的 Nginx 版本通常很旧,推荐加官方源安装,后续 apt upgrade 可以自动跟进新版本。
# 导入签名密钥
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl nginx官网/keys/nginx_signing.key \
| gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
# 添加官方稳定版源
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
nginx官网/packages/ubuntu $(lsb_release -cs) nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
# 设置优先级,防止被系统源覆盖
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
sudo apt update
sudo apt install -y nginx
nginx -v
sudo systemctl enable nginx && sudo systemctl start nginx
Ubuntu 自带源的 Nginx 版本通常很旧(22.04 自带的还是 1.18),官方源始终跟着稳定版走。
如果需要加载第三方模块(Lua、Brotli 等),再考虑源码编译,否则 apt 安装完全够用。
九、安装 MySQL 8
sudo apt install -y mysql-server
# 查看初始维护账号密码
sudo cat /etc/mysql/debian.cnf
# 用上面的账号登录,修改 root 密码
mysql -u debian-sys-maint -p
登录后执行:
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ' 你的密码 ';
FLUSH PRIVILEGES;
生产环境请设置足够复杂的密码,切勿使用
root、123456等弱密码。
十、安装 Redis
sudo apt install -y redis-server
redis-cli ping # 返回 PONG 表示正常
生产环境,对于mysql,redis这种服务,应该直接购买云厂商现成服务,有的甚至需要冗余、集群服务,我这里只需测试安装演示
以上就是我每次新开VPS后,从用户权限到服务安装,做完之后,这台机器基本就可以直接投入使用了。
1 个帖子 - 1 位参与者