说真的,刚拿到一台云服务器的时候,那种既兴奋又有点小紧张的感觉,我相信你懂。尤其是当你在终端里看到满屏红色的报错信息,或者 ssh 连接突然中断的时候,心里肯定在想:“是不是把服务器搞坏了?”
别慌。
我见过太多新手——包括当年的我自己——在面对空荡荡的 Linux 终端时手足无措。AlmaLinux 作为一个由社区驱动的、1:1 二进制兼容 Red Hat Enterprise Linux (RHEL) 的系统,是企业级稳定性的绝佳选择,但它的默认配置确实有点“高冷”。今天,我就带你走一遍从“连都连不上”到“完美运行”的全过程。我们不讲枯燥的教科书理论,只讲那些在实际部署中真正会踩坑、以及怎么绕过去的真实经验。
第一步:别急着登录,先搞定“钥匙”
很多人第一步就卡住了:买了服务器,拿到了 IP 地址和密码,满心欢喜地输入 ssh root@1.2.3.4,结果提示 Permission denied 或者干脆连不上。
这里有个关键知识点:在现代云环境中,密码登录其实是最不安全、也最容易失败的方式。 绝大多数云厂商(比如阿里云、腾讯云、AWS、DigitalOcean)默认都推荐甚至强制使用 SSH 密钥对登录。
为什么你会“报错”?
如果你尝试用密码登录失败了,通常有以下几个原因:
- 密码根本没生效:云厂商重置密码后,有时需要重启实例才能生效,或者你输入的密码里包含了特殊字符,在终端里被转义了。
- SSH 服务没启动:虽然少见,但有的基础镜像默认关闭了 SSH 监听。
- 安全组/防火墙拦截:这是最常见的!你以为你连不上是密码错,其实是云平台的防火墙把你堵在门口了。
正确的开场姿势:生成 SSH 密钥
如果你还没有密钥,现在就开始生成。在你的本地电脑(Mac 或 Linux)上打开终端:
ssh-keygen -t ed25519 -C "your_email@example.com"
- 为什么用
ed25519? 它比传统的 RSA 密钥更安全、速度更快,而且密钥更短。这是目前最推荐的算法。 - 回车三次:一路回车,不用设密码(如果你想每次登录都输密码才安全,那就设一个,但开发机通常为了方便不设)。
生成完后,你会得到两个文件:~/.ssh/id_ed25519(私钥,千万别给别人看)和 ~/.ssh/id_ed25519.pub(公钥,这是你要贴在服务器上的)。
把公钥内容复制出来:
cat ~/.ssh/id_ed25519.pub
然后去你的云服务商控制台,找到“SSH 密钥管理”或“实例重置密钥”,把这一长串字符串粘贴进去,并绑定到你的 AlmaLinux 实例上。
小技巧:如果云厂商不支持直接导入密钥,你可以手动登录(用控制台提供的 VNC 远程连接,像坐在服务器前面一样),然后执行:
mkdir -p ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~/.ssh
这一步做对了,后面 90% 的登录问题都解决了。
第二步:首次登录与“系统更新仪式”
好了,现在你可以登录了:
ssh root@你的服务器IP
第一次登录会提示 Are you sure you want to continue connecting?,输入 yes 并回车。这是正常的 SSH 指纹验证。
登录后,第一件事绝对不是装软件,而是:
dnf update -y
AlmaLinux 使用的是 dnf 包管理器(它是 yum 的现代升级版)。这条命令会检查所有已安装的软件包,并将它们更新到最新版本。
为什么要这么做?
因为云厂商提供的镜像为了加快启动速度,往往用的是一些旧版本的软件。而且,安全补丁是最重要的。在阿里云或腾讯云的后台,我见过太多因为系统内核漏洞被黑客利用的案例,而一次简单的 dnf update 就能避免绝大多数基础风险。
更新过程中,你可能会看到一些依赖关系的提示,直接按 y 确认即可。如果更新后提示需要重启(Reboot Required),那就执行 reboot,等几分钟后再连。
第三步:配置防火墙——把门焊死
Linux 默认有个防火墙叫 firewalld。在 AlmaLinux 上,它通常默认是开启的,但规则可能比较宽松。
我们先看看当前状态:
firewall-cmd --state
firewall-cmd --list-all
你会看到类似这样的输出:
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
forward: no
masquerade: no
...
注意看 services 下面,通常只有 ssh 和 dhcpv6-client。这意味着:除了 SSH 端口(22),其他所有端口都是关闭的。
这听起来很安全,对吧?但问题来了——如果你要运行 Web 服务(80/443)、数据库(3306/5432)、或者你自建的 API 服务(比如 8080),你现在的连接会直接被打回。
开放必要端口
假设你要运行一个 Nginx 网站,你需要开放 HTTP (80) 和 HTTPS (443):
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
--permanent 表示这些规则在重启后依然有效,--reload 是让配置立即生效而不重启服务。
如果你想开放一个自定义端口,比如你的应用跑在 3000 端口:
firewall-cmd --permanent --add-port=3000/tcp
firewall-cmd --reload
常见错误提示:如果你之前没开放端口,直接访问网站会显示“连接被拒绝”或“超时”。这时候别急着查代码,先检查防火墙!
进阶:限制 SSH 访问(可选但推荐)
SSH 是黑客首选的突破点。如果你知道自己家的 IP 是固定的(比如家里的宽带公网 IP,或者你公司的固定出口 IP),你可以限制只有这个 IP 才能通过 SSH 登录:
# 假设你的家 IP 是 123.45.67.89
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='123.45.67.89' service name='ssh' accept"
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
这样,除了你的家 IP,其他人连 22 端口都会被直接丢弃。注意,这条命令执行后,你当前的 SSH 会话不会断,但新的连接如果不是来自 123.45.67.89,就会被拒之门外。所以,请确保你在实施前已经通过密钥验证成功过,并且保留了一个备用登录方式(比如云厂商的 VNC 控制台)。
第四步:创建普通用户——别老用 root
我知道 root 用户 powers 很强,但“永远不要直接用 root 登录服务器”是 Linux 安全的第一条戒律。
一旦 root 账号被爆破,整个服务器就沦陷了。而使用普通用户配合 sudo,即使密码泄露,攻击者也还需要二次验证才能提权。
创建用户
adduser your_username
passwd your_username
设置一个强密码。然后,把这个用户加入 wheel 组,这是 AlmaLinux/RHEL 系统中拥有 sudo 权限的默认组:
usermod -aG wheel your_username
配置 SSH 密钥登录给新用户
为了安全,我们不让新用户用密码登录,只用密钥。把你自己本地生成的公钥(id_ed25519.pub 的内容)添加到新用户的 authorized_keys 里:
mkdir -p /home/your_username/.ssh
echo "你的公钥内容" >> /home/your_username/.ssh/authorized_keys
chown -R your_username:your_username /home/your_username/.ssh
chmod 700 /home/your_username/.ssh
chmod 600 /home/your_username/.ssh/authorized_keys
测试一下:新开一个终端窗口,用新用户登录:
ssh your_username@你的服务器IP
如果能免密登录,并且执行 sudo ls /root 能列出 root 目录下的文件(虽然你可能看不到内容,但不会报权限错误),那就说明配置成功了。
禁用 root SSH 登录
既然我们有普通用户了,那就把 root 直接登录的路堵死。编辑 SSH 配置文件:
sudo vi /etc/ssh/sshd_config
找到这一行:
#PermitRootLogin prohibit-password
把它改成:
PermitRootLogin no
然后重启 SSH 服务:
sudo systemctl restart sshd
警告:修改完后,千万不要断开当前的 root 终端!先开一个新终端,用你的普通用户登录测试一下。如果新终端能连上,再关掉旧的 root 终端。万一搞砸了,你还得靠 VNC 控制台救场。
第五步:基础系统加固
除了防火墙和用户管理,还有几个简单的步骤能让你的服务器更健壮。
1. 启用 SELinux
AlmaLinux 默认开启了 SELinux(安全增强型 Linux),它是一种强制访问控制系统。很多人为了图省事把它关掉(setenforce 0),但这会让你的服务器暴露在某些高级攻击下。
检查状态:
sestatus
如果显示 Enforcing,那就保持现状。如果显示 Disabled 或 Permissive,建议改为 Enforcing:
sudo setenforce 1
sudo sed -i 's/^SELINUX=.*/SELINUX=enforcing/g' /etc/selinux/config
注意:SELinux 配置不当会导致某些应用无法启动(比如 Apache 无法写入特定目录)。如果遇到权限问题,先查 SELinux 日志:sudo audit2why < /var/log/audit/audit.log,它会告诉你为什么被拦。
2. 配置自动安全更新
手动检查更新太麻烦了,让系统自己来:
sudo dnf install -y dnf-automatic
sudo systemctl enable --now dnf-automatic.timer
这会创建一个定时任务,每天自动检查并安装安全更新。你可以在 /etc/dnf/automatic.conf 里配置是“只下载”还是“下载并安装”。对于生产服务器,建议设置为“下载并安装”关键安全补丁。
3. 安装 Fail2Ban——防止暴力破解
即使你禁用了 root 登录,攻击者还是会尝试爆破你的普通用户密码。Fail2Ban 会监控日志文件,发现多次失败登录后自动拉黑 IP。
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
sudo systemctl enable --now fail2ban
默认配置就够了。它会监控 SSH 服务。如果你想让它也监控 Nginx 或 Apache,可以在 /etc/fail2ban/jail.local 里添加对应配置。
第六步:部署你的第一个应用(以 Nginx + Node.js 为例)
现在系统干净、安全,我们来点实际的。假设你要部署一个 Node.js 后端应用,并用 Nginx 做反向代理。
1. 安装 Nginx
sudo dnf install -y nginx
sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
浏览器访问 http://你的IP,应该能看到 Nginx 的默认欢迎页面。这说明 Web 服务已经通了。
2. 安装 Node.js
AlmaLinux 默认的 Node.js 版本可能比较旧。我们用 NodeSource 的官方源来安装最新 LTS 版本:
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
sudo dnf install -y nodejs
验证安装:
node -v
npm -v
3. 部署你的应用
假设你把代码上传到了 /var/www/myapp:
cd /var/www
git clone https://github.com/yourrepo/myapp.git
cd myapp
npm install
4. 配置 Nginx 反向代理
编辑 Nginx 配置文件:
sudo vi /etc/nginx/conf.d/myapp.conf
填入以下内容(假设你的 Node.js 应用监听 3000 端口):
server {
listen 80;
server_name your_domain.com; # 或者用你的 IP
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
测试配置是否有语法错误:
sudo nginx -t
如果没有错误,重启 Nginx:
sudo systemctl restart nginx
5. 用 PM2 管理 Node.js 进程
不要让 Node.js 进程直接跑在终端里,一断开连接就挂了。用 PM2 作为进程管理器:
sudo npm install -g pm2
cd /var/www/myapp
pm2 start app.js --name myapp
pm2 save
pm2 startup
pm2 save 会保存当前进程列表,pm2 startup 会生成一段开机自启的命令,按提示执行即可。这样,即使服务器重启,你的应用也会自动启动。
第七步:监控与维护——别让服务器“裸奔”
部署完应用只是开始,长期的稳定运行需要监控。
1. 安装监控代理
云厂商通常提供自己的监控插件(如阿里云的云监控、腾讯云的主机监控)。建议安装官方 agent,这样你可以在控制台看到 CPU、内存、磁盘的实时曲线。
2. 简单的手动检查命令
养成每天看一眼的习惯:
# 查看系统负载,1分钟负载超过 CPU 核心数就要注意了
uptime
# 查看内存使用,重点关注 free -h 里的 available 列
free -h
# 查看磁盘空间,特别是有没有哪个分区满了
df -h
# 查看最近登录记录,有没有可疑 IP
last -n 10
3. 日志检查
当应用出错时,日志是第一位的:
# 查看 Nginx 错误日志
sudo tail -f /var/log/nginx/error.log
# 查看 PM2 日志
pm2 logs myapp
总结:从报错到安心的心路历程
回想一下,从最初连不上 SSH 的焦虑,到看到 Permission denied 的困惑,再到最终稳定运行的成就感激荡,这中间每一步都是学习的机会。
AlmaLinux 作为一个企业级系统,它的“难”其实是对安全的坚持。它不希望你偷懒,不希望你用 root 裸奔,不希望你忽视防火墙。当你理解了每一个命令背后的逻辑——为什么要有 wheel 组?为什么 SELinux 默认开启?为什么用密钥登录更安全?——你就从一个“会敲命令的用户”变成了一个“懂系统的管理者”。
接下来的路上,你可能会遇到数据库连接失败、SSL 证书配置错误、或者 Docker 权限问题。别怕,搜索引擎和官方文档是你最好的朋友。记住,每一次报错都是系统在跟你对话,它在告诉你哪里没配对。
现在,打开你的终端,输入 ssh your_username@your_server_ip,看着那个清爽的命令行提示符,自信地微笑吧。你已经准备好了。
