说实话,第一次在云厂商手里拿到一台裸机(Bare Metal)或者一个空荡荡的 VPS 时,那种“除了 IP 地址我一无所有”的感觉既兴奋又让人头大。以前大家习惯用 CentOS 7,结果人家突然宣布停止维护,很多人慌忙转向 Ubuntu 或者 Rocky Linux,但如果你想要那个熟悉的 yum/dnf 生态,且完全兼容 RHEL(Red Hat Enterprise Linux),AlmaLinux 其实是目前最稳妥、最被社区看好的选择之一。
这里不跟你讲那些虚头巴脑的理论,咱们直接上手。我会带你走完从“点亮屏幕”到“能跑生产业务”的全过程,并且把那些让我踩了无数次坑的配置细节掰开揉碎讲清楚。
第一阶段:认清你的战场——为什么是 AlmaLinux?
在动手之前,你得知道你在装什么。AlmaLinux OS 是一个 1:1 二进制兼容 RHEL 的发行版,由 CloudLinux 公司发起并资助,后来捐赠给了非营利组织 AlmaLinux OS Foundation。
它适合谁?
- 习惯了 CentOS/RHEL 操作逻辑的老手。
- 需要企业级稳定性,但不想掏 Red Hat 订阅费的公司。
- 运行基于 RPM 包管理的软件栈(如 Nginx, PHP-FPM, MySQL, Docker 等)。
核心优势:
- 免费开源:完全免费,没有隐藏费用。
- 长期支持:每个大版本支持生命周期长达 10 年(例如 AlmaLinux 8 支持到 2029 年)。
- 无缝迁移:如果你之前有 CentOS 7 的备份或配置脚本,迁移成本极低。
避坑指南 1:不要在生产环境使用“测试版”或“Beta”标签的版本。务必下载带有
GA(General Availability) 标记的稳定 ISO 镜像,或者在云控制台选择稳定的 Stream 版本(注意:AlmaLinux 没有 Stream 分支,只有稳定版,这点比 CentOS Stream 省心)。
第二阶段:安装篇——别只点下一步
大多数云服务商(AWS EC2, Azure VM, 阿里云 ECS, 腾讯云 CVM 等)都提供一键镜像安装。对于 AlmaLinux,通常选择 AlmaLinux 8 或 AlmaLinux 9。
1. 版本选择:选 8 还是 9?
- AlmaLinux 8:基于 RHEL 8,内核较老(5.x),但生态极其成熟,绝大多数商业软件都经过充分测试。推荐用于对稳定性要求极高的传统应用。
- AlmaLinux 9:基于 RHEL 9,内核更新(5.14+),支持更新的硬件特性,软件包更新。推荐用于新项目、容器化部署或需要最新语言支持(如 Python 3.9+, Node.js 18+)的场景。
本文以目前最主流的 AlmaLinux 8 为例进行演示,因为它的兼容性覆盖面最广。
2. 初始化配置(Cloud-Init 的关键作用)
很多新手在安装完系统后,发现 SSH 连不上,或者主机名不对。这通常是因为忽略了 Cloud-Init。
Cloud-Init 是云实例首次启动时运行的第一个程序,它负责读取云厂商提供的元数据(Metadata),完成以下任务:
- 设置 root 密码或注入 SSH 公钥。
- 配置网络接口(DHCP 或静态 IP)。
- 设置主机名(Hostname)。
- 扩展根分区大小(如果云盘大于初始镜像大小)。
手动检查与修复: 如果你通过控制台重装了系统,记得去云厂商后台确保勾选了“自动分配公网 IP”和“注入 SSH 密钥”。
# 登录服务器后,首先检查 cloud-init 状态
sudo cloud-init status --wait
# 查看当前主机名
hostnamectl
# 如果主机名不对,修改它(建议符合 FQDN 规范,如 web01.example.com)
sudo hostnamectl set-hostname web01.example.com
避坑指南 2:永远不要直接使用
root用户进行日常操作!虽然 AlmaLinux 默认开启 root SSH 登录方便,但在生产环境中这是巨大的安全隐患。我们在安装后第一步就要创建普通用户并赋予 sudo 权限。
第三阶段:安全加固——把门焊死
这是区分“玩具服务器”和“生产服务器”的分水岭。
1. 创建普通用户并配置 Sudo
# 创建新用户,例如名为 deploy
sudo useradd -m -s /bin/bash deploy
# 设置用户密码
sudo passwd deploy
# 将用户加入 wheel 组(AlmaLinux 中 wheel 组拥有 sudo 权限)
sudo usermod -aG wheel deploy
2. 禁用 Root 远程登录 & 修改 SSH 端口
编辑 SSH 配置文件 /etc/ssh/sshd_config。
sudo vi /etc/ssh/sshd_config
找到并修改以下行:
# 禁止 root 直接登录
PermitRootLogin no
# 允许密码认证改为 no(强烈建议使用密钥登录)
PasswordAuthentication no
# 修改默认端口 22 为其他端口,如 2222(降低自动化脚本扫描概率)
Port 2222
# 限制协议版本为 2
Protocol 2
保存退出后,重启 SSH 服务:
sudo systemctl restart sshd
重要提示:在断开当前连接前,务必打开一个新的终端窗口,使用新端口和新用户测试登录:
ssh -p 2222 deploy@你的服务器IP
如果新窗口能登录,再关闭旧窗口。这一步失败会导致你彻底丢失服务器控制权,所以一定要小心。
3. 配置防火墙(firewalld)
AlmaLinux 默认启用 firewalld。我们需要开放新 SSH 端口和其他必要端口(如 80, 443)。
# 启动 firewalld
sudo systemctl enable --now firewalld
# 添加新的 SSH 端口(假设我们改成了 2222)
sudo firewall-cmd --permanent --add-port=2222/tcp
# 添加 HTTP 和 HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重载配置使其生效
sudo firewall-cmd --reload
# 查看当前开放的端口和服务
sudo firewall-cmd --list-all
避坑指南 3:很多用户喜欢直接
systemctl stop firewalld来省事。这在开发环境可以,在生产环境等于裸奔。一定要学会使用firewall-cmd精细控制端口。
第四阶段:系统更新与基础优化
1. 全量更新系统
sudo dnf update -y
这会安装最新的安全补丁和内核更新。重启以应用新内核:
sudo reboot
重启后重新登录,检查内核版本:
uname -r
2. 时间同步
服务器时间不准会导致日志混乱、证书验证失败等问题。AlmaLinux 默认使用 chronyd。
sudo timedatectl set-timezone Asia/Shanghai
sudo systemctl enable --now chronyd
sudo chronyc tracking
确保 Stratum 不为 0,且 Leap status 为 Normal。
3. 禁用 SELinux(谨慎操作)
SELinux 是 RHEL 系的安全模块,能极大增强安全性,但配置极其复杂,容易导致服务启动失败。对于初学者或快速上线的项目,暂时禁用是更务实的选择;对于高阶用户,建议学习配置 SELinux 策略。
# 临时禁用(立即生效,重启失效)
sudo setenforce 0
# 永久禁用:编辑 /etc/selinux/config
sudo vi /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled
注意:如果后续安装某些严格依赖 SELinux 的服务(如某些数据库或 Web 服务器配置),可能需要重新启用。但对于大多数 LAMP/LEMP 栈,禁用 SELinux 能省去大量调试时间。
第五阶段:构建生产级软件环境
假设我们要搭建一个典型的 Web 服务器环境:Nginx + PHP-FPM + MySQL。
1. 安装 EPEL 仓库
AlmaLinux 官方仓库包含大部分基础软件,但一些流行工具(如 htop, unzip, git)可能在 EPEL (Extra Packages for Enterprise Linux) 中。
sudo dnf install epel-release -y
sudo dnf clean all
sudo dnf makecache
2. 安装 Nginx
sudo dnf install nginx -y
sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
访问 http://你的服务器IP,看到 “Welcome to nginx!” 即成功。
3. 安装 PHP 8.1 (Remi 源)
AlmaLinux 8 默认 PHP 版本较旧(7.2⁄7.4)。为了获得更好的性能和安全性,我们使用 Remi 仓库安装最新版 PHP。
# 安装 Remi 仓库
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
# 启用 PHP 8.1 模块
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.1 -y
# 安装 PHP 及相关常用扩展
sudo dnf install php php-fpm php-mysqlnd php-gd php-mbstring php-intl php-zip php-opcache -y
启动 PHP-FPM:
sudo systemctl enable --now php-fpm
4. 安装 MySQL 8.0
sudo dnf install mysql-server -y
sudo systemctl enable --now mysqld
初始化 MySQL 并设置 root 密码:
sudo mysql_secure_installation
按照提示操作:
- Validate Password Component: 选择
n(除非你有强密码合规要求)。 - Set root password: 设置一个强密码。
- Remove anonymous users:
y - Disallow root login remotely:
y(生产环境建议通过应用账户连接,而非 root) - Remove test database:
y - Reload privilege tables:
y
5. 配置 Nginx 与 PHP-FPM 协同工作
编辑 Nginx 站点配置文件:
sudo vi /etc/nginx/conf.d/default.conf
替换 server 块内容为:
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
# 处理 PHP 请求
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 防止访问隐藏文件
location ~ /\. {
deny all;
}
}
测试配置并重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx
创建一个测试文件 /usr/share/nginx/html/info.php:
<?php phpinfo(); ?>
浏览器访问 http://你的服务器IP/info.php,如果看到 PHP 信息页面,说明 LNMP 环境搭建成功。
第六阶段:监控与备份——生产环境的生命线
没有监控和备份的系统,就像没有刹车的跑车。
1. 安装系统监控 Agent
推荐使用 netdata,它轻量、实时、可视化效果好,且易于安装。
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
安装完成后,访问 http://你的服务器IP:19999 即可看到详细的 CPU、内存、磁盘、网络实时监控图表。
2. 配置自动备份脚本
虽然云厂商提供快照功能,但定期将数据备份到对象存储(如 AWS S3, 阿里云 OSS)更安全。
创建一个简单的备份脚本 /opt/backup.sh:
#!/bin/bash
# 定义变量
BACKUP_DIR="/tmp/backups"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="your_database_name"
DB_USER="db_user"
DB_PASS="db_password"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$DB_NAME.sql
# 打包网站文件
tar -czf $BACKUP_DIR/site_$DATE.tar.gz /usr/share/nginx/html/
# 上传到云存储(示例使用 rclone 或 aws cli)
# aws s3 cp $BACKUP_DIR/$DB_NAME.sql s3://your-bucket/backups/db/
# aws s3 cp $BACKUP_DIR/site_$DATE.tar.gz s3://your-bucket/backups/site/
# 清理本地旧备份(保留最近 7 天)
find $BACKUP_DIR -type f -mtime +7 -delete
赋予执行权限并添加到 crontab:
chmod +x /opt/backup.sh
sudo crontab -e
# 添加以下行,每天凌晨 2 点执行
0 2 * * * /opt/backup.sh
第七阶段:常见陷阱与终极建议
陷阱 1:磁盘空间爆满
AlmaLinux 默认日志级别较高,/var/log 可能迅速膨胀。
解决:配置 logrotate,并监控磁盘使用率。
sudo dnf install btop -y
btop
使用 btop 这个现代化的系统监控工具,一眼就能看到哪个进程占用了最多 IO 或磁盘。
陷阱 2:内核升级后重启失败
虽然少见,但有时新内核驱动不兼容导致无法启动。 解决:在 GRUB 菜单中选择旧内核启动,然后排查问题。确保每次内核升级后都进行测试重启。
陷阱 3:忘记开放防火墙端口
安装新服务(如 Redis, PostgreSQL)后,发现本地能连,外网不能连。
解决:养成习惯,每安装一个新服务,立刻检查 firewall-cmd --list-all 和 ss -tlnp。
终极建议:基础设施即代码 (IaC)
当你熟练掌握了以上步骤后,你会发现手动配置太容易出错且不可重复。此时,你应该学习使用 Ansible 或 Terraform。
例如,用 Ansible Playbook 自动化上述所有配置:
# playbook.yml
- hosts: all
become: yes
tasks:
- name: Install Nginx
dnf:
name: nginx
state: present
- name: Start and Enable Nginx
systemd:
name: nginx
state: started
enabled: yes
- name: Configure Firewall for HTTP
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
这样,无论服务器宕机多少次,你都能在几分钟内重建出一个一模一样的生产环境。
结语
从一台空白服务器到一个稳健的生产环境,中间隔着的是对细节的把控和对安全的敬畏。AlmaLinux 作为一个优秀的 RHEL 替代品,提供了强大的基础,但如何用好它,取决于你是否愿意花时间去理解每一个配置背后的意义。
不要害怕犯错,但要在错误发生前做好备份。不要追求一步到位,但要追求每一步都可追溯、可恢复。现在,打开你的终端,开始你的 AlmaLinux 之旅吧。如果在过程中遇到具体问题,记住,查看 /var/log/messages 和 journalctl -xe 往往是解决问题的第一把钥匙。
