新开一台 VPS,如何初始化环境

拿到一台新的云服务器,无论是公有云还是本地虚拟机、wsl,我都会做一套固定的初始化流程。这篇文章把步骤完整记录下来,顺便解释一些容易踩坑的地方。 一、创建用户 云厂商的默认账号不统一,阿里云通常是 root ,腾讯云有时是 ubuntu 。我的习惯是统一新建一个 work 用户来操作,不直接用 ro...
新开一台 VPS,如何初始化环境
新开一台 VPS,如何初始化环境

拿到一台新的云服务器,无论是公有云还是本地虚拟机、wsl,我都会做一套固定的初始化流程。这篇文章把步骤完整记录下来,顺便解释一些容易踩坑的地方。


一、创建用户

云厂商的默认账号不统一,阿里云通常是 root,腾讯云有时是 ubuntu。我的习惯是统一新建一个 work 用户来操作,不直接用 root。

# 创建用户,-m 自动建 home 目录,-s 指定 bash
useradd -m -s /bin/bash work

:light_bulb: 也可以用 useradd -m -s /bin/bash work 一步到位,自动建 home 目录并设好 shell,不需要再手动改 /etc/passwd

二、赋予 sudo 权限

visudo  # 推荐用 visudo,保存时会自动检查语法

root 那行下面加上:

% work   ALL=(ALL) NOPASSWD: ALL

:warning: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

:warning: 只需要把 ** 公钥 **(id_rsa.pub)放到服务器,私钥(id_rsa)留在本地,不要复制到服务器上。

:light_bulb: 权限设置这两行不能省,chmod 700chmod 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 开头的历史命令里循环,不会跳到其他命令。用一段时间后你会发现少打了很多字。

inputrc-prefix-search-live

第一行 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

:light_bulb: 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

:light_bulb: 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

:light_bulb: Ubuntu 自带源的 Nginx 版本通常很旧(22.04 自带的还是 1.18),官方源始终跟着稳定版走。

:warning: 如果需要加载第三方模块(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;

:warning: 生产环境请设置足够复杂的密码,切勿使用 root123456 等弱密码。


十、安装 Redis

sudo apt install -y redis-server

redis-cli ping  # 返回 PONG 表示正常

:warning: 生产环境,对于mysql,redis这种服务,应该直接购买云厂商现成服务,有的甚至需要冗余、集群服务,我这里只需测试安装演示


以上就是我每次新开VPS后,从用户权限到服务安装,做完之后,这台机器基本就可以直接投入使用了。

1 个帖子 - 1 位参与者

阅读完整话题

来源: linux.do查看原文