VPS 初始化实战:新云服务器到手后的配置清单

Ubuntu VPS 初始化清单:按顺序验证 sudo 用户、SSH 公钥与禁用密码登录,保留原终端演示,按需安装运行时及服务,并说明版本、权限和上线验收边界。

新买一台云服务器或 VPS 后,我不会急着部署业务,而是先完成一套固定的 Ubuntu 初始化配置。这份清单适合准备部署网站、API、Node/Nuxt 项目或轻量 AI 工具服务的人,重点放在 SSH 公钥、sudo 用户、终端环境和常用服务这些真正容易踩坑的地方。

VPS 初始化配置清单:SSH、Nginx、Node.js 和常用服务
先把机器打磨到“可上线、可维护、可复盘”的状态,再开始部署业务。

一、创建用户

以下以受支持的 Ubuntu LTS、systemd、Bash 为范围。先保留云厂商控制台与现有管理员会话。前 3 步在有 sudo 权限的初始账号执行;若直接以 root 登录且没有 sudo 命令,可去掉命令前的 sudo。不要先关闭原入口。

sudo adduser --gecos "" work

按提示为 work 设置本地密码;该密码用于后续 sudo,即使稍后禁用 SSH 密码登录也仍有用途。账号已存在时先核对身份,不要重复创建。

二、赋予 sudo 权限

sudo usermod -aG sudo work
id work
sudo visudo -c

Ubuntu 默认 sudo 组规则允许成员输入自己的密码执行管理命令;新组身份在新登录会话生效。这里不添加 NOPASSWD: ALL,也不把 %work(组规则)误写成 work 用户规则。后面必须在 work 的新会话验证 sudo -v。

三、配置 SSH 公钥登录

sudo install -d -o work -g work -m 700 /home/work/.ssh
sudo touch /home/work/.ssh/authorized_keys
sudoedit /home/work/.ssh/authorized_keys
sudo chown work:work /home/work/.ssh/authorized_keys
sudo chmod 600 /home/work/.ssh/authorized_keys

用 sudoedit 添加本地公钥文件(例如 id_ed25519.pub)的完整一行,保留已有合法公钥;私钥留在本地。700/600 是推荐权限,属主、上级目录可写权限、sshd 策略也会影响登录。

在本地另一终端执行(替换 SERVER_IP),确认只用公钥也能登录:

ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no work@SERVER_IP

进入新会话后验证身份与 sudo;成功后才继续:

whoami
sudo -v

验证后再禁用 SSH 密码与 root 登录

在 work 会话中编辑下面的配置片段。先确认主配置包含 sshd_config.d;Ubuntu 通常按文件名顺序读取,并对大多数项采用最先取得的值。云初始化文件和 Match 条件可能影响最终结果。

sudoedit /etc/ssh/sshd_config.d/00-local-access.conf
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
sudo sshd -t
sudo sshd -T | grep -E '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '

语法检查必须成功,应确认 PubkeyAuthentication 为 yes,PasswordAuthentication、KbdInteractiveAuthentication、PermitRootLogin 为 no;存在 Match 时还要用 sshd -T -C 指定真实用户与客户端地址检查。确认后重载,再从第三个终端测试公钥登录与 sudo;确认成功前保留原会话和云控制台。

sudo systemctl reload ssh

四、安装必要软件包

先检查更新和重启要求,安排维护窗口后再升级。运行时和数据库按项目需要选择安装。

sudo apt update
apt list --upgradable
sudo apt upgrade
sudo apt install -y ca-certificates curl git jq less vim unzip lsof rsync build-essential
test ! -f /var/run/reboot-required || cat /var/run/reboot-required

重启前确认 SSH 新入口、云控制台和 sudo 已验证;不要为了清单完整而安装暂时用不到的库或服务。

五、初始化终端环境

以下截图与 GIF 保留原作者的历史终端操作,展示的是 Readline 前缀搜索,不是本次完整安装验证。本次修订后的账户、SSH 和安装建议以文字步骤为准。从这里开始使用已验证的 work 登录会话,避免把配置写进 root 的 home。

这一步很多人会跳过,但配置好之后每天都在省时间。核心是两个配置文件:.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
创建 ~/.inputrc 文件
写入配置内容
执行 bind -f ~/.inputrc 使配置生效

重点是中间这三行。默认情况下按 ↑ 是从最近一条历史往前翻。配置之后是:先输入前缀,再按 ↑,只在匹配前缀的历史里搜索。

比如输入 git,再按 ↑,只会在 git 开头的历史命令里循环,不会跳到其他命令。实际效果:

输入 git 后按 ↑,只在 git 命令中循环

第一行 match-hidden-files off 会让一般 Tab 补全不主动列出隐藏文件;明确输入点号前缀时仍可补全隐藏文件。

.bashrc:终端基础配置

历史记录增强

export HISTCONTROL=ignoredups        # 不记录连续重复的命令
export HISTTIMEFORMAT='%F %T '       # 历史命令显示时间戳

设置后,带有时间戳记录的历史项可显示时间;它不是可靠的审计日志,也无法为原本没有时间戳的旧历史补出真实执行时间。

高频 alias

alias la='ls -Aalth'      # 列全部文件,按时间排序,人类可读大小
alias tf='tail -f'        # 看实时日志:tf /var/log/nginx/access.log
alias wget='wget -c'      # 默认断点续传
alias grep='grep --color=auto'
alias vi='vim'
alias vih='sudo vim /etc/hosts'   # 快速编辑 hosts
alias rscp='rsync -v -P -e ssh'   # 带进度条的 scp

时间戳互转(对接接口、查日志时常用)

date -u -d '2024-06-01 12:00:00 UTC' +%s  # 1717243200(秒)
date -u -d @1717243200 '+%F %T %Z'        # 2024-06-01 12:00:00 UTC

提示符显示 Git 分支

Git 分支提示来自作者自定义 .bashrc 中的函数;上面的基础配置本身不会添加该功能。原配置的效果类似:

[work@hostname:/your/project] → main#

作者原始 .bashrc 参考在此。先备份自己的文件,再逐项合并需要的函数;不要直接覆盖、source 未读过的脚本或覆盖个人 .gitconfig:mini-linux-env

# 可选:仅下载并阅读原作者的配置
git clone https://gitee.com/tetang1230/mini-linux-env.git "$HOME/mini-linux-env-review"
less "$HOME/mini-linux-env-review/.bashrc"

六、安装 Go

先用 apt-cache policy 查看发行版提供的版本,并与项目 go.mod 的 go/toolchain 要求核对。若满足要求,可使用 Ubuntu 包管理安装:

apt-cache policy golang-go
sudo apt install -y golang-go
go version
go env GOPATH

若版本不满足项目要求,按 Go 官方安装说明选择对应 CPU 架构、受支持版本并核对发布的校验和;不要继续复制旧 go1.22.4 示例,也不要把新包直接覆盖进已有 Go 目录。这里不强制更改 GOPROXY;若使用第三方模块代理,单独确认其可用性和信任范围。

七、安装 Node.js 与 Yarn

先按项目 engines 与官方发布计划选择受支持版本;不要仅凭奇偶数断言生命周期。下面固定 Node.js 24 分支作为示例,不声称它永远是最新 LTS。NodeSource 是第三方安装源,下载脚本后先阅读,再决定是否以管理员权限执行。

curl -fsSL https://deb.nodesource.com/setup_24.x -o /tmp/toolskit-nodesource-setup.sh
less /tmp/toolskit-nodesource-setup.sh
sudo bash /tmp/toolskit-nodesource-setup.sh
sudo apt install -y nodejs
node --version
npm --version

核对 Node.js 发布计划与 NodeSource 支持说明。仅当项目使用 Yarn Classic 时,下面才是相应安装选项;现代 Yarn 应按项目 packageManager 字段与其文档安装。

npm install --global --prefix "$HOME/.local" yarn@1
export PATH="$HOME/.local/bin:$PATH"
yarn --version

需要持久化 PATH 时,将 export 这一行加入 work 用户自己的 ~/.bashrc。用户目录前缀避免普通用户对 /usr 下全局 npm 目录没有写权限的问题。

八、按需安装 Nginx

这里使用 Ubuntu 软件源,减少额外仓库与签名配置。发行版包版本号较旧不等于没有安全维护;是否需要 nginx.org 的新特性应另按支持周期和模块需求判断。

sudo apt install -y nginx
sudo nginx -t
sudo systemctl enable --now nginx
curl -I http://127.0.0.1

HTTP 本地响应只说明服务启动,不说明公网 DNS、TLS、防火墙或反向代理已经配置好。修改站点后先 nginx -t 成功,再 reload。

九、按需安装 MySQL

先确认 Ubuntu 源提供的版本满足项目要求。Ubuntu 包通常允许本机管理员通过 socket 认证进入 root 账户,不需要读取旧维护账号文件,也不需要强制切换 mysql_native_password。

apt-cache policy mysql-server
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
sudo mysql -u root

进入 MySQL 后检查版本与认证插件:

SELECT VERSION();
SELECT user, host, plugin FROM mysql.user;
EXIT;

业务使用独立数据库与最小权限账号,按应用连接方式配置认证;不要把 root 账号交给应用。安装成功不代表备份、恢复、访问控制已经完成。

十、按需安装 Redis

sudo apt install -y redis-server
sudo systemctl enable --now redis-server
redis-cli -h 127.0.0.1 ping
sudo ss -lntp

PONG 仅证明当前本地连接可用。核对监听地址、protected-mode 与应用 ACL,不把 6379 或 MySQL 3306 直接开放给公网;如确需跨主机连接,另行设计网络与认证策略。

上线前还需要验证

这份清单提供初始化步骤,不等于已经具备生产可用性。确认云安全组和主机防火墙仅开放必要端口、SSH 新会话可靠,再按业务补齐 HTTPS、应用权限、备份恢复、监控告警和维护策略。本次修订只核对文档、代码顺序与语法,没有登录新服务器完成全流程重演。

2026-09-29 核对:Ubuntu OpenSSH 配置、Ubuntu MySQL 安装与认证。其他运行时的版本与平台支持在安装当天按所链接官方资料复核。

常见问题

新买 VPS 或云服务器后,第一步应该做什么?

先确认登录方式并创建日常操作用户,再配置 sudo 和 SSH 公钥登录。把权限和入口稳定下来后,再安装运行时和业务服务。

SSH 公钥登录为什么总是失败?

最常见原因是 .ssh 目录和 authorized_keys 权限不对。通常目录用 700,authorized_keys 用 600,并确保属主是实际登录用户。

VPS 初始化时一定要安装 Nginx、Node.js、MySQL 和 Redis 吗?

不一定。本文是面向网站、API、Nuxt/Node 项目和轻量服务的常用基线。如果只是静态站或临时测试机,可以按需删减。